Index
Table of Contents |
---|
POP Pop 디자인 customize 관련 자세한 사항은 POP Pop 디자인 가이드 문서에서 확인 가능합니다.
[Ad] Feed 광고 리스트 아이템 영역 Customization
Feed의 광고 리스트 아이템 뷰를 커스터마이징하고 광고 이벤트에 대한 콜백을 등록할 수 있습니다.
AdsAdapter
를 상속받는 class 를 구현합니다.onCreateViewHolder
,onBindViewHolder
를 구현해 Feed 리스트에 보여줄itemView
의 레이아웃 및 바인딩 로직을 커스터마이징합니다.CtaView의 getCtaTextView() 및 getRewardImageView() 함수를 호출하여 CtaView에 보여지는 텍스트 및 리워드 이미지에 대한 customization을 할 수 있습니다. (좀 더 유연한 customization을 위해 View를 새로 만들고 싶은 경우에는 아래 CtaView Customization 참조)
(optional)
onImpressed
,onClicked
,onRewardRequested
,onRewarded
,onParticipated
를 오버라이드하여 광고의 임프레션, 클릭, 리워드 요청, 리워드 지급 결과, 참여완료에 대한 이벤트 콜백을 받을 수 있습니다 (콜백의 정의 및 동작은 문서 참조)Code Block language java public class CustomAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> { @Override public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.bz_view_feed_ad, parent, false); return new NativeAdViewHolder(feedNativeAdView); } @Override public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) { final NativeAdView view = (NativeAdView) holder.itemView; final Ad ad = nativeAd.getAd(); final Creative.Type creativeType = ad.getCreative() == null ? null : ad.getCreative().getType(); final MediaView mediaView = view.findViewById(R.id.mediaView); final LinearLayout titleLayout = view.findViewById(R.id.titleLayout); final TextView titleView = view.findViewById(R.id.textTitle); final ImageView iconView = view.findViewById(R.id.imageIcon); final TextView descriptionView = view.findViewById(R.id.textDescription); final CtaView ctaView = view.findViewById(R.id.ctaView); ctaView.setBackgroundColor(Color.parseColor(“#3976FD”)); // (선택) 변경하려는 "색상코드" final CtaPresenter ctaPresenter = new CtaPresenter(ctaView); // CtaView should not be null ctaPresenter.bind(nativeAd); if (mediaView != null) { mediaView.setCreative(ad.getCreative()); mediaView.setVideoEventListener(new VideoEventListener() // Override and implement methods }); } if (titleView != null) { titleView.setText(ad.getTitle()); } if (iconView != null) { ImageLoader.getInstance().displayImage(ad.getIconUrl(), iconView); } if (descriptionView != null) { descriptionView.setText(ad.getDescription()); } final Collection<View> clickableViews = new ArrayList<>(); clickableViews.add(ctaView); clickableViews.add(mediaView); clickableViews.add(titleLayout); clickableViews.add(descriptionView); view.setMediaView(mediaView); view.setClickableViews(clickableViews); view.setNativeAd(nativeAd); view.addOnNativeAdEventListener(new NativeAdView.OnNativeAdEventListener() { @Override public void onImpressed(final @NonNull NativeAdView view, final @NonNull NativeAd nativeAd) { } @Override public void onClicked(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) { } @Override public void onRewardRequested(@NonNull NativeAdView view, @NonNull NativeAd nativeAd) { } @Override public void onRewarded(@NonNull NativeAdView view, @NonNull NativeAd nativeAd, @Nullable RewardResult rewardResult) { } @Override public void onParticipated(final @NonNull NativeAdView view, final @NonNull NativeAd nativeAd) { ctaPresenter.bind(nativeAd); } }); } }
FeedConfig
빌드 시점에 해당AdsAdapter
class 를 지정합니다.Code Block language java final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID") ... .adsAdapterClass(CustomAdsAdapter.class) .build();
[Ad] CTA Color 변경
여기에서는 CTA color 변경을 설명합니다. Color 변경 외에 CtaView를 Default로 제공되는 View가 아닌, 다른 모양의 View로 만들고 싶으신 경우, 아래의 ‘CtaView (버튼) Customization’ 항목을 참조해주세요.
...
Code Block | ||
---|---|---|
| ||
<resources> ... <color name="benefit_native_bg_cta_button_normal">#1290FF</color> <color name="benefit_native_bg_cta_button_pressed">#0072E1</color> <color name="benefit_native_bg_cta_button_disabled">#DDDEDF</color> </resources> |
[Ad] CtaView (버튼) Customization
CtaView를 Default로 제공되는 View가 아닌, 다른 모양의 View로 만들고 싶으신 경우 다음과 같이 설정을 진행하면 됩니다.
...
Code Block | ||
---|---|---|
| ||
if (reward > 0) { customizedCtaVIew.showRewardImage(CtaView.ImageType.Default); customizedCtaVIew.setRewardText(String.format(Locale.US, "+%d", reward)); } else { customizedCtaVIew.showRewardImage(null); customizedCtaVIew.setRewardText(null); } |
[Preview Message] CustomPreviewMessage
CustomPreviewMessage 는 6시간 간격으로 서버에 설정된 CustomPreviewConfig 를 받아와서 frequency capping 후 PreviewMessage 를 보여주는 기능입니다. 따라서 서버에 CustomPreviewConfig 설정하는 작업이 선행되어야합니다. (frequency capping 에 의해 CustomPreviewMessage 가 보여져야 할 경우 AdPreview 와 ArticlePreview 보다 우선적으로 보여집니다.)
...
그림2. PopFeedHeader 에 CustomPreviewMessage 가 표시된 모습
...
Step 1. (Optional) PopFeedHeader Customize
DefaultPopHeaderViewAdapter
를 상속받아CustomPopHeaderViewAdapter
를 만들고getCustomPreviewMessageLayout
를 오버라이드 합니다.getCustomPreviewMessageLayout
의 파라미터인CustomPreviewMessage
에 message, landingUrl, iconUrl 정보가 담겨있습니다.line 9~17
3번에서 받아온 정보를 토대로 직접 layout 을 구성하고, clickEvent 처리할 수 있습니다.line 24
FeedConfig.feedHeaderViewAdapterClass
를 통해 1번에서 생성한CustomPopHeaderViewAdapter
를 설정합니다.line 29
PopConfig.feedConfig
를 통해 5번에서 설정한 FeedConfig 를 설정합니다.
Code Block | ||
---|---|---|
| ||
public class CustomPopHeaderViewAdapter extends DefaultPopHeaderViewAdapter { @Nullable @Override protected View getCustomPreviewMessageLayout(Context context, ViewGroup parent, CustomPreviewMessage customPreviewMessage) { final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (inflater == null) { return null; } View viewCustomPreviewMessage = inflater.inflate(R.layout.view_custom_preview_message, parent, false); final TextView textCustomPreviewMessageTitle = viewCustomPreviewMessage.findViewById(R.id.textCustomPreviewMessageTitle); textCustomPreviewMessageTitle.setText(customPreviewMessage.getMessage()); viewCustomPreviewMessage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startDeeplinkActivity(context, customPreviewMessage.getLandingUrl()); } }); return viewCustomPreviewMessage; } } final FeedConfig popFeedConfig = new FeedConfig.Builder(getApplicationContext(), UNIT_ID_POP) ... .feedHeaderViewAdapterClass(CustomPopHeaderViewAdapter.class) ... .build(); final PopConfig popConfig = new PopConfig.Builder(getApplicationContext(), UNIT_ID_POP) ... .feedConfig(popFeedConfig) ... .build(); |
Step 2. (Optional) FeedConfig 사용 설정
- PopFeedHeader 에 CustomPreviewMessage 보이지 않도록 설정
PopConfig.feedConfig
설정시 FeedConfig.feedHeaderViewAdapterClass
를 설정 하지 않으면 PopFeedHeader 의 CustomPreviewMessage 를 보이지 않게 설정할 수 있습니다.
- PopFeedHeader 에 DefaultPreviewMessage 보이도록 설정
PopConfig.feedConfig
설정시 FeedConfig.feedHeaderViewAdapterClass(DefaultPopHeaderViewAdapter.class)
를 설정 하면 기본 제공하는 DefaultPreviewMessage 를 사용할 수 있습니다. (그림 2 참조)
Step 3. (Optional) Preview Interval 설정
PopConfig.previewIntervalInMillis
를 통해서 Preview interval 을 설정합니다. AdPreview, ContentPreview/CustomPreviewMessage 동일하게 interval 이 설정됩니다.
Code Block | ||
---|---|---|
| ||
final PopConfig popConfig = new PopConfig.Builder(getApplicationContext(), UNIT_ID_POP) ... .previewIntervalInMillis(1 * 60 * 60 * 1000) // 1 hour ... .build(); |
PopConfig Advanced
[Preview Message] PopAdMessageViewClass
...
광고가 있는 경우 PopAdMessageViewClass
를 이용하여 말풍선(preview)을 보여줍니다. 기본 클래스에서는 현재 적립가능한 포인트와 몇초후에 닫히는지 보여줍니다. 해당 클래스는 PopAdMessageView
를 상속받아서 작성해야 합니다. 다음 함수들을 오버라이드 할 수 있습니다.
...
Code Block | ||
---|---|---|
| ||
new PopConfig.Builder(getApplicationContext(), "POP_UNIT_ID") .popAdMessageViewClass(MyPopAdMessageView.class) |
[Preview Message] PopArticleMessageViewClass
광고가 없는 경우 PopArticleMessageViewClass
를 이용하여 말풍선(preview)을 보여줍니다. 기본 클래스에서는 로드된 첫번째 기사의 제목과 몇초후에 닫히는지를 보여줍니다. 해당 클래스는 PopArticleMessageView
를 상속받아서 작성해야 합니다. 다음 함수들을 오버라이드 할 수 있습니다.
...
Code Block | ||
---|---|---|
| ||
new PopConfig.Builder(getApplicationContext(), "POP_UNIT_ID") .popArticleMessageViewClass(MyPopArticleMessageView.class) |
[Pop Feed] PopUtilityLayoutHandlerClass
피드를 오픈했을떄 하단의 Utility화면을 커스텀할때 PopUtilityLayoutHandler
클래스를 사용합니다.
...
Code Block |
---|
new PopConfig.Builder(getApplicationContext(), "POP_UNIT_ID") .popUtilityLayoutHandlerClass(MyPopUtilityLayoutHandler.class) |
CustomProgressPopIcon Customize
1. PopIcon 을 ProgressPopIcon 으로 사용할 수 있게 합니다.
...
[Pop Feed] Pop Toolbar (AppBar) Customize
PopConfig, FeedConfig 를 사용하여 Toolbar 영역을 Customize 할 수 있습니다. PopConfig 에 FeedConfig 를 설정할 때 FeedConfig.feedToolbarHolderClass
를 설정하는데 여기에 DefaultPopToolbarHolder
를 상속받은 class 를 사용해서 Pop Toolbar customize 가능합니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig popFeedConfig = new PopConfigFeedConfig.Builder(this, unitIdPop) ... .popIconClass(CustomProgressPopIcon.class) ... .build(); |
2. CustomProgressPopIcon
에서 customize 한 후 PopConfig 에 설정합니다.
Code Block |
---|
public class CustomProgressPopIcon extends ProgressPopIcon {
public CustomProgressPopIcon(@NonNull Context context, String unitId, @Nullable PopMessageView popMessageView) {
super(context, unitId, popMessageView);
}
@Override
protected ProgressPopIconConfig getProgressPopIconConfig(@NotNull Context context) {
return new ProgressPopIconConfig.Builder()
// .popIconDefaultText("000")
.popIconProgressColorResId(android.R.color.holo_orange_light)
.popIconProgressGuideColorResId(android.R.color.holo_green_dark)
.popIconRewardIconResId(R.drawable.benefit_notiplus_icon_alarm_clock)
.popIconDefaultIconResId(R.drawable.benefit_pop_ic_default_pedometer_step)
.popIconDefaultIconTintColorResId(android.R.color.holo_blue_bright)
.popIconBackgroundColorResId(android.R.color.holo_red_light)
.popIconTextColorResId(android.R.color.black)
.build();
}
} |
ProgressPopIconConfig
...
Parameter
...
Description
...
popIconDefaultText
...
Pop Icon 에 기본으로 표시될 Text. popIconDefaultIconResId
가 설정되어있을 경우 사용하지 않아도 됩니다
...
popIconProgressColorResId
...
Pop Icon 의 Progress Color Resource Id
...
popIconProgressGuideColorResId
...
Pop Icon 의 Progress Guide Color Resource Id
...
Status | ||||
---|---|---|---|---|
|
popIconRewardIconResId
...
Progress 가 max 에 다다랐을 경우 보여주는 Reward Icon Resource Id
...
popIconDefaultIconResId
...
Pop Icon 에 기본으로 보여주는 Icon Resource Id
...
popIconDefaultIconTintColorResId
...
Pop Icon 에 기본으로 보여주는 Icon 의 Tint Color Resource Id
...
popIconBackgroundColorResId
...
Pop Icon 의 Background Color Resource Id
...
popIconTextColorResId
...
Pop Icon 의 Text Color Resource Id
Status | ||||
---|---|---|---|---|
|
3. void updateProgressPopIconParams(@NonNull ProgressPopIconParams progressPopIconParams)
함수를 호출해서 Pop Icon 의 Progress 상태를 업데이트 합니다.
Code Block |
---|
BuzzAdPop.updateProgressPopIconParams(new ProgressPopIconParams("String", int, int)); |
ProgressPopIconParams
...
Parameter
...
Description
...
text: String
...
Pop Icon 에 표시되는 Text
...
progress: Int
...
Pop Icon 에 표시되는 현재 Progress
...
maxProgress: Int
...
Pop Icon 에 표시되는 최대 Progress
Pop Toolbar (AppBar) Customize
PopConfig, FeedConfig 를 사용하여 Toolbar 영역을 Customize 할 수 있습니다. PopConfig 에 FeedConfig 를 설정할 때 FeedConfig.feedToolbarHolderClass
를 설정하는데 여기에 DefaultPopToolbarHolder
를 상속받은 class 를 사용해서 Pop Toolbar customize 가능합니다.
Code Block | ||
---|---|---|
| ||
final FeedConfig popFeedConfig = new FeedConfig.Builder(this, unitIdPop) ... /// 아래에서 소개하는 TemplatePopToolbarHolder, CustomPopToolbarHolder 등을 // 용도에 맞게 사용합니다 .feedToolbarHolderClass(DefaultPopToolbarHolder.class) ... .build(); final PopConfig popConfig = new PopConfig.Builder(this, unitIdPop) ... .feedConfig(popFeedConfig) ... .build(); |
DefaultPopToolbarHolder
DefaultPopToolbarHolder
를 바로 설정하면 간단하게 Pop Toolbar 가 설정됩니다.
...
TemplatePopToolbarHolder
DefaultPopToolbarHolder
를 상속하여 TemplatePopToolbarHolder
를 만들어 사용합니다. 그리고 기본 제공하는 PopToolbar 를 사용하여 미리 구성되어있는 PopToolbarTemplate 을 수정하여 customize 가능합니다. Toolbar 내의 Pop feed icon, title, toolbar background color 등을 변경할 수 있고 Toolbar 우측에 클릭 가능한 이미지 버튼을 추가할 수 있습니다.
...
Code Block | ||
---|---|---|
| ||
// DefaultPopToolbarHolder 상속 public class TemplatePopToolbarHolder extends DefaultPopToolbarHolder { @Override public View getView(Activity activity, @NonNull final String unitId) { toolbar = new PopToolbar(activity); // PopToolbar 에서 제공하는 기본 Template 사용 toolbar.setTitle("TemplatePopToolbarHolder"); toolbar.setIconResource(R.mipmap.ic_launcher); toolbar.setBackgroundColor(Color.LTGRAY); addInquiryMenuItemView(activity, unitId); // 문의하기 버튼은 이 함수를 통해 간단하게 추가 가능합니다. addRightMenuItemView1(activity, unitId); // custom 버튼 추가 addRightMenuItemView2(activity); return toolbar; } // custom 버튼 추가는 toolbar.buildPopMenuItemView 를 사용하여 View 를 생성하고 // toolbar.addRightMenuButton 를 사용하여 toolbar 에 추가합니다. private void addRightMenuItemView1(@NonNull final Activity activity, @NonNull final String unitId) { PopMenuImageView menuItemView = toolbar.buildPopMenuItemView(activity, R.mipmap.ic_launcher); menuItemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInquiry(activity, unitId)); } }); toolbar.addRightMenuButton(menuItemView); } private void addRightMenuItemView2(@NonNull final Activity activity) { PopMenuImageView menuItemView = toolbar.buildPopMenuItemView(activity, R.mipmap.ic_launcher); menuItemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showPotto(activity); } }); toolbar.addRightMenuButton(menuItemView); } } |
CustomizePopToolbarHolder
DefaultPopToolbarHolder
를 상속받아서 사용하는 점은 TemplatePopToolbarHolder
와 동일합니다. 차이점은 PopToolbar 를 사용하지않고 layout 을 직접 구성하여 Toolbar 영역을 전부 customize 할 수 있습니다.
...
Code Block |
---|
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" android:background="@color/bzv_white_100"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="16dp"> <ImageView android:id="@+id/imageIcon" android:layout_width="154dp" android:layout_height="24dp" android:src="@drawable/bz_img_buzzvil_logo" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical"> <ImageView android:id="@+id/buttonInquiry" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginRight="16dp" android:src="@drawable/bzv_ic_circle_question" android:tint="@color/bzv_gray_light" /> </LinearLayout> </LinearLayout> |
[Pop Feed] Custom Bottom Sheet
PopContentActivity 내에서 사용가능한 Custom Bottom Sheet 입니다. 일반적으로 PopUtilityLayoutHandler 를 Customize 하여 호출합니다.
BottomSheet 호출 코드 (CustomPopUtilityLayoutHandler 사용)
Utility 버튼을 눌렀을 때 아래 코드를 호출하면 BottomSheet 이 열립니다.
...
1. line 1~6: bottomsheet 에서 사용할 view 와 동작을 지정할 수 있습니다.
Code Block |
---|
val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val dialogView = inflater.inflate(R.layout.view_fragment_pop_bottom_sheet, null) val textBottomSheet: TextView = dialogView.findViewById(R.id.textBottomSheet) textBottomSheet.setOnClickListener { Toast.makeText(context, "text bottom sheet clicked", Toast.LENGTH_SHORT).show() } val dialog = BottomSheetDialog(context) dialog.setContentView(dialogView) dialog.show() |
(Optional) PopContentActivity 에 Theme을 적용하여 BottomSheet 좌우측 상단 모서리 둥글게 만들기
기본적으로 제공되는 BottomSheet은 흰색 사각형 모양인데, 좌우측 상단을 둥글게 사용하기 위해서는 다음과 같이 설정하면 됩니다.
...
1. 좌우측 상단 모서리가 둥근 drawable 을 준비합니다.
rounded_dialog.xml
Code Block |
---|
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/white"/> <corners android:topLeftRadius="16dp" android:topRightRadius="16dp"/> </shape> |
2. PopContentActivity 를 위한 theme(BuzzvilSamplePopContentActivityTheme) 을 준비합니다.
styles.xml
BottomSheet 에서 위에서 설정한 좌우측이 둥근 background 를 사용할 수 있도록 설정합니다.
Code Block |
---|
<style name="BuzzvilSamplePopContentActivityTheme" parent="Theme.Buzzvil.PopContentActivity"> <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item> </style> <style name="AppBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> <item name="bottomSheetStyle">@style/AppModalStyle</item> </style> <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal"> <item name="android:background">@drawable/rounded_dialog</item> </style> |
3. BuzzvilSamplePopContentActivityTheme 을 PopContentActivity 에 적용합니다.
AndroidManifest.xml
를 통해 PopContentActivity
에 위에서 선언한 BuzzvilSamplePopContentActivityTheme
스타일을 사용하도록 설정합니다.
Code Block |
---|
<activity android:name="com.buzzvil.buzzad.benefit.pop.PopContentActivity" tools:replace="android:theme" android:theme="@style/BuzzvilSamplePopContentActivityTheme"/> |
[Pop Feed] Custom In-app-landing
유틸리티 영역이나 툴바 영역에 버튼을 추가한 경우, 버튼을 클릭했을때 유저를 새로운 activity로 랜딩시키거나 fragment로 랜딩시킬 수 있습니다. (fragment를 이용하는 경우, 보다 자연스러운 UX를 만들 수 있습니다.)
...
PopNavigator: pop의 navigation을 담당하는 클래스
CustomInAppLandingInfo: 랜딩하게 될 fragment의 내용에 대한 정보를 가지고 있는 클래스
fragment: 랜딩되는 화면의 컨텐츠를 담당하는 fragment 객체를 넘겨줍니다.
titleResId: 랜딩되는 화면의 타이틀의 resource id를 넘겨줍니다.
예시 코드
Code Block | ||
---|---|---|
| ||
new PopNavigator().launchCustomFragment( context, new CustomInAppLandingInfo( new ExampleFragment(), R.stirng.example_title ) ) |
원하는 fragment 를 instantiate하여 (ExampleFragment
) CustomInAppLandingInfo
에 넘겨서 화면에 표시하는 코드입니다.
[Pop Feed] Custom Feedback (Snackbar, Toast)
...
팝 지면에서 보여주는 다양한 피드백을 customize 할 수 있습니다. 오른쪽의 이미지는 피드 오픈 리워드 피드백을 customize 했을 때 보여주는 커스텀 피드백입니다.
...
Expand | |||||
---|---|---|---|---|---|
| |||||
|
PopFeedbackHandler Interface
Code Block | ||
---|---|---|
| ||
interface PopFeedbackHandler { fun notifyFeedLaunchReward(context: Context, view: View, canUseSnackbar: Boolean, reward: Int) fun notifyNativeAdReward(context: Context, view: View, canUseSnackbar: Boolean, reward: Int) fun notifyPottoDrawOneMore(context: Context, view: View, canUseSnackbar: Boolean) fun notifyPottoStatus(context: Context, view: View, canUseSnackbar: Boolean) } |
...