diff --git a/ads/src/main/java/com/javinator9889/handwashingreminder/ads/AdLoaderImpl.kt b/ads/src/main/java/com/javinator9889/handwashingreminder/ads/AdLoaderImpl.kt index 46db7d0..6a34dea 100644 --- a/ads/src/main/java/com/javinator9889/handwashingreminder/ads/AdLoaderImpl.kt +++ b/ads/src/main/java/com/javinator9889/handwashingreminder/ads/AdLoaderImpl.kt @@ -33,7 +33,6 @@ import com.google.android.gms.ads.* import com.google.android.gms.ads.formats.NativeAdOptions import com.google.android.gms.ads.formats.UnifiedNativeAd import com.google.android.gms.ads.formats.UnifiedNativeAdView -import com.google.android.play.core.splitcompat.SplitCompat import com.javinator9889.handwashingreminder.gms.ads.AdLoader import com.javinator9889.handwashingreminder.utils.isConnected import com.javinator9889.handwashingreminder.utils.isDebuggable @@ -62,8 +61,7 @@ class AdLoaderImpl private constructor(context: Context?) : AdLoader { "the first instance" ) moduleContext = context - SplitCompat.install(moduleContext) - MobileAds.initialize(moduleContext) + MobileAds.initialize(moduleContext.applicationContext) val videoOptions = VideoOptions.Builder() .setStartMuted(true) .build() @@ -79,7 +77,7 @@ class AdLoaderImpl private constructor(context: Context?) : AdLoader { override fun instance(context: Context?): AdLoader { instance.get()?.let { return it } synchronized(this) { - val instance = AdLoaderImpl(context?.applicationContext) + val instance = AdLoaderImpl(context) this.instance = WeakReference(instance) return instance } @@ -87,31 +85,34 @@ class AdLoaderImpl private constructor(context: Context?) : AdLoader { } @SuppressLint("InflateParams") - override fun loadAdForViewGroup(view: ViewGroup, removeAllViews: Boolean) { + override fun loadAdForViewGroup(view: ViewGroup, removeAllViews: Boolean) = runCatching { if (!isVideoEnded || !isConnected()) - return + throw IllegalStateException("Phone is not connected or the video didn't finished") val adLoader = AdBase.Builder(moduleContext, ADMOB_APP_NATIVE_ID) .forUnifiedNativeAd { ad: UnifiedNativeAd -> - val adView = LayoutInflater.from(moduleContext) - .inflate(R.layout.native_ad_view, null) as CardView - populateUnifiedNativeAdView(ad, adView) - if (removeAllViews) - view.removeAllViews() - view.addView(adView) + try { + val adView = LayoutInflater.from(moduleContext) + .inflate(R.layout.native_ad_view, null) as CardView + populateUnifiedNativeAdView(ad, adView) + if (removeAllViews) + view.removeAllViews() + view.addView(adView) + } catch (e: Throwable) { + Timber.w(e, "Cannot load ad in view") + } } .withNativeAdOptions(adOptions) .withAdListener(object : AdListener() { override fun onAdFailedToLoad(errorCode: Int) { when (errorCode) { AdRequest.ERROR_CODE_INVALID_REQUEST, - AdRequest.ERROR_CODE_NO_FILL -> - Timber.e("Error while loading the ad: $errorCode") + AdRequest.ERROR_CODE_NO_FILL -> throw IllegalAccessError(errorCode.toString()) else -> return } } }).build() adLoader.loadAd(AdRequest.Builder().build()) - } + }.exceptionOrNull() override fun destroy() { currentNativeAd?.destroy() diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/activities/LauncherActivity.kt b/app/src/main/java/com/javinator9889/handwashingreminder/activities/LauncherActivity.kt index 3c878e2..53e3202 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/activities/LauncherActivity.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/activities/LauncherActivity.kt @@ -81,14 +81,14 @@ class LauncherActivity : AppCompatActivity() { } whenStarted { progressBar.show() - val welcomeScreenDeferred = showWelcomeScreenAsync() + val welcomeScreenJob = showWelcomeScreenAsync() deferreds.add(installRequiredModulesAsync()) activityIntentDeferred.await().run { - Timber.d("Activity Init is now completed!") + Timber.d("Activity Init is now completed! - $this") if (launchFromNotification) flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - welcomeScreenDeferred.join() + welcomeScreenJob.join() startActivity(this) overridePendingTransition(0, android.R.anim.fade_out) finish() @@ -153,9 +153,8 @@ class LauncherActivity : AppCompatActivity() { Activity.RESULT_OK -> { createPackageContext(packageName, 0).also { SplitCompat.install(it) - }.also { - initAds(it) } + initAds() } Activity.RESULT_CANCELED -> app.adLoader = null } @@ -237,14 +236,17 @@ class LauncherActivity : AppCompatActivity() { splitInstallManager.installedModules } - private fun initAds(context: Context) { - val className = "${Ads.PACKAGE_NAME}.${Ads - .CLASS_NAME}\$${Ads.PROVIDER_NAME}" - val adProvider = Class.forName(className).kotlin - .objectInstance as AdLoader.Provider - app.adLoader = adProvider.instance(app) - val adsEnabler = AdsEnabler(app) - adsEnabler.enableAds() + private fun initAds(context: Context = app) { + if (Ads.MODULE_NAME in splitInstallManager.installedModules && + sharedPreferences.getBoolean(ADS_ENABLED, true)) { + val className = "${Ads.PACKAGE_NAME}.${Ads + .CLASS_NAME}\$${Ads.PROVIDER_NAME}" + val adProvider = Class.forName(className).kotlin + .objectInstance as AdLoader.Provider + app.adLoader = adProvider.instance(context) + val adsEnabler = AdsEnabler(app) + adsEnabler.enableAds() + } } private fun createDynamicFeatureActivityIntent( @@ -283,6 +285,8 @@ class LauncherActivity : AppCompatActivity() { with(AlarmHandler(this)) { scheduleAllAlarms() } + Timber.d("Initializing Ads Provider") + initAds() Timber.d("Adding periodic notifications if not enqueued yet") Timber.d("Setting-up Firebase custom properties") setupFirebasePropertiesAsync().join() diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/diseases/adapter/Ads.kt b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/diseases/adapter/Ads.kt index 5849a81..6417eca 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/diseases/adapter/Ads.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/diseases/adapter/Ads.kt @@ -25,6 +25,7 @@ import com.javinator9889.handwashingreminder.application.HandwashingApplication import com.javinator9889.handwashingreminder.utils.notNull import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.items.AbstractItem +import timber.log.Timber class Ads : AbstractItem() { override val layoutRes: Int = R.layout.simple_frame_view @@ -38,7 +39,9 @@ class Ads : AbstractItem() { override fun bindView(item: Ads, payloads: List) { ads.notNull { - it.loadAdForViewGroup(container, false) + it.loadAdForViewGroup(container, false)?.let { e -> + Timber.w(e, "Ads cannot be loaded") + } } } diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdLoader.kt b/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdLoader.kt index 8ef3b82..4752493 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdLoader.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdLoader.kt @@ -28,5 +28,5 @@ interface AdLoader { fun destroy() - fun loadAdForViewGroup(view: ViewGroup, removeAllViews: Boolean = true) + fun loadAdForViewGroup(view: ViewGroup, removeAllViews: Boolean = true): Throwable? } \ No newline at end of file diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdsEnabler.kt b/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdsEnabler.kt index dc2f780..4f031b5 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdsEnabler.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/gms/ads/AdsEnabler.kt @@ -26,7 +26,7 @@ import com.javinator9889.handwashingreminder.application.HandwashingApplication const val PACKAGE_NAME = "com.google.android.gms.ads" const val CLASS_NAME = "MobileAdsInitProvider" -class AdsEnabler(private val app: HandwashingApplication) { +class AdsEnabler(app: HandwashingApplication) { private val packageManager = app.packageManager private val componentName = ComponentName(app, "${PACKAGE_NAME}.${CLASS_NAME}")