Skip to content
:docs

UI configuration

Global theme

You can customize the theme of the Buzzvil SDK's default UI, including colors and icon images for ad placements and CTAs.

Primary color

Change the primary color of key SDK UI elements across all placements, including dialog buttons and bottom sheet confirmation buttons.

Add color resources as shown below to change the primary color.

XML

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="your_primary_color">#FF0000</color>
    <color name="your_primary_light_color">#99FF0000</color>

    <color name="buzzvil_benefit_hub_brand_primary">@color/your_primary_color</color>
    <color name="buzzvil_benefit_hub_brand_primary_light">@color/your_primary_light_color</color>
</resources>

Reward icon

Customize icons in SDK UI elements such as CTA buttons, Pop buttons and the profile input banner.

The following example adds rewardIcon to BuzzAdTheme to change the reward icon. The table lists the UI controlled by each property.

PropertyConfigurable UI
rewardIcon
  • All placements: CTA reward icon.
  • BenefitHub: Pop opt-in button icon.
participatedIcon
  • All placements: CTA view.
Kotlin
import com.buzzvil.buzzad.benefit.BuzzAdBenefitConfig
import com.buzzvil.buzzad.benefit.presentation.BuzzAdTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에  GlobalTheme을 설정합니다.
        val buzzAdTheme = BuzzAdTheme()
            .rewardIcon(R.drawable.your_reward_icon)
            .participatedIcon(R.drawable.your_participated_icon)
        BuzzAdTheme.setGlobalTheme(buzzAdTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Implement a custom CTA button

Implement custom CTA buttons instead of the default UI. You can use them in BenefitHub and Native.

Follow these steps to implement your own CTA button.

  1. Implement the view layout (view_customized_cta.xml). The following example implements a view layout as a layout resource.

    XML
    
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark">
            
        <TextView
            android:id="@+id/textCta"/>
            
        
        <ImageView
            android:id="@+id/imageReward"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:src="아이콘 이미지 리소스"/>
    
        
        <TextView
            android:id="@+id/textReward"/>
    </LinearLayout>
    
  2. Create CustomCtaView, a subclass of CtaView.

  3. In your subclass of CtaView, use inflate to load the CTA view layout.

  4. Implement the CTA button's icon, text, and reward value in the following override methods, which are called according to the user's ad participation state.

  • renderViewParticipatingState: The user is participating in an ad (for example, has entered an action-based ad's landing page).

  • renderViewParticipatedState: The user has completed ad participation.

  • renderViewRewardAvailableState: The user has not yet participated in the ad.

  • renderViewRewardNotAvailableState: The ad offers no reward to the user.

    Kotlin
    import com.buzzvil.buzzad.benefit.presentation.theme.CtaView
    
    class CustomCtaView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
        CtaView(context, attrs, defStyleAttr) {
        private val rewardImageView: ImageView
        private val rewardTextView: TextView
        private val ctaTextView: TextView
    
        constructor(context: Context) : this(
            context,
            null
        )
    
        constructor(context: Context, attrs: AttributeSet?) : this(
            context,
            attrs,
            0
        )
    
        init {
            inflate(getContext(), R.layout.custom_cta_view, this)
            rewardImageView = findViewById(R.id.imageReward)
            rewardTextView = findViewById(R.id.textReward)
            ctaTextView = findViewById(R.id.textCta)
        }
    
        private fun setRewardIcon(@DrawableRes iconResId: Int) {
            rewardImageView.setImageResource(iconResId)
            rewardImageView.visibility = View.VISIBLE
        }
    
        private fun hideRewardIcon() {
            rewardImageView.visibility = View.GONE
        }
    
        private fun setCtaText(ctaText: String) {
            ctaTextView.text = ctaText
        }
    
        private fun setRewardText(rewardText: String) {
            rewardTextView.text = rewardText
        }
    
        override fun renderViewParticipatingState(callToAction: String) {
            setCtaText("참여 확인 중")
            hideRewardIcon()
            setRewardText("")
        }
    
        override fun renderViewParticipatedState(callToAction: String) {
            setRewardIcon(R.drawable.custom_participated_icon)
            setRewardText("")
            setCtaText("참여 완료")
        }
    
        override fun renderViewRewardAvailableState(callToAction: String, reward: Int) {
            setRewardIcon(R.drawable.custom_reward_icon)
            setRewardText(String.format(Locale.US, "+%,d", reward))
            setCtaText(callToAction)
        }
    
        override fun renderViewRewardNotAvailableState(callToAction: String) {
            hideRewardIcon()
            setRewardText("")
            setCtaText(callToAction)
        }
    }
    

Apply the custom CTA button to GlobalTheme

Add customCtaView to BuzzAdTheme to apply your custom CTA button.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.BuzzAdTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 GlobalTheme을 설정합니다.
        val buzzAdTheme = BuzzAdTheme()
            .ctaViewClass(CustomCtaView::class.java)
        BuzzAdTheme.setGlobalTheme(buzzAdTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Native

Native overlay UI

Configure overlay images and text in Buzzvil Dash Admin.

Follow these steps to configure Native Overlay UI.

  1. Open Buzzvil Dash Admin (https://dashboard.buzzvil.com/).
  2. Find and select your app in Inventory Manager, then open Entry Point Contents in the left menu.
  3. Select “Native Overlay” from the Entry point type dropdown.
  4. Enable Customization for each overlay type.
  5. Add your images and UI strings.
    • Preview changes in real time.
    • Unconfigured overlays use Buzzvil's default UI.
  • Supported image and UI text specifications:
    • Image formats: PNG, JPG, JSON (Lottie)
    • File size: Up to 2 MB - Image ratio: 312 × 212, width × height.
    • UI text: Up to 20 characters, including spaces, across two lines
  1. Click Save in the upper-right corner.

Native overlay area

To change where the native overlay appears, set its display area using nativeOverlayViewLayout() on NativeAd2ViewBinder as shown below.

Kotlin
import com.buzzvil.buzzad.benefit.nativead2.api.NativeAd2ViewBinder

nativeAd2ViewBinder = NativeAd2ViewBinder.Builder()
    .nativeAd2View(nativeAd2View)
    ...
    .nativeOverlayViewLayout(yourCustomNativeAdLayout)
    .build(Constant.YOUR_NATIVE_ID)

BenefitHub

This section explains how to change the design of the UI provided by the Buzzvil SDK.

Lucky Box

Customize Lucky Box strings and images without an SDK patch. Send the settings and content you want to change to help@buzzvil.com.

ItemDescription
Promotion name
  • Title at the top of Lucky Box details.
  • Maximum 15 characters, including spaces.
  • Default meaning: “Today's gift box.”
Entry point before and after participation
  • Icon and text shown in BenefitHub.
  • Default meanings: “Today's gift box” before participation; “See you tomorrow!” afterward.
Participation progress icons
  • Icons for days 1–5: not started, completed, recovery and streak bonus.
  • 24 × 24, width × height.
  • PNG, JPG or JSON (Lottie).
  • Maximum 2 MB.
Lucky Box CTA before and after participation
  • The CTA users tap to participate.
  • Default meanings: “Open your gift box” before participation; “Completed! See you tomorrow” afterward.
Images before and after participation
  • Image above the Lucky Box CTA.
  • 100 × 100, width × height.
  • PNG, JPG or JSON (Lottie).
  • Maximum 2 MB.
Additional reward banner
  • A CPC-only banner below the Lucky Box banner after participation.
  • 24 × 24, width × height.
  • PNG, JPG or JSON (Lottie).
  • Maximum 2 MB.
  • Default text meaning: “Tap for a bonus.”
Daily reward amount
  • Lucky Box reward granted once per day.
  • Default: 1.
Streak reward amount
  • Additional reward granted on day five after five consecutive days of participation.
  • Default: 2.
Streak completion text
  • Text announcing the streak reward.
  • Default meaning: “You completed the streak!”
Streak completion text color
  • Color of the streak completion text.
  • Format: hex.
  • Default: FFFFFF.
Streak completion icon
  • Icon announcing the streak reward.
  • 80 × 80, width × height.
  • PNG, JPG or JSON (Lottie).
  • Maximum 2 MB.
Streak completion effects
  • Effect image surrounding the streak completion icon.
  • 375 × 375, width × height.
  • PNG, JPG or JSON (Lottie).
  • Maximum 2 MB.
Notices
  • Information and disclaimers about Lucky Box operation and reward policies.
  • You can edit the reward amount guidance.

Mission Pack

Customize MissionPack strings and images without an SDK patch. Send the settings and content you want to change to help@buzzvil.com.

ItemDetailDescription
BenefitHub entry pointTitle
  • See the BenefitHub entry point image showing the title and icon.
BenefitHub entry pointIcon
  • See the BenefitHub entry point image showing the title and icon.
BackgroundColor
  • Apply element colors to BuzzBenefitTheme through primaryColor.
BackgroundGradient
  • Apply background colors to BuzzBenefitTheme using missionPackGradientColors and missionPackGradientColorPositions. See “Configure the MissionPack background gradient.”
Promotion titleText-
Mission bonusReward percentage
  • Grants n% of the rewards from completed missions as a bonus.
  • Fractional bonus amounts are rounded to the nearest integer.
Mission bonus CTAText-
Mission in progressTitle-
Mission in progressIcon
  • Supports PNG, JPG and JSON (Lottie).
Mission in progressDescription
  • See the “UI and mission settings” image.
  • The bonus percentage follows the configured reward percentage.
Mission in progressIn-progress CTA
  • Maximum 6 characters.
Mission in progressCompletion CTA
  • Maximum 6 characters.
Completed participationTitle-
Mission configurationMission title-
Mission configurationCriteria
  • revenue type: CPI, CPE, CPQ, CPQLITE, CPCQUIZ, CPYoutube, CPInsta, CPK, CPTiktok, CPL, CPYLike, CPNstore.
  • ad type (Hub filters): click, action, social media, content, shopping and video rewards.
  • event type + resource type: event features such as Lucky Box.
Mission configurationProgress per mission
  • Number of ads in the mission.
Lucky Box entry pointCTA
  • Maximum 6 characters.
Notices-
  • The default text automatically uses the configured mission bonus percentage.
Performance tracking unit-
  • Records completed ads from MissionPack's mission feed, including revenue and cost in Inventory Manager Analytics.
  • Determines the mission feed's unit settings.
    • With an existing Hub: its Unit ID is applied automatically.
    • Without an existing Hub, or when operating as SIS: a new Unit ID is required.
  • ✅  Important
    Each MissionPack can have only one performance tracking unit.
Participation credit unit-
  • A unit whose ad participation counts toward MissionPack missions.
  • ✅  Important
    Each MissionPack can have one or more participation credit units.

Configure the MissionPack background gradient

Kotlin
import com.buzzvil.buzzad.benefit.BuzzAdBenefitConfig
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 GlobalTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme.getDefaultFeedTheme()
            .missionPackGradientColors(intArrayOf(0xAF568DE8.toInt(), 0xAFF4FFB3.toInt()))
            .missionPackGradientColorPositions(floatArrayOf(0.0f, 1.0f))
        BuzzAdFeed.setDefaultTheme(buzzAdTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Navigation bar

You can change the text in BenefitHub's navigation bar or implement your own navigation bar.

Change navigation bar text

You can change navigation bar UI strings.

XML

<resources>
    <string name="your_custom_title">원하는 타이틀 입력</string>
</resources>
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme

val buzzAdFeedTheme = BuzzAdFeedTheme.getDefault()
    .navigationBarTitle(R.string.your_custom_title)
BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

Implement a custom navigation bar

See Integrate BenefitHub as a fragment to implement your own navigation bar.

Profile input banner

You can change the profile input banner icon.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .profileBannerIcon(R.drawable.your_profile_banner_icon)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Header

Use BenefitHub's header for your own content, such as an explanation of the placement or the available reward amount.

The following example changes the header.

Create a class implementing FeedHeaderViewAdapter and add your custom view (your_feed_header_layout) to the header. Register the class in the feedHeaderViewAdapterClass() property of FeedConfig.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.header.FeedHeaderViewAdapter

class CustomFeedHeaderViewAdapter: FeedHeaderViewAdapter {
    override fun onCreateView(context: Context, parent: ViewGroup): View {
        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        return inflater.inflate(R.layout.feed_header_layout, parent, false)
    }
    
    override fun onBindView(view: View, reward: Int) {
        val rewardTextView: TextView = view.findViewById(R.id.textReward)
        rewardTextView.text = reward.toString()
    }

    override fun onDestroyView() {
        // Use this callback for clearing memory
    }
}
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.FeedConfig

val feedConfig = FeedConfig.Builder("YOUR_FEED_UNIT_ID")
        .feedHeaderViewAdapterClass(CustomFeedHeaderViewAdapteri::class.java)
        .build();

Ad category filters

Ad category filters use monochrome colors by default. You can change them to follow the primary color.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.BuzzAdTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 GlobalTheme을 설정합니다.
        val buzzAdTheme = BuzzAdTheme()
            .usePrimaryColorInFilter(true) // true: primary color, false: monocrhome
        BuzzAdTheme.setGlobalTheme(buzzAdTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Ad design

Buzzvil SDK provides standard ads and shopping ads.

  • Standard ads: All ad types other than shopping ads.
  • Shopping ads: Users receive a percentage of their purchase amount as points after buying through the ad.

Both types contain multiple elements for displaying the ad. Their components and UI requirements are listed below.

ComponentStandardShoppingDescription
Ad creativeRequiredRequired
  • The ad image, video or other creative. Preserve its aspect ratio.
  • Display it using com.buzzvil.buzzad.benefit.presentation.media.MediaView.
  • Size: 1,200 × 627 px.
  • You may add padding. Contact your Buzzvil representative for details.
Ad titleRequiredOptionalThe ad title. A maximum of 10 characters is recommended. You may truncate part of the text with an ellipsis as needed, regardless of length.
Ad descriptionRequiredOptionalA detailed ad description. A maximum of 40 characters is recommended. You may truncate part of the text with an ellipsis as needed, regardless of length.
Advertiser iconRequiredOptional
  • The advertiser's icon image. Preserve its aspect ratio.
  • Size: 80 × 80 px.
CTA buttonRequiredRequired
  • A button encouraging ad participation. A maximum of 7 characters is recommended. You may truncate part of the text with an ellipsis as needed, regardless of length.
  • Display it using com.buzzvil.buzzad.benefit.presentation.media.DefaultCtaView.

  • ✏️  Note
    See Implement a custom CTA button to change the design.
Ad disclosureRecommendedRecommendedText identifying the content as advertising, such as 광고, ad, 스폰서 or Sponsored.
OriginalPrice View-RecommendedDisplays the original product price.
Price View-RequiredDisplays the discounted product price.
DiscountRate View-RecommendedDisplays the discount rate. Calculate it from the original and discounted prices.

Implement a custom ad design

Follow these steps to customize the ad design.

  1. Implement a layout (your_benefit_hub_ad.xml) that meets the requirements of the ad NativeAdView.

    XML
    
    
    <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
        android:id="@+id/nativeAdView" ...>
        
        
        
        <LinearLayout ... >
           
            
            <com.buzzvil.buzzad.benefit.presentation.media.MediaView
                android:id="@+id/mediaView" ... />
    
            
            <LinearLayout android:id="@+id/excpsLayout" ... >
                <androidx.appcompat.widget.AppCompatImageView android:id="@+id/adIconImage" ... />
    
                <TextView android:id="@+id/adTitleText" ... />
    
                <TextView android:id="@+id/adDescriptionText" ... />
            </LinearLayout>
    
            
            <LinearLayout android:id="@+id/cpsLayout" ...>
                <TextView android:id="@+id/discountPercentageText" ... />
    
                <TextView android:id="@+id/priceText" ... />
    
                <TextView android:id="@+id/originalPriceText" ... />
            </LinearLayout>
    
        
        <com.buzzvil.buzzad.benefit.presentation.media.DefaultCtaView
            android:id="@+id/ctaView" ... />
       
        </LinearLayout>
        
    </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView>
    
  2. Implement a subclass of BenefitHubAdViewAdapter.

    • In onCreateView(), use your_benefit_hub_ad.xml to create the view.
  • In onBindView(), use NativeAdViewBinder to bind ad data (NativeAd) to the NativeAdView you created. - onBindView() must return NativeAdView.

    • Release listeners and views in onDestroyView().
  • Optionally receive ad callbacks through NativeAdEventListener.

    Kotlin
    import com.buzzvil.buzzad.benefit.core.models.Product
    import com.buzzvil.buzzad.benefit.feed.benefithub.list.adapter.BenefitHubAdViewAdapter
    import com.buzzvil.buzzad.benefit.presentation.nativead.NativeAd
    import com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdEventListener
    import com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
    import com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdViewBinder
    import com.buzzvil.buzzad.benefit.presentation.reward.RewardResult
    
    class CustomBenefitHubAdViewAdapter : BenefitHubAdViewAdapter {
        private lateinit var binding: YourBenefitHubAdBinding
        private var nativeAd: NativeAd? = null
        private var nativeAdViewBinder: NativeAdViewBinder? = null
    
        // 리스너 구현은 선택 사항입니다.
        private val listener = object : NativeAdEventListener {
            override fun onImpressed(nativeAd: NativeAd) {}
            override fun onClicked(nativeAd: NativeAd) {}
            override fun onRewardRequested(nativeAd: NativeAd) {}
            override fun onRewarded(nativeAd: NativeAd, nativeAdRewardResult: RewardResult?) {}
            override fun onParticipated(nativeAd: NativeAd) {}
        }
    
        override fun onCreateView(context: Context, parent: ViewGroup): View {
            val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
            binding = YourBenefitHubAdBinding.inflate(inflater, parent, false)
            return binding.root
        }
    
        override fun getNativeAdView(): NativeAdView {
            return binding.nativeAdView
        }
    
        override fun onBindView(nativeAd: NativeAd) {
            val builder = NativeAdViewBinder.Builder(binding.root, binding.adMediaView)
                .ctaView(binding.adCtaView)
                .iconImageView(binding.adIconImage)
                .titleTextView(binding.adTitleText)
                .descriptionTextView(binding.adDescriptionText)
                .addClickableView(binding.yourClickableArea) // (Optional) 클릭 가능한 영역을 추가합니다.
    
            if (nativeAd.shoppingProduct == null) {
                // 일반 광고 (CPS 외)
                binding.excpsLayout.visibility = View.VISIBLE
                binding.cpsLayout.visibility = View.GONE
            } else {
                // 쇼핑 광고 (CPS)
                binding.excpsLayout.visibility = View.GONE
                binding.cpsLayout.visibility = View.VISIBLE
    
                setCpsView(nativeAd.shoppingProduct!!)
            }
    
            val nativeAdViewBinder = builder.build()
            nativeAdViewBinder.bind(nativeAd)
    
            nativeAd.addNativeAdEventListener(listener)
    
            this.nativeAd = nativeAd
            this.nativeAdViewBinder = nativeAdViewBinder
        }
    
        override fun onDestroyView() {
            nativeAd?.removeNativeAdEventListener(listener)
            nativeAdViewBinder?.unbind()
    
            nativeAd = null
            nativeAdViewBinder = null
        }
    
        private fun setCpsView(product: Product) {
            val discountedPrice = product.discountedPrice
            if (discountedPrice != null) {
                // 할인이 있는 쇼핑 광고
                binding.originalPriceText.paintFlags = binding.originalPriceText.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
                var percentage = 0
                if (product.price > discountedPrice) {
                    percentage = ((product.price - discountedPrice) / product.price * 100).roundToInt()
                }
                if (percentage > 0) {
                    binding.priceText.text = getCommaSeparatedPrice(discountedPrice.toLong())
                    binding.originalPriceText.text = getCommaSeparatedPrice(product.price.toLong())
                    binding.discountPercentageText.text = String.format(Locale.ROOT, "%d%%", percentage)
                    binding.discountPercentageText.visibility = View.VISIBLE
                } else {
                    binding.priceText.text = getCommaSeparatedPrice(product.price.toLong())
                    binding.originalPriceText.text = ""
                    binding.discountPercentageText.visibility = View.GONE
                }
            } else {
                // 할인이 없는 쇼핑 광고
                binding.priceText.text = getCommaSeparatedPrice(product.price.toLong())
                binding.originalPriceText.text = ""
                binding.discountPercentageText.visibility = View.GONE
            }
        }
    
        private fun getCommaSeparatedPrice(price: Long): String {
            val contextForResource = binding.root.context
            return String.format(
                Locale.getDefault(),
                contextForResource.getString(R.string.custom_cps_price_unit),
                price
            )
        }
    }
    
    XML
    
    <resources>
        <string name="custom_cps_price_unit">%,d원</string>
    </resources>
    
  1. Set your CustomBenefitHubAdViewAdapter as the ad adapter class in FeedConfig.

    Kotlin
    import com.buzzvil.buzzad.benefit.presentation.feed.FeedConfig
    
    val feedConfig = FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID")
            .benefitHubAdViewAdapterClass(CustomBenefitHubAdViewAdapter::class.java)
            .build()
    

No-ads UI

Users can retry up to three times when no ads are available. Customize the UI strings and images for each attempt.

Retry attemptTitleContentButton
Initial attempt미션을 준비 중이에요다시 미션을 불러와서 포인트를 모아보시겠어요?미션 불러오기
First retry미션을 준비 중이에요미션을 로딩 중이에요. 잠시 후 다시 시도해주세요.다시 불러오기
Second retry미션을 준비 중이에요미션 준비에 시간이 걸리고 있습니다. 잠시 후 다시 시도해주세요.한번 더 불러오기
Third retry (last)미션을 준비 중이에요All filter: 지금은 참여 가능한 미션이 없습니다. 잠시 후 다시 방문해주세요.
Other filters: 지금은 참여 가능한 미션이 없습니다. 다른 미션에 참여해서 포인트를 모아보세요!
All filter: 나중에 다시 올게요
Other filters: 다른 미션 참여하기
XML

<string name="your_no_fill_error_title">미션을 준비 중이에요</string>

<string name="your_no_fill_error_description_1st">다시 미션을 불러와서 포인트를 모아보시겠어요?</string>
<string name="your_no_fill_error_description_2nd">미션을 로딩 중이에요. 잠시 후 다시 시도해주세요.</string>
<string name="your_no_fill_error_description_3rd">미션 준비에 시간이 걸리고 있습니다. 잠시 후 다시 시도해주세요.</string>
<string name="your_no_fill_error_description_final_all_filter">지금은 참여 가능한 미션이 없습니다. 잠시 후 다시 방문해주세요.</string>
<string name="your_no_fill_error_description_final_other_filters">다른 미션 참여하기</string>

<string name="your_no_fill_error_button_1st">미션 불러오기</string>
<string name="your_no_fill_error_button_2nd">다시 불러오기</string>
<string name="your_no_fill_error_button_3rd">한번 더 불러오기</string>
<string name="your_no_fill_error_button_final_all_filter">나중에 다시 올게요</string>
<string name="your_no_fill_error_button_final_other_filters">지금은 참여 가능한 미션이 없습니다. 다른 미션에 참여해서 포인트를 모아보세요!</string>
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .noFillErrorImage(R.drawable.your_no_fill_error_image)
            .noFillErrorTitle(R.string.your_no_fill_error_title)
            .noFillErrorDescription1st(R.string.your_no_fill_error_description_1st)
            .noFillErrorDescription2nd(R.string.your_no_fill_error_description_2nd)
            .noFillErrorDescription3rd(R.string.your_no_fill_error_description_3rd)
            .noFillErrorDescriptionFinalAllFilter(R.string.your_no_fill_error_description_final_all_filter)
            .noFillErrorDescriptionFinalOtherFilters(R.string.your_no_fill_error_description_final_other_filters)
            .noFillErrorButton1st(R.string.your_no_fill_error_button_1st)
            .noFillErrorButton2nd(R.string.your_no_fill_error_button_2nd)
            .noFillErrorButton3rd(R.string.your_no_fill_error_button_3rd)
            .noFillErrorButtonFinalAllFilter(R.string.your_no_fill_error_button_final_all_filter)
            .noFillErrorButtonFinalOtherFilters(R.string.your_no_fill_error_button_final_other_filters)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

User profile error UI

Customize the strings and images shown when no user profile is set.

XML

<string name="your_user_profile_error_title">미션을 준비 중이에요</string>
<string name="your_user_profile_error_description">잠시 후 다시 시도해주세요.</string>
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .userProfileErrorImage(R.drawable.your_user_profile_error_image)
            .userProfileErrorTitle(R.string.your_user_profile_error_title)
            .userProfileErrorDescription(R.string.your_user_profile_error_description)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Server error UI

Customize the strings and images shown on the server error screen.

XML

<string name="your_server_error_title">미션을 준비 중이에요</string>
<string name="your_server_error_description">잠시 후 다시 시도해주세요.</string>
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .serverErrorImage(R.drawable.your_server_error_image)
            .serverErrorTitle(R.string.your_user_profile_error_title)
            .serverErrorDescription(R.string.your_server_error_description)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Other error screens

Customize the image for each error screen.

PropertyDescription
privacyPolicyErrorIconChanges the image shown when third-party sharing consent is required.
agePolicyErrorIconChanges the image shown for a network error.
networkErrorIconChanges the image shown for a network error.
unknownErrorIconChanges the image shown for an unknown error.
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .privacyPolicyErrorImage(R.drawable.your_privacy_policy_error_image)
            .agePolicyErrorImage(R.drawable.your_age_policy_error_image)
            .networkErrorImage(R.drawable.your_nework_error_image)
            .unknownErrorImage(R.drawable.your_unknown_error_image)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Prompt to add Pop

If Pop is integrated, customize the image in the modal that encourages users to enable it.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeed
import com.buzzvil.buzzad.benefit.presentation.feed.BuzzAdFeedTheme
import com.buzzvil.sdk.BuzzvilSdk

class App : Application() {
    override fun onCreate() {
        super.onCreate()

        val buzzAdBenefitConfig = ...

        // BuzzvilSdk.initialize()를 호출하기 전에 FeedTheme을 설정합니다.
        val buzzAdFeedTheme = BuzzAdFeedTheme()
            .popModalImage(R.drawable.your_pop_modal_image)
        BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme)

        // Buzzvil SDK 초기화
        BuzzvilSdk.initialize(...)
    }
}

Implement a custom UI for consent to share personal information with third parties

If you implement your own UI for consent to share personal information with third parties, you must pass the user's consent status to the SDK. Refer to the table below and call the appropriate function.

ClassAPIDescription
BuzzAdBenefitgetPrivacyPolicyManager() (static method)Returns a PrivacyPolicyManager instance.
PrivacyPolicyManagergrantConsent()Grants consent to collect personal information. Call this before the user's first Feed visit to skip the third-party sharing consent UI.
revokeConsent()Revokes consent to collect personal information. The consent UI reappears when the user next enters Feed.
isConsentGranted()Checks whether consent to collect personal information has been granted.

Usage example

Kotlin
import com.buzzvil.buzzad.benefit.BuzzAdBenefit

val privacyPolicyManager = BuzzAdBenefit.getPrivacyPolicyManager()

// 직접 구현한 개인정보 제3자 제공 동의 UI에서 동의를 받았을 경우 아래 코드를 실행하면, 피드 화면에서 개인정보 제3자 제공 동의 UI가 노출되지 않으면서 광고 할당이 정상적으로 진행 됩니다.
// 아래의 코드를 실행하지 않을 경우 피드 진입 시 개인정보 제3자 제공 동의 UI가 노출되기 때문에 필수적으로 실행이 필요합니다.
privacyPolicyManager.grantConsent()

// 아래 코드를 통해서 수집 동의를 철회할 수 있습니다. 이 코드가 실행되면 피드에서 광고 할당이 이루어지지 않습니다.
privacyPolicyManager.revokeConsent()

Change the initial filter when BenefitHub opens

Open BenefitHub with a selected filter other than 전체.

Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.FeedConfig

// Feed(베네핏허브) 설정
val feedConfig = FeedConfig.Builder("YOUR_FEED_UNIT_ID")
    .initialSelectedFilterName("쇼핑적립")
    .build()

Change the initial page when BenefitHub opens

Open BenefitHub directly to a specific page.

  • Available pages:
    • Lucky Box (LuckyBox).
Kotlin
import com.buzzvil.buzzad.benefit.presentation.feed.FeedConfig

// Feed(베네핏허브) 설정
val feedConfig = FeedConfig.Builder("YOUR_FEED_UNIT_ID")
    .initialNavigationPage(FeedInitialNavigationPage.LUCKYBOX)
    .build()

Interstitial

Use GlobalTheme to change the primary color, updating the BenefitHub entry prompt, CTA background and reward icon together. See Global theme.