diff --git a/android/src/main/java/com/rnadmob/admob/ActivityAwareJavaModule.java b/android/src/main/java/com/rnadmob/admob/ActivityAwareJavaModule.java new file mode 100644 index 0000000..f1a010c --- /dev/null +++ b/android/src/main/java/com/rnadmob/admob/ActivityAwareJavaModule.java @@ -0,0 +1,76 @@ +package com.rnadmob.admob; + +import android.app.Activity; +import android.app.Application; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.facebook.react.bridge.LifecycleEventListener; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; + +public abstract class ActivityAwareJavaModule extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks, LifecycleEventListener { + + @Nullable + private Application application; + + @Nullable + protected Activity currentActivity; + + public ActivityAwareJavaModule(ReactApplicationContext reactContext) { + super(reactContext); + reactContext.addLifecycleEventListener(this); + } + + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} + + @Override + public void onActivityStarted(@NonNull Activity activity) { + currentActivity = activity; + } + + @Override + public void onActivityResumed(@NonNull Activity activity) { + currentActivity = activity; + } + + @Override + public void onActivityStopped(Activity activity) {} + + @Override + public void onActivityPaused(Activity activity) {} + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {} + + @Override + public void onActivityDestroyed(@NonNull Activity activity) { + if (activity.equals(currentActivity)) { + currentActivity = null; + } + } + + @Override + public void onHostResume() { + if (application == null) { + currentActivity = getCurrentActivity(); + if (currentActivity != null) { + application = currentActivity.getApplication(); + application.registerActivityLifecycleCallbacks(this); + } + } + } + + @Override + public void onHostPause() {} + + @Override + public void onHostDestroy() { + if (application != null) { + application.unregisterActivityLifecycleCallbacks(this); + } + } +} diff --git a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobAppOpenAdModule.java b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobAppOpenAdModule.java index 38d2eb6..038a103 100644 --- a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobAppOpenAdModule.java +++ b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobAppOpenAdModule.java @@ -2,7 +2,6 @@ import static com.rnadmob.admob.RNAdMobEventModule.AD_FAILED_TO_PRESENT; -import android.app.Activity; import android.os.Handler; import androidx.annotation.NonNull; @@ -97,7 +96,7 @@ public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { } @Override - protected void show(AppOpenAd ad, Activity activity, int requestId) { + protected void show(AppOpenAd ad, int requestId) { if (isAdExpired()) { presentPromiseHolder.reject(requestId, "E_AD_NOT_READY", "Ad is expired."); WritableMap error = Arguments.createMap(); @@ -106,7 +105,7 @@ protected void show(AppOpenAd ad, Activity activity, int requestId) { requestAd(requestId, unitId, options, null); return; } - ad.show(activity); + ad.show(currentActivity); } private boolean isAdExpired() { diff --git a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobFullScreenAdModule.java b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobFullScreenAdModule.java index 57c4c23..5f5aded 100644 --- a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobFullScreenAdModule.java +++ b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobFullScreenAdModule.java @@ -6,15 +6,12 @@ import static com.rnadmob.admob.RNAdMobEventModule.AD_LOADED; import static com.rnadmob.admob.RNAdMobEventModule.AD_PRESENTED; -import android.app.Activity; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.google.android.gms.ads.AdError; @@ -22,6 +19,7 @@ import com.google.android.gms.ads.FullScreenContentCallback; import com.google.android.gms.ads.LoadAdError; import com.google.android.gms.ads.admanager.AdManagerAdRequest; +import com.rnadmob.admob.ActivityAwareJavaModule; import com.rnadmob.admob.RNAdMobAdHolder; import com.rnadmob.admob.RNAdMobCommon; import com.rnadmob.admob.RNAdMobEventModule; @@ -30,7 +28,7 @@ import java.util.Locale; import java.util.Objects; -public abstract class RNAdMobFullScreenAdModule extends ReactContextBaseJavaModule { +public abstract class RNAdMobFullScreenAdModule extends ActivityAwareJavaModule { RNAdMobAdHolder adHolder = new RNAdMobAdHolder<>(); RNAdMobPromiseHolder presentPromiseHolder = new RNAdMobPromiseHolder(); @@ -56,7 +54,7 @@ public void onCatalystInstanceDestroy() { protected abstract void load(String unitId, AdManagerAdRequest adRequest, AdLoadCallback adLoadCallback, FullScreenContentCallback fullScreenContentCallback); - protected abstract void show(T ad, Activity activity, int requestId); + protected abstract void show(T ad, int requestId); protected void sendEvent(String eventName, int requestId, @Nullable WritableMap data) { RNAdMobEventModule.sendEvent(eventName, getAdType(), requestId, data); @@ -158,13 +156,12 @@ public void onAdShowedFullScreenContent() { } protected void requestAd(int requestId, String unitId, ReadableMap options, final Promise promise) { - Activity activity = getCurrentActivity(promise); - if (activity == null) { + if (currentActivity == null) { return; } adHolder.remove(requestId); - activity.runOnUiThread(() -> { + currentActivity.runOnUiThread(() -> { AdManagerAdRequest adRequest = RNAdMobCommon.buildAdRequest(Objects.requireNonNull(options.getMap("requestOptions"))); AdLoadCallback adLoadCallback = getAdLoadCallback(requestId, options, promise); FullScreenContentCallback fullScreenContentCallback = getFullScreenContentCallback(requestId, unitId, options); @@ -173,16 +170,15 @@ protected void requestAd(int requestId, String unitId, ReadableMap options, fina } protected void presentAd(int requestId, final Promise promise) { - Activity activity = getCurrentActivity(promise); - if (activity == null) { + if (currentActivity == null) { return; } - activity.runOnUiThread(() -> { + currentActivity.runOnUiThread(() -> { T ad = adHolder.get(requestId); if (ad != null) { presentPromiseHolder.add(requestId, promise); - show(ad, activity, requestId); + show(ad, requestId); } else { if (promise != null) { promise.reject("E_AD_NOT_READY", "Ad is not ready."); diff --git a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobInterstitialAdModule.java b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobInterstitialAdModule.java index 5e057db..5cc9631 100644 --- a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobInterstitialAdModule.java +++ b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobInterstitialAdModule.java @@ -64,8 +64,8 @@ public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { } @Override - protected void show(InterstitialAd ad, Activity activity, int requestId) { - ad.show(activity); + protected void show(InterstitialAd ad, int requestId) { + ad.show(currentActivity); } } diff --git a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedAdModule.java b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedAdModule.java index e4f514a..59067a9 100644 --- a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedAdModule.java +++ b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedAdModule.java @@ -68,8 +68,8 @@ public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { } @Override - protected void show(RewardedAd ad, Activity activity, int requestId) { - ad.show(activity, rewardItem -> { + protected void show(RewardedAd ad, int requestId) { + ad.show(currentActivity, rewardItem -> { WritableMap reward = Arguments.createMap(); reward.putInt("amount", rewardItem.getAmount()); reward.putString("type", rewardItem.getType()); diff --git a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedInterstitialAdModule.java b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedInterstitialAdModule.java index 2f50e06..837abaa 100644 --- a/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedInterstitialAdModule.java +++ b/android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedInterstitialAdModule.java @@ -68,8 +68,8 @@ public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { } @Override - protected void show(RewardedInterstitialAd ad, Activity activity, int requestId) { - ad.show(activity, rewardItem -> { + protected void show(RewardedInterstitialAd ad, int requestId) { + ad.show(currentActivity, rewardItem -> { WritableMap reward = Arguments.createMap(); reward.putInt("amount", rewardItem.getAmount()); reward.putString("type", rewardItem.getType());