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()
}