Skip to content

Commit 53bbcd7

Browse files
yarivgdidiclaude
andcommitted
fix: address reviewer feedback - demo app and screenshots
- Fix initialization to properly chain promises (wait for AdMob.initialize before calling other methods), preventing demo app crash - Move App Open Ad from app.component to home page with load/show buttons, matching the pattern of other ad types (interstitial, reward) - Add App Open Ad section to demo UI with event listeners - Add App Open screenshots (iOS + Android) to README - Fix AppOpenAdPluginEvents.kt: use const val instead of override val to fix Java interop (private access error) - Use Google test ad ID for App Open (ca-app-pub-3940256099942544/5575463023) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e3a0b3e commit 53bbcd7

9 files changed

Lines changed: 106 additions & 61 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ Made with [contributors-img](https://contrib.rocks).
3636

3737
### Screenshots
3838

39-
| | Banner | Interstitial | Reward |
40-
| :---------- | :----------------------------------: | :----------------------------------------: | :----------------------------------: |
41-
| **iOS** | ![](demo/screenshots/ios_banner.png) | ![](demo/screenshots/ios_interstitial.png) | ![](demo/screenshots/ios_reward.png) |
42-
| **Android** | ![](demo/screenshots/md_banner.png) | ![](demo/screenshots/md_interstitial.png) | ![](demo/screenshots/md_reward.png) |
39+
| | Banner | Interstitial | Reward | App Open |
40+
| :---------- | :----------------------------------: | :----------------------------------------: | :----------------------------------: | :---------------------------------: |
41+
| **iOS** | ![](demo/screenshots/ios_banner.png) | ![](demo/screenshots/ios_interstitial.png) | ![](demo/screenshots/ios_reward.png) | ![](demo/screenshots/ios_open.png) |
42+
| **Android** | ![](demo/screenshots/md_banner.png) | ![](demo/screenshots/md_interstitial.png) | ![](demo/screenshots/md_reward.png) | ![](demo/screenshots/md_open.png) |
4343

4444
## Installation
4545

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ public void showAppOpen(Activity activity, PluginCall call, EventNotifier notifi
7373
appOpenAdManager.showAdIfAvailable(
7474
activity,
7575
() -> {
76-
notifier.notify(AppOpenAdPluginEvents.Showed, new JSObject());
76+
notifier.notify(AppOpenAdPluginEvents.Opened, new JSObject());
7777
},
7878
() -> {
79-
notifier.notify(AppOpenAdPluginEvents.Dismissed, new JSObject());
79+
notifier.notify(AppOpenAdPluginEvents.Closed, new JSObject());
8080
call.resolve();
8181
},
8282
(adError) -> {
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.getcapacitor.community.admob.appopen
22

3-
import com.getcapacitor.community.admob.models.LoadPluginEventNames
4-
5-
object AppOpenAdPluginEvents : LoadPluginEventNames {
3+
object AppOpenAdPluginEvents {
64
const val Loaded = "appOpenAdLoaded"
75
const val FailedToLoad = "appOpenAdFailedToLoad"
86
const val Opened = "appOpenAdOpened"
9-
override val Showed = "appOpenAdOpened"
10-
override val FailedToShow = "appOpenAdFailedToShow"
11-
override val Dismissed = "appOpenAdClosed"
7+
const val Closed = "appOpenAdClosed"
8+
const val FailedToShow = "appOpenAdFailedToShow"
129
}

demo/angular/src/app/app.component.ts

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Component } from '@angular/core';
22

33
import { IonApp, IonRouterOutlet, Platform } from '@ionic/angular/standalone';
44

5-
import { AdMob, AppOpenAdPluginEvents, AppOpenAdOptions } from '@capacitor-community/admob';
5+
import { AdMob } from '@capacitor-community/admob';
66

77
@Component({
88
selector: 'app-root',
@@ -17,53 +17,26 @@ export class AppComponent {
1717
}
1818

1919
initializeApp() {
20-
this.platform.ready().then(() => {
21-
/**
22-
* initialize() require after platform.ready();
23-
*/
24-
AdMob.initialize({
25-
testingDevices: ['2077ef9a63d2b398840261c8221a0c9b'],
26-
initializeForTesting: true,
20+
this.platform
21+
.ready()
22+
.then(() => {
23+
/**
24+
* initialize() require after platform.ready();
25+
*/
26+
return AdMob.initialize({
27+
testingDevices: ['2077ef9a63d2b398840261c8221a0c9b'],
28+
initializeForTesting: true,
29+
});
30+
})
31+
.then(() => {
32+
return AdMob.setApplicationMuted({
33+
muted: false,
34+
});
35+
})
36+
.then(() => {
37+
return AdMob.setApplicationVolume({
38+
volume: 0.5,
39+
});
2740
});
28-
29-
AdMob.setApplicationMuted({
30-
muted: false,
31-
});
32-
33-
AdMob.setApplicationVolume({
34-
volume: 0.5,
35-
});
36-
37-
// example of App Open Ad
38-
this.showAppOpenAd();
39-
});
40-
}
41-
42-
async showAppOpenAd() {
43-
// Listen to events
44-
AdMob.addListener(AppOpenAdPluginEvents.Loaded, () => {
45-
console.log('App Open Ad loaded');
46-
});
47-
AdMob.addListener(AppOpenAdPluginEvents.FailedToLoad, () => {
48-
console.log('Failed to load App Open Ad');
49-
});
50-
AdMob.addListener(AppOpenAdPluginEvents.Opened, () => {
51-
console.log('App Open Ad open');
52-
});
53-
AdMob.addListener(AppOpenAdPluginEvents.Closed, () => {
54-
console.log('App Open Ad close');
55-
});
56-
AdMob.addListener(AppOpenAdPluginEvents.FailedToShow, () => {
57-
console.log('Failed to show App Open Ad');
58-
});
59-
60-
const options: AppOpenAdOptions = {
61-
adId: 'YOUR_AD_UNIT_ID', // Replace with your real ID
62-
};
63-
await AdMob.loadAppOpen(options);
64-
const { value } = await AdMob.isAppOpenLoaded();
65-
if (value) {
66-
await AdMob.showAppOpen();
67-
}
6841
}
6942
}

demo/angular/src/app/home/home.page.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@
7070
<ion-item button="true" (click)="prepareReward()" [disabled]="isPrepareReward">Prepare Reward</ion-item>
7171
<ion-item button="true" lines="full" (click)="showReward()" [disabled]="!isPrepareReward">Show Reward</ion-item>
7272
</ion-list>
73+
74+
<ion-list>
75+
<ion-list-header><ion-label>App Open
76+
@if (lastAppOpenEvent$ | async; as lastAppOpenEvent) {
77+
<br>(Last Event: {{lastAppOpenEvent.name }} | {{lastAppOpenEvent.value | json}})
78+
}
79+
80+
</ion-label></ion-list-header>
81+
<ion-item button="true" (click)="loadAppOpen()" [disabled]="isAppOpenLoaded">Load App Open</ion-item>
82+
<ion-item button="true" lines="full" (click)="showAppOpen()" [disabled]="!isAppOpenLoaded">Show App Open</ion-item>
83+
</ion-list>
7384
</ion-content>
7485

7586
<ion-footer>

demo/angular/src/app/home/home.page.ts

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,21 @@ import {
2525
AdmobConsentInfo,
2626
AdmobConsentStatus,
2727
AdMobRewardItem,
28+
AppOpenAdPluginEvents,
2829
BannerAdOptions,
2930
BannerAdPluginEvents,
3031
BannerAdSize,
3132
InterstitialAdPluginEvents,
3233
RewardAdPluginEvents,
3334
} from '@capacitor-community/admob';
3435
import { ReplaySubject } from 'rxjs';
35-
import { bannerBottomOptions, bannerTopOptions, interstitialOptions, rewardOptions } from '../shared/ad.options';
36+
import {
37+
appOpenOptions,
38+
bannerBottomOptions,
39+
bannerTopOptions,
40+
interstitialOptions,
41+
rewardOptions,
42+
} from '../shared/ad.options';
3643
import { FormsModule } from '@angular/forms';
3744
import { AsyncPipe, JsonPipe } from '@angular/common';
3845

@@ -80,6 +87,12 @@ export class HomePage implements ViewWillEnter, ViewWillLeave {
8087
}>(1);
8188
public readonly lastInterstitialEvent$ = this.lastInterstitialEvent$$.asObservable();
8289

90+
private readonly lastAppOpenEvent$$ = new ReplaySubject<{
91+
name: string;
92+
value: unknown;
93+
}>(1);
94+
public readonly lastAppOpenEvent$ = this.lastAppOpenEvent$$.asObservable();
95+
8396
private readonly listenerHandlers: PluginListenerHandle[] = [];
8497
/**
8598
* Height of AdSize
@@ -94,6 +107,7 @@ export class HomePage implements ViewWillEnter, ViewWillLeave {
94107
public isPrepareBanner = false;
95108
public isPrepareReward = false;
96109
public isPrepareInterstitial = false;
110+
public isAppOpenLoaded = false;
97111

98112
public isLoading = false;
99113

@@ -134,6 +148,7 @@ export class HomePage implements ViewWillEnter, ViewWillLeave {
134148
this.registerRewardListeners();
135149
this.registerBannerListeners();
136150
this.registerInterstitialListeners();
151+
this.registerAppOpenListeners();
137152
}
138153

139154
ionViewWillLeave() {
@@ -380,4 +395,48 @@ export class HomePage implements ViewWillEnter, ViewWillLeave {
380395
/**
381396
* ==================== /Interstitial ====================
382397
*/
398+
399+
/**
400+
* ==================== App Open ====================
401+
*/
402+
async loadAppOpen() {
403+
this.isLoading = true;
404+
405+
try {
406+
await AdMob.loadAppOpen(appOpenOptions);
407+
console.log('App Open Ad loaded');
408+
this.isAppOpenLoaded = true;
409+
} catch (e) {
410+
console.error('There was a problem loading the App Open Ad', e);
411+
} finally {
412+
this.isLoading = false;
413+
}
414+
}
415+
416+
async showAppOpen() {
417+
await AdMob.showAppOpen().catch((e) => console.log(e));
418+
419+
this.isAppOpenLoaded = false;
420+
}
421+
422+
private registerAppOpenListeners(): void {
423+
const eventKeys = Object.keys(AppOpenAdPluginEvents);
424+
425+
eventKeys.forEach(async (key) => {
426+
const eventName = AppOpenAdPluginEvents[key as keyof typeof AppOpenAdPluginEvents];
427+
console.log(`registering ${eventName}`);
428+
const handler = await AdMob.addListener(eventName as any, (value: unknown) => {
429+
console.log(`App Open Event "${key}"`, value);
430+
431+
this.ngZone.run(() => {
432+
this.lastAppOpenEvent$$.next({ name: key, value: value });
433+
});
434+
});
435+
this.listenerHandlers.push(handler);
436+
});
437+
}
438+
439+
/**
440+
* ==================== /App Open ====================
441+
*/
383442
}

demo/angular/src/app/shared/ad.options.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { BannerAdOptions, BannerAdPosition, BannerAdSize } from '../../../../../dist/esm/banner';
22
import { AdOptions } from '../../../../../dist/esm/shared';
3+
import { AppOpenAdOptions } from '../../../../../dist/esm/app-open';
34

45
export const bannerTopOptions: BannerAdOptions = {
56
adId: 'ca-app-pub-3940256099942544/2934735716',
@@ -26,3 +27,7 @@ export const rewardInterstitialOptions: AdOptions = {
2627
export const interstitialOptions: AdOptions = {
2728
adId: 'ca-app-pub-3940256099942544/1033173712',
2829
};
30+
31+
export const appOpenOptions: AppOpenAdOptions = {
32+
adId: 'ca-app-pub-3940256099942544/5575463023',
33+
};

demo/screenshots/ios_open.png

58.7 KB
Loading

demo/screenshots/md_open.png

71.5 KB
Loading

0 commit comments

Comments
 (0)