Skip to content

Commit e397821

Browse files
committed
GoogleMobileAds fixes
1 parent 264d75e commit e397821

3 files changed

Lines changed: 85 additions & 51 deletions

File tree

android/src/main/java/com/getcapacitor/community/admob/AdMob.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.getcapacitor.community.admob;
22

33
import android.Manifest;
4+
import android.app.Activity;
5+
import android.os.Handler;
6+
import android.os.Looper;
47
import com.getcapacitor.JSArray;
58
import com.getcapacitor.JSObject;
69
import com.getcapacitor.Plugin;
@@ -69,7 +72,7 @@ public class AdMob extends Plugin {
6972

7073
@PluginMethod
7174
public void loadAppOpen(final PluginCall call) {
72-
appOpenAdPlugin.loadAppOpen(getContext(), call, this::notifyListeners);
75+
appOpenAdPlugin.loadAppOpen(getContext(), getActivity(), call, this::notifyListeners);
7376
}
7477

7578
@PluginMethod
@@ -79,7 +82,7 @@ public void showAppOpen(final PluginCall call) {
7982

8083
@PluginMethod
8184
public void isAppOpenLoaded(final PluginCall call) {
82-
appOpenAdPlugin.isAppOpenLoaded(call);
85+
appOpenAdPlugin.isAppOpenLoaded(getActivity(), call);
8386
}
8487

8588
// ---------------------------------------------------------
@@ -90,18 +93,27 @@ public void isAppOpenLoaded(final PluginCall call) {
9093
public void initialize(final PluginCall call) {
9194
this.setRequestConfiguration(call);
9295

93-
try {
94-
MobileAds.initialize(
95-
getContext(),
96-
new OnInitializationCompleteListener() {
97-
@Override
98-
public void onInitializationComplete(InitializationStatus initializationStatus) {}
99-
}
100-
);
101-
bannerExecutor.initialize();
102-
call.resolve();
103-
} catch (Exception ex) {
104-
call.reject(ex.getLocalizedMessage(), ex);
96+
// Same as banner/interstitial: bridge thread is not the UI thread — MobileAds + view setup must run on main.
97+
Runnable initOnMain = () -> {
98+
try {
99+
MobileAds.initialize(
100+
getContext(),
101+
new OnInitializationCompleteListener() {
102+
@Override
103+
public void onInitializationComplete(InitializationStatus initializationStatus) {}
104+
}
105+
);
106+
bannerExecutor.initialize();
107+
call.resolve();
108+
} catch (Exception ex) {
109+
call.reject(ex.getLocalizedMessage(), ex);
110+
}
111+
};
112+
Activity activity = getActivity();
113+
if (activity != null) {
114+
activity.runOnUiThread(initOnMain);
115+
} else {
116+
new Handler(Looper.getMainLooper()).post(initOnMain);
105117
}
106118
}
107119

android/src/main/java/com/getcapacitor/community/admob/appopen/AppOpenAdManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ public AppOpenAdManager(String adUnitId) {
1919
this.adUnitId = adUnitId;
2020
}
2121

22+
public String getAdUnitId() {
23+
return adUnitId;
24+
}
25+
2226
public void loadAd(Context context, final Runnable onLoaded, final Runnable onFailed) {
2327
if (appOpenAd != null) {
2428
if (onLoaded != null) {

android/src/main/java/com/getcapacitor/community/admob/appopen/AppOpenAdPlugin.java

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.app.Activity;
44
import android.content.Context;
5+
import android.os.Handler;
6+
import android.os.Looper;
57
import com.getcapacitor.JSObject;
68
import com.getcapacitor.PluginCall;
79

@@ -13,7 +15,15 @@ public interface EventNotifier {
1315

1416
private AppOpenAdManager appOpenAdManager;
1517

16-
public void loadAppOpen(Context context, PluginCall call, EventNotifier notifier) {
18+
private static void runOnMain(Activity activity, Runnable runnable) {
19+
if (activity != null) {
20+
activity.runOnUiThread(runnable);
21+
} else {
22+
new Handler(Looper.getMainLooper()).post(runnable);
23+
}
24+
}
25+
26+
public void loadAppOpen(Context context, Activity activity, PluginCall call, EventNotifier notifier) {
1727
if (context == null) {
1828
call.reject("Context is not available");
1929
return;
@@ -24,21 +34,25 @@ public void loadAppOpen(Context context, PluginCall call, EventNotifier notifier
2434
call.reject("adUnitId is required");
2535
return;
2636
}
27-
if (appOpenAdManager == null) {
28-
appOpenAdManager = new AppOpenAdManager(adUnitId);
29-
}
3037

31-
appOpenAdManager.loadAd(
32-
context,
33-
() -> {
34-
notifier.notify("appOpenAdLoaded", new JSObject());
35-
call.resolve();
36-
},
37-
() -> {
38-
notifier.notify("appOpenAdFailedToLoad", new JSObject());
39-
call.reject("Failed to load App Open Ad");
38+
final Context appContext = context.getApplicationContext();
39+
runOnMain(activity, () -> {
40+
if (appOpenAdManager == null || !adUnitId.equals(appOpenAdManager.getAdUnitId())) {
41+
appOpenAdManager = new AppOpenAdManager(adUnitId);
4042
}
41-
);
43+
44+
appOpenAdManager.loadAd(
45+
appContext,
46+
() -> {
47+
notifier.notify("appOpenAdLoaded", new JSObject());
48+
call.resolve();
49+
},
50+
() -> {
51+
notifier.notify("appOpenAdFailedToLoad", new JSObject());
52+
call.reject("Failed to load App Open Ad");
53+
}
54+
);
55+
});
4256
}
4357

4458
public void showAppOpen(Activity activity, PluginCall call, EventNotifier notifier) {
@@ -47,31 +61,35 @@ public void showAppOpen(Activity activity, PluginCall call, EventNotifier notifi
4761
return;
4862
}
4963

50-
if (appOpenAdManager == null || !appOpenAdManager.isAdLoaded()) {
51-
call.reject("App Open Ad is not loaded");
52-
return;
53-
}
54-
55-
appOpenAdManager.showAdIfAvailable(
56-
activity,
57-
() -> {
58-
notifier.notify("appOpenAdOpened", new JSObject());
59-
},
60-
() -> {
61-
notifier.notify("appOpenAdClosed", new JSObject());
62-
call.resolve();
63-
},
64-
() -> {
65-
notifier.notify("appOpenAdFailedToShow", new JSObject());
66-
call.reject("Failed to show App Open Ad");
64+
activity.runOnUiThread(() -> {
65+
if (appOpenAdManager == null || !appOpenAdManager.isAdLoaded()) {
66+
call.reject("App Open Ad is not loaded");
67+
return;
6768
}
68-
);
69+
70+
appOpenAdManager.showAdIfAvailable(
71+
activity,
72+
() -> {
73+
notifier.notify("appOpenAdOpened", new JSObject());
74+
},
75+
() -> {
76+
notifier.notify("appOpenAdClosed", new JSObject());
77+
call.resolve();
78+
},
79+
() -> {
80+
notifier.notify("appOpenAdFailedToShow", new JSObject());
81+
call.reject("Failed to show App Open Ad");
82+
}
83+
);
84+
});
6985
}
7086

71-
public void isAppOpenLoaded(PluginCall call) {
72-
boolean loaded = appOpenAdManager != null && appOpenAdManager.isAdLoaded();
73-
JSObject result = new JSObject();
74-
result.put("value", loaded);
75-
call.resolve(result);
87+
public void isAppOpenLoaded(Activity activity, PluginCall call) {
88+
runOnMain(activity, () -> {
89+
boolean loaded = appOpenAdManager != null && appOpenAdManager.isAdLoaded();
90+
JSObject result = new JSObject();
91+
result.put("value", loaded);
92+
call.resolve(result);
93+
});
7694
}
7795
}

0 commit comments

Comments
 (0)