// 광고 리스너 구현private val popupAdListener = object : AdropPopupAdListener { // 광고 수신 성공 (필수) override fun onAdReceived(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 수신 완료") // 광고가 준비되면 표시 showPopupAd() } // 광고 수신 실패 (필수) override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) { Log.d("Adrop", "팝업 광고 수신 실패: $errorCode") } // 광고 노출 (선택) override fun onAdImpression(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 노출") } // 광고 클릭 (선택) override fun onAdClicked(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 클릭") } // 팝업 광고가 표시되기 직전 (선택) override fun onAdWillPresentFullScreen(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 표시 직전") } // 팝업 광고가 표시된 직후 (선택) override fun onAdDidPresentFullScreen(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 표시 완료") } // 팝업 광고가 닫히기 직전 (선택) override fun onAdWillDismissFullScreen(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 닫히기 직전") } // 팝업 광고가 닫힌 직후 (선택) override fun onAdDidDismissFullScreen(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 닫힘") // 다음 광고를 미리 로드 loadPopupAd() } // 팝업 광고 표시 실패 (선택) override fun onAdFailedToShowFullScreen(ad: AdropPopupAd, errorCode: AdropErrorCode) { Log.d("Adrop", "팝업 광고 표시 실패: $errorCode") }}// 닫기 리스너 구현private val popupCloseListener = object : AdropPopupAdCloseListener { // 닫기 버튼 클릭 (선택) override fun onClosed(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 닫기 버튼 클릭") } // 딤(배경) 클릭 (선택) override fun onDimClicked(ad: AdropPopupAd) { Log.d("Adrop", "팝업 광고 딤 영역 클릭") } // "오늘 하루 보지 않기" 클릭 (선택) override fun onTodayOffClicked(ad: AdropPopupAd) { Log.d("Adrop", "오늘 하루 보지 않기 선택") // 오늘 날짜를 저장하여 다음 표시를 제어 val prefs = getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE) prefs.edit().putLong("last_popup_hidden_date", System.currentTimeMillis()).apply() }}
class PopupAdManager(private val context: Context) { private val prefs = context.getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE) private val todayOffKey = "popup_ad_today_off_date" private var popupAd: AdropPopupAd? = null // 오늘 광고를 표시할 수 있는지 확인 fun canShowAdToday(): Boolean { val lastHiddenDate = prefs.getLong(todayOffKey, 0L) if (lastHiddenDate == 0L) return true val calendar = Calendar.getInstance() calendar.timeInMillis = lastHiddenDate val hiddenDay = calendar.get(Calendar.DAY_OF_YEAR) val hiddenYear = calendar.get(Calendar.YEAR) calendar.timeInMillis = System.currentTimeMillis() val currentDay = calendar.get(Calendar.DAY_OF_YEAR) val currentYear = calendar.get(Calendar.YEAR) // 저장된 날짜가 오늘이 아니면 표시 가능 return hiddenDay != currentDay || hiddenYear != currentYear } // 광고 로드 및 표시 fun loadAndShowAd(activity: Activity, unitId: String) { if (!canShowAdToday()) { Log.d("Adrop", "오늘은 광고를 표시하지 않습니다") return } popupAd?.destroy() popupAd = AdropPopupAd(activity, unitId) popupAd?.popupAdListener = popupAdListener popupAd?.closeListener = popupCloseListener popupAd?.load() } private val popupAdListener = object : AdropPopupAdListener { override fun onAdReceived(ad: AdropPopupAd) { // 광고 수신 후 자동 표시 if (context is Activity) { ad.show(context) } } override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) { Log.d("Adrop", "광고 수신 실패: $errorCode") } } private val popupCloseListener = object : AdropPopupAdCloseListener { override fun onTodayOffClicked(ad: AdropPopupAd) { // 오늘 날짜를 저장 prefs.edit().putLong(todayOffKey, System.currentTimeMillis()).apply() Log.d("Adrop", "오늘 하루 팝업 광고를 표시하지 않습니다") } } fun destroy() { popupAd?.destroy() popupAd = null }}
class MainActivity : AppCompatActivity() { private lateinit var popupAdManager: PopupAdManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) popupAdManager = PopupAdManager(this) // 앱 시작 시 팝업 광고 표시 popupAdManager.loadAndShowAd(this, "YOUR_POPUP_UNIT_ID") } override fun onDestroy() { super.onDestroy() popupAdManager.destroy() }}
// ✅ 좋은 예: 앱 시작 시override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loadAndShowPopupAd()}// ✅ 좋은 예: 콘텐츠 로드 완료 시fun onContentLoaded() { if (shouldShowPopupAd()) { showPopupAd() }}// ✅ 좋은 예: 특정 이벤트 완료 시fun onAchievementUnlocked() { showPopupAd()}// ❌ 나쁜 예: 사용자가 작업 중일 때fun onUserTyping() { showPopupAd() // 사용자 경험 저해}
class PopupAdFrequencyManager(private val context: Context) { private val prefs = context.getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE) private val lastShownKey = "popup_ad_last_shown" private val minimumInterval = 3600000L // 1시간 (밀리초) fun canShowAd(): Boolean { // 오늘 하루 보지 않기 확인 if (!canShowAdToday()) { return false } // 최소 시간 간격 확인 val lastShown = prefs.getLong(lastShownKey, 0L) if (lastShown == 0L) return true val currentTime = System.currentTimeMillis() return currentTime - lastShown >= minimumInterval } fun recordAdShown() { prefs.edit().putLong(lastShownKey, System.currentTimeMillis()).apply() } private fun canShowAdToday(): Boolean { // 위의 "오늘 하루 보지 않기" 구현 참고 return true }}
// 테스트 환경과 프로덕션 환경 분리val popupUnitId = if (BuildConfig.DEBUG) { "PUBLIC_TEST_UNIT_ID_POPUP_BOTTOM"} else { "YOUR_PRODUCTION_UNIT_ID"}popupAd = AdropPopupAd(this, popupUnitId)