From 4cb2c7212f9194063f0249aba808701e666f47fd Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 5 Apr 2022 14:50:34 +0200 Subject: [PATCH] Prototype ad implementation --- Habitica/AndroidManifest.xml | 3 + Habitica/build.gradle | 1 + Habitica/res/values/strings.xml | 1 + .../android/habitica/helpers/AdHandler.kt | 119 ++++++++++++++++++ .../habitica/ui/activities/MainActivity.kt | 11 ++ 5 files changed, 135 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index d453c944a..2a946b5e5 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -30,6 +30,9 @@ + Compact Minimal + Watch Ad diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt new file mode 100644 index 000000000..0074a8d6d --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AdHandler.kt @@ -0,0 +1,119 @@ +package com.habitrpg.android.habitica.helpers + +import android.app.Activity +import android.content.Context +import android.util.Log +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.FullScreenContentCallback +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.MobileAds +import com.google.android.gms.ads.OnUserEarnedRewardListener +import com.google.android.gms.ads.rewarded.RewardItem +import com.google.android.gms.ads.rewarded.RewardedAd +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback + + +class AdHandler(var activity: Activity, var rewardAction: (Boolean) -> Unit): OnUserEarnedRewardListener { + private var rewardedAd: RewardedAd? = null + + companion object { + private enum class AdStatus { + UNINITIALIZED, + INITIALIZING, + READY, + DISABLED + } + + const val TAG = "AdHandler" + const val adUnitID = "ca-app-pub-3940256099942544/5224354917" + + private var currentAdStatus = AdStatus.UNINITIALIZED + + fun initialize(context: Context, onComplete: () -> Unit) { + if (currentAdStatus != AdStatus.UNINITIALIZED) return + currentAdStatus = AdStatus.INITIALIZING + MobileAds.initialize(context) { + currentAdStatus = AdStatus.READY + onComplete() + } + } + + fun whenAdsInitialized(context: Context, onComplete: () -> Unit) { + when (currentAdStatus) { + AdStatus.READY -> { + onComplete() + } + AdStatus.DISABLED -> { + return + } + AdStatus.UNINITIALIZED -> { + initialize(context) { + onComplete() + } + } + AdStatus.INITIALIZING -> { + return + } + } + } + } + + fun prepare() { + whenAdsInitialized(activity) { + val adRequest = AdRequest.Builder().build() + + RewardedAd.load(activity, adUnitID, adRequest, object : RewardedAdLoadCallback() { + override fun onAdFailedToLoad(adError: LoadAdError) { + rewardAction(false) + } + + override fun onAdLoaded(rewardedAd: RewardedAd) { + this@AdHandler.rewardedAd = rewardedAd + configureReward() + } + }) + } + } + + fun show() { + when (currentAdStatus) { + AdStatus.READY -> { + showRewardedAd() + } + AdStatus.DISABLED -> { + rewardAction(false) + return + } + AdStatus.UNINITIALIZED -> { + initialize(activity) { + showRewardedAd() + } + } + AdStatus.INITIALIZING -> { + return + } + } + } + + private fun configureReward() { + rewardedAd?.run { + fullScreenContentCallback = object : FullScreenContentCallback() { + } + } + } + + private fun showRewardedAd() { + if (rewardedAd != null) { + rewardedAd?.show(activity, this) + } else { + Log.d(TAG, "The rewarded ad wasn't ready yet.") + } + } + + override fun onUserEarnedReward(rewardItem: RewardItem) { + val rewardAmount = rewardItem.amount + val rewardType = rewardItem.type + Log.d(TAG, "User earned the reward. ${rewardAmount}, ${rewardType}") + rewardAction(true) + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 18b328682..795b85c08 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -9,6 +9,7 @@ import android.content.pm.PackageManager import android.content.res.Configuration import android.os.Build import android.os.Bundle +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import android.view.View @@ -35,6 +36,7 @@ import com.habitrpg.android.habitica.extensions.hideKeyboard import com.habitrpg.android.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.extensions.updateStatusBarColor +import com.habitrpg.android.habitica.helpers.AdHandler import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.MainNavigationController @@ -445,6 +447,11 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } if (this.faintDialog == null && !this.isFinishing) { + val handler = AdHandler(this) { + Log.d("AdHandler", "Reviving user") + compositeSubscription.add(userRepository.updateUser("stats.hp", 50).subscribe({}, RxErrorHandler.handleEmptyError())) + } + handler.prepare() val binding = DialogFaintBinding.inflate(this.layoutInflater) binding.hpBar.setLightBackground(true) binding.hpBar.setIcon(HabiticaIconsHelper.imageOfHeartLightBg()) @@ -457,6 +464,10 @@ open class MainActivity : BaseActivity(), SnackbarActivity { faintDialog = null userRepository.revive().subscribe({ }, RxErrorHandler.handleEmptyError()) } + faintDialog?.addButton(R.string.watch_ad, true) { _, _ -> + faintDialog = null + handler.show() + } soundManager.loadAndPlayAudio(SoundManager.SoundDeath) this.faintDialog?.enqueue() }