admanagekit-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/README.md +851 -0
- package/content/docs/AD_FREQUENCY_CONTROL.md +450 -0
- package/content/docs/AD_LOADING_STRATEGIES.md +369 -0
- package/content/docs/API_REFERENCE.md +734 -0
- package/content/docs/APP_PURCHASE_GUIDE.md +704 -0
- package/content/docs/BANNER_AD_IMPROVEMENTS.md +325 -0
- package/content/docs/COMPOSE_INTEGRATION.md +477 -0
- package/content/docs/CONFIGURATION_USAGE.md +168 -0
- package/content/docs/INTERSTITIAL_BUILDER_GUIDE.md +518 -0
- package/content/docs/JAVA_USAGE_GUIDE.md +785 -0
- package/content/docs/LOADING_STRATEGY_EXAMPLES.md +463 -0
- package/content/docs/NATIVE_AD_MANAGER_ENHANCEMENTS.md +347 -0
- package/content/docs/NATIVE_AD_PRELOADING.md +467 -0
- package/content/docs/NATIVE_TEMPLATE_VIEW.md +413 -0
- package/content/docs/app-open-ads.md +412 -0
- package/content/docs/interstitial-ads.md +269 -0
- package/content/docs/native-ads-caching.md +182 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.1.0.md +156 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.2.0.md +248 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.3.0.md +280 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.5.0.md +73 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.6.0.md +265 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.7.0.md +168 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.8.0.md +153 -0
- package/content/docs/release-notes/RELEASE_NOTES_v2.9.0.md +479 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.0.0.md +343 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.1.0.md +131 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.3.0.md +252 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.3.2.md +215 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.3.3.md +116 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.3.4.md +142 -0
- package/content/docs/release-notes/RELEASE_NOTES_v3.3.5.md +94 -0
- package/content/docs/rewarded-ads.md +623 -0
- package/content/wiki/Ad-Loading-Strategies.md +209 -0
- package/content/wiki/App-Open-Ads.md +189 -0
- package/content/wiki/Banner-Ads.md +133 -0
- package/content/wiki/Billing-Integration.md +69 -0
- package/content/wiki/Configuration.md +252 -0
- package/content/wiki/Consumable-Products.md +166 -0
- package/content/wiki/Home.md +144 -0
- package/content/wiki/Interstitial-Ads.md +313 -0
- package/content/wiki/Jetpack-Compose.md +270 -0
- package/content/wiki/NativeAdManager.md +220 -0
- package/content/wiki/Purchase-Categories.md +94 -0
- package/content/wiki/Rewarded-Ads.md +420 -0
- package/content/wiki/Subscription-Upgrades.md +278 -0
- package/content/wiki/Subscriptions.md +368 -0
- package/content/wiki/_Footer.md +3 -0
- package/content/wiki/_Sidebar.md +18 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +18 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/code-generation.d.ts +2 -0
- package/dist/tools/code-generation.js +264 -0
- package/dist/tools/code-generation.js.map +1 -0
- package/dist/tools/documentation.d.ts +2 -0
- package/dist/tools/documentation.js +202 -0
- package/dist/tools/documentation.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/doc-loader.d.ts +17 -0
- package/dist/utils/doc-loader.js +245 -0
- package/dist/utils/doc-loader.js.map +1 -0
- package/dist/utils/search.d.ts +2 -0
- package/dist/utils/search.js +62 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/templates.d.ts +60 -0
- package/dist/utils/templates.js +793 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,785 @@
|
|
|
1
|
+
# Java Usage Guide - InterstitialAdBuilder
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `InterstitialAdBuilder` is **fully compatible with Java**. This guide provides complete Java examples for all features.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🚀 Quick Start (Java)
|
|
10
|
+
|
|
11
|
+
### Simple Usage
|
|
12
|
+
```java
|
|
13
|
+
// Import
|
|
14
|
+
import com.i2hammad.admanagekit.admob.InterstitialAdBuilder;
|
|
15
|
+
import com.i2hammad.admanagekit.admob.OnAdCompleteListener;
|
|
16
|
+
|
|
17
|
+
// In your Activity
|
|
18
|
+
InterstitialAdBuilder.with(this)
|
|
19
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
20
|
+
.show(new OnAdCompleteListener() {
|
|
21
|
+
@Override
|
|
22
|
+
public void onComplete() {
|
|
23
|
+
// Continue to next screen
|
|
24
|
+
startNextActivity();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 📚 Complete Java Examples
|
|
32
|
+
|
|
33
|
+
### Example 1: Basic Navigation
|
|
34
|
+
```java
|
|
35
|
+
public class GameOverActivity extends AppCompatActivity {
|
|
36
|
+
|
|
37
|
+
private void playAgain() {
|
|
38
|
+
InterstitialAdBuilder.with(this)
|
|
39
|
+
.adUnit(getString(R.string.interstitial_ad_unit))
|
|
40
|
+
.show(new OnAdCompleteListener() {
|
|
41
|
+
@Override
|
|
42
|
+
public void onComplete() {
|
|
43
|
+
startActivity(new Intent(GameOverActivity.this, GameActivity.class));
|
|
44
|
+
finish();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Example 2: With Fallback
|
|
52
|
+
```java
|
|
53
|
+
InterstitialAdBuilder.with(this)
|
|
54
|
+
.adUnit("ca-app-pub-xxxxx/primary")
|
|
55
|
+
.fallback("ca-app-pub-xxxxx/backup")
|
|
56
|
+
.show(new OnAdCompleteListener() {
|
|
57
|
+
@Override
|
|
58
|
+
public void onComplete() {
|
|
59
|
+
goToNextScreen();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Example 3: Frequency Control - Every 3rd Time
|
|
65
|
+
```java
|
|
66
|
+
public class GameActivity extends AppCompatActivity {
|
|
67
|
+
|
|
68
|
+
private InterstitialAdBuilder adBuilder;
|
|
69
|
+
|
|
70
|
+
@Override
|
|
71
|
+
protected void onCreate(Bundle savedInstanceState) {
|
|
72
|
+
super.onCreate(savedInstanceState);
|
|
73
|
+
setContentView(R.layout.activity_game);
|
|
74
|
+
|
|
75
|
+
// Initialize builder
|
|
76
|
+
adBuilder = InterstitialAdBuilder.with(this)
|
|
77
|
+
.adUnit(getString(R.string.interstitial_game))
|
|
78
|
+
.everyNthTime(3) // Show on 3rd, 6th, 9th level
|
|
79
|
+
.debug();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private void onLevelComplete() {
|
|
83
|
+
adBuilder.show(new OnAdCompleteListener() {
|
|
84
|
+
@Override
|
|
85
|
+
public void onComplete() {
|
|
86
|
+
loadNextLevel();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Example 4: With All Callbacks
|
|
94
|
+
```java
|
|
95
|
+
import com.i2hammad.admanagekit.admob.InterstitialAdCallback;
|
|
96
|
+
import com.google.android.gms.ads.LoadAdError;
|
|
97
|
+
|
|
98
|
+
InterstitialAdBuilder.with(this)
|
|
99
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
100
|
+
.show(new InterstitialAdCallback() {
|
|
101
|
+
@Override
|
|
102
|
+
public void onAdLoaded() {
|
|
103
|
+
Log.d("Ads", "Ad loaded successfully");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@Override
|
|
107
|
+
public void onAdShown() {
|
|
108
|
+
Log.d("Ads", "Ad shown to user");
|
|
109
|
+
analytics.logEvent("ad_shown", null);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@Override
|
|
113
|
+
public void onAdFailed(LoadAdError error) {
|
|
114
|
+
Log.e("Ads", "Ad failed: " + error.getMessage());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@Override
|
|
118
|
+
public void onComplete() {
|
|
119
|
+
proceedToNextScreen();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Example 5: Individual Callbacks
|
|
125
|
+
```java
|
|
126
|
+
import com.i2hammad.admanagekit.admob.OnAdLoadedListener;
|
|
127
|
+
import com.i2hammad.admanagekit.admob.OnAdShownListener;
|
|
128
|
+
import com.i2hammad.admanagekit.admob.OnAdFailedListener;
|
|
129
|
+
|
|
130
|
+
InterstitialAdBuilder.with(this)
|
|
131
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
132
|
+
.onAdLoaded(new OnAdLoadedListener() {
|
|
133
|
+
@Override
|
|
134
|
+
public void onAdLoaded() {
|
|
135
|
+
Log.d("Ads", "Ad loaded");
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
.onAdShown(new OnAdShownListener() {
|
|
139
|
+
@Override
|
|
140
|
+
public void onAdShown() {
|
|
141
|
+
FirebaseAnalytics.getInstance(MainActivity.this)
|
|
142
|
+
.logEvent("interstitial_shown", null);
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
.onFailed(new OnAdFailedListener() {
|
|
146
|
+
@Override
|
|
147
|
+
public void onAdFailed(LoadAdError error) {
|
|
148
|
+
Log.e("Ads", "Failed: " + error.getMessage());
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
.show(new OnAdCompleteListener() {
|
|
152
|
+
@Override
|
|
153
|
+
public void onComplete() {
|
|
154
|
+
startActivity(new Intent(MainActivity.this, NextActivity.class));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Example 6: Frequency Control
|
|
160
|
+
```java
|
|
161
|
+
InterstitialAdBuilder.with(this)
|
|
162
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
163
|
+
.everyNthTime(2) // Every 2nd call
|
|
164
|
+
.maxShows(15) // Max 15 times total
|
|
165
|
+
.minIntervalSeconds(45) // 45 seconds minimum
|
|
166
|
+
.show(new OnAdCompleteListener() {
|
|
167
|
+
@Override
|
|
168
|
+
public void onComplete() {
|
|
169
|
+
continueFlow();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Example 7: With Loading Dialog
|
|
175
|
+
```java
|
|
176
|
+
InterstitialAdBuilder.with(this)
|
|
177
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
178
|
+
.withLoadingDialog() // Show "Please wait..."
|
|
179
|
+
.show(new OnAdCompleteListener() {
|
|
180
|
+
@Override
|
|
181
|
+
public void onComplete() {
|
|
182
|
+
goNext();
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Example 8: Force Show
|
|
188
|
+
```java
|
|
189
|
+
InterstitialAdBuilder.with(this)
|
|
190
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
191
|
+
.force() // Ignore time interval
|
|
192
|
+
.show(new OnAdCompleteListener() {
|
|
193
|
+
@Override
|
|
194
|
+
public void onComplete() {
|
|
195
|
+
finish();
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Example 9: Complete Configuration
|
|
201
|
+
```java
|
|
202
|
+
InterstitialAdBuilder.with(this)
|
|
203
|
+
.adUnit("ca-app-pub-xxxxx/primary")
|
|
204
|
+
.fallback("ca-app-pub-xxxxx/backup-1")
|
|
205
|
+
.fallback("ca-app-pub-xxxxx/backup-2")
|
|
206
|
+
.everyNthTime(3)
|
|
207
|
+
.maxShows(20)
|
|
208
|
+
.minIntervalSeconds(60)
|
|
209
|
+
.force()
|
|
210
|
+
.withLoadingDialog()
|
|
211
|
+
.autoReload(true)
|
|
212
|
+
.debug()
|
|
213
|
+
.show(new InterstitialAdCallback() {
|
|
214
|
+
@Override
|
|
215
|
+
public void onAdLoaded() {
|
|
216
|
+
Log.d("Ads", "Loaded");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@Override
|
|
220
|
+
public void onAdShown() {
|
|
221
|
+
Log.d("Ads", "Shown");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@Override
|
|
225
|
+
public void onAdFailed(LoadAdError error) {
|
|
226
|
+
Log.e("Ads", "Failed: " + error.getMessage());
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
@Override
|
|
230
|
+
public void onComplete() {
|
|
231
|
+
startActivity(new Intent(MainActivity.this, NextActivity.class));
|
|
232
|
+
finish();
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Example 10: Preload Pattern
|
|
238
|
+
```java
|
|
239
|
+
public class MainActivity extends AppCompatActivity {
|
|
240
|
+
|
|
241
|
+
@Override
|
|
242
|
+
protected void onCreate(Bundle savedInstanceState) {
|
|
243
|
+
super.onCreate(savedInstanceState);
|
|
244
|
+
setContentView(R.layout.activity_main);
|
|
245
|
+
|
|
246
|
+
// Preload ad early
|
|
247
|
+
InterstitialAdBuilder.with(this)
|
|
248
|
+
.adUnit(getString(R.string.interstitial_ad_unit))
|
|
249
|
+
.preload();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
private void showAdBeforeExit() {
|
|
253
|
+
// Ad already preloaded, shows instantly
|
|
254
|
+
InterstitialAdBuilder.with(this)
|
|
255
|
+
.adUnit(getString(R.string.interstitial_ad_unit))
|
|
256
|
+
.show(new OnAdCompleteListener() {
|
|
257
|
+
@Override
|
|
258
|
+
public void onComplete() {
|
|
259
|
+
finish();
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 🎯 Java Callback Interfaces
|
|
269
|
+
|
|
270
|
+
### OnAdCompleteListener
|
|
271
|
+
```java
|
|
272
|
+
public interface OnAdCompleteListener {
|
|
273
|
+
void onComplete();
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**Usage:**
|
|
278
|
+
```java
|
|
279
|
+
.show(new OnAdCompleteListener() {
|
|
280
|
+
@Override
|
|
281
|
+
public void onComplete() {
|
|
282
|
+
// Continue your flow
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### OnAdLoadedListener
|
|
288
|
+
```java
|
|
289
|
+
public interface OnAdLoadedListener {
|
|
290
|
+
void onAdLoaded();
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Usage:**
|
|
295
|
+
```java
|
|
296
|
+
.onAdLoaded(new OnAdLoadedListener() {
|
|
297
|
+
@Override
|
|
298
|
+
public void onAdLoaded() {
|
|
299
|
+
// Ad loaded successfully
|
|
300
|
+
}
|
|
301
|
+
})
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### OnAdShownListener
|
|
305
|
+
```java
|
|
306
|
+
public interface OnAdShownListener {
|
|
307
|
+
void onAdShown();
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Usage:**
|
|
312
|
+
```java
|
|
313
|
+
.onAdShown(new OnAdShownListener() {
|
|
314
|
+
@Override
|
|
315
|
+
public void onAdShown() {
|
|
316
|
+
// Ad shown to user
|
|
317
|
+
}
|
|
318
|
+
})
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### OnAdFailedListener
|
|
322
|
+
```java
|
|
323
|
+
public interface OnAdFailedListener {
|
|
324
|
+
void onAdFailed(LoadAdError error);
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Usage:**
|
|
329
|
+
```java
|
|
330
|
+
.onFailed(new OnAdFailedListener() {
|
|
331
|
+
@Override
|
|
332
|
+
public void onAdFailed(LoadAdError error) {
|
|
333
|
+
// Handle failure
|
|
334
|
+
Log.e("Ads", error.getMessage());
|
|
335
|
+
}
|
|
336
|
+
})
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### InterstitialAdCallback (Combined)
|
|
340
|
+
```java
|
|
341
|
+
public interface InterstitialAdCallback {
|
|
342
|
+
void onAdLoaded();
|
|
343
|
+
void onAdShown();
|
|
344
|
+
void onAdFailed(LoadAdError error);
|
|
345
|
+
void onComplete();
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Usage:**
|
|
350
|
+
```java
|
|
351
|
+
.show(new InterstitialAdCallback() {
|
|
352
|
+
@Override
|
|
353
|
+
public void onAdLoaded() { }
|
|
354
|
+
|
|
355
|
+
@Override
|
|
356
|
+
public void onAdShown() { }
|
|
357
|
+
|
|
358
|
+
@Override
|
|
359
|
+
public void onAdFailed(LoadAdError error) { }
|
|
360
|
+
|
|
361
|
+
@Override
|
|
362
|
+
public void onComplete() { }
|
|
363
|
+
});
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 🎨 Common Patterns (Java)
|
|
369
|
+
|
|
370
|
+
### Pattern 1: Game - Every 3 Levels
|
|
371
|
+
```java
|
|
372
|
+
public class GameActivity extends AppCompatActivity {
|
|
373
|
+
|
|
374
|
+
private InterstitialAdBuilder levelCompleteAd;
|
|
375
|
+
|
|
376
|
+
@Override
|
|
377
|
+
protected void onCreate(Bundle savedInstanceState) {
|
|
378
|
+
super.onCreate(savedInstanceState);
|
|
379
|
+
|
|
380
|
+
levelCompleteAd = InterstitialAdBuilder.with(this)
|
|
381
|
+
.adUnit(getString(R.string.interstitial_game))
|
|
382
|
+
.everyNthTime(3)
|
|
383
|
+
.debug();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
private void onLevelComplete() {
|
|
387
|
+
levelCompleteAd.show(new OnAdCompleteListener() {
|
|
388
|
+
@Override
|
|
389
|
+
public void onComplete() {
|
|
390
|
+
loadNextLevel();
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Pattern 2: Limited Exposure
|
|
398
|
+
```java
|
|
399
|
+
public class MainActivity extends AppCompatActivity {
|
|
400
|
+
|
|
401
|
+
private void showWelcomeAd() {
|
|
402
|
+
InterstitialAdBuilder.with(this)
|
|
403
|
+
.adUnit(getString(R.string.interstitial_welcome))
|
|
404
|
+
.maxShows(3) // Only first 3 times
|
|
405
|
+
.show(new OnAdCompleteListener() {
|
|
406
|
+
@Override
|
|
407
|
+
public void onComplete() {
|
|
408
|
+
showMainContent();
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Pattern 3: Time-Controlled
|
|
416
|
+
```java
|
|
417
|
+
public class ArticleActivity extends AppCompatActivity {
|
|
418
|
+
|
|
419
|
+
private void showArticleAd() {
|
|
420
|
+
InterstitialAdBuilder.with(this)
|
|
421
|
+
.adUnit(getString(R.string.interstitial_article))
|
|
422
|
+
.minIntervalSeconds(120) // 2 minutes minimum
|
|
423
|
+
.show(new OnAdCompleteListener() {
|
|
424
|
+
@Override
|
|
425
|
+
public void onComplete() {
|
|
426
|
+
loadNextArticle();
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Pattern 4: Combined Controls
|
|
434
|
+
```java
|
|
435
|
+
public class AppActivity extends AppCompatActivity {
|
|
436
|
+
|
|
437
|
+
private void showSmartAd() {
|
|
438
|
+
InterstitialAdBuilder.with(this)
|
|
439
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
440
|
+
.everyNthTime(2)
|
|
441
|
+
.maxShows(10)
|
|
442
|
+
.minIntervalSeconds(30)
|
|
443
|
+
.debug()
|
|
444
|
+
.show(new OnAdCompleteListener() {
|
|
445
|
+
@Override
|
|
446
|
+
public void onComplete() {
|
|
447
|
+
continueFlow();
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## 🔧 Advanced Java Usage
|
|
457
|
+
|
|
458
|
+
### Reusable Callback Classes
|
|
459
|
+
```java
|
|
460
|
+
public class MyAdCallback implements InterstitialAdCallback {
|
|
461
|
+
|
|
462
|
+
private Activity activity;
|
|
463
|
+
|
|
464
|
+
public MyAdCallback(Activity activity) {
|
|
465
|
+
this.activity = activity;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
@Override
|
|
469
|
+
public void onAdLoaded() {
|
|
470
|
+
Log.d("MyApp", "Ad loaded");
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
@Override
|
|
474
|
+
public void onAdShown() {
|
|
475
|
+
FirebaseAnalytics.getInstance(activity)
|
|
476
|
+
.logEvent("ad_interstitial_shown", null);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
@Override
|
|
480
|
+
public void onAdFailed(LoadAdError error) {
|
|
481
|
+
Log.e("MyApp", "Ad failed: " + error.getMessage());
|
|
482
|
+
Bundle bundle = new Bundle();
|
|
483
|
+
bundle.putInt("error_code", error.getCode());
|
|
484
|
+
bundle.putString("error_message", error.getMessage());
|
|
485
|
+
FirebaseAnalytics.getInstance(activity)
|
|
486
|
+
.logEvent("ad_failed", bundle);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
@Override
|
|
490
|
+
public void onComplete() {
|
|
491
|
+
// Continue flow
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Usage
|
|
496
|
+
InterstitialAdBuilder.with(this)
|
|
497
|
+
.adUnit("ad-unit-id")
|
|
498
|
+
.show(new MyAdCallback(this));
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Base Activity Pattern
|
|
502
|
+
```java
|
|
503
|
+
public abstract class AdEnabledActivity extends AppCompatActivity {
|
|
504
|
+
|
|
505
|
+
protected void showInterstitialAndProceed(Runnable onComplete) {
|
|
506
|
+
InterstitialAdBuilder.with(this)
|
|
507
|
+
.adUnit(getString(R.string.interstitial_ad_unit))
|
|
508
|
+
.everyNthTime(3)
|
|
509
|
+
.minIntervalSeconds(60)
|
|
510
|
+
.show(new OnAdCompleteListener() {
|
|
511
|
+
@Override
|
|
512
|
+
public void onComplete() {
|
|
513
|
+
if (onComplete != null) {
|
|
514
|
+
onComplete.run();
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Usage in child activity
|
|
522
|
+
public class GameActivity extends AdEnabledActivity {
|
|
523
|
+
|
|
524
|
+
private void onGameOver() {
|
|
525
|
+
showInterstitialAndProceed(new Runnable() {
|
|
526
|
+
@Override
|
|
527
|
+
public void run() {
|
|
528
|
+
restartGame();
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### Application-Level Setup
|
|
536
|
+
```java
|
|
537
|
+
public class MyApplication extends Application {
|
|
538
|
+
|
|
539
|
+
@Override
|
|
540
|
+
public void onCreate() {
|
|
541
|
+
super.onCreate();
|
|
542
|
+
|
|
543
|
+
// Initialize AdMob
|
|
544
|
+
MobileAds.initialize(this);
|
|
545
|
+
|
|
546
|
+
// Enable aggressive loading
|
|
547
|
+
AdManager.getInstance().enableAggressiveAdLoading();
|
|
548
|
+
|
|
549
|
+
// Preload first ad
|
|
550
|
+
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
|
|
551
|
+
@Override
|
|
552
|
+
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
|
553
|
+
InterstitialAdBuilder.with(activity)
|
|
554
|
+
.adUnit("ca-app-pub-xxxxx/yyyyy")
|
|
555
|
+
.preload();
|
|
556
|
+
unregisterActivityLifecycleCallbacks(this);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
@Override
|
|
560
|
+
public void onActivityStarted(Activity activity) { }
|
|
561
|
+
@Override
|
|
562
|
+
public void onActivityResumed(Activity activity) { }
|
|
563
|
+
@Override
|
|
564
|
+
public void onActivityPaused(Activity activity) { }
|
|
565
|
+
@Override
|
|
566
|
+
public void onActivityStopped(Activity activity) { }
|
|
567
|
+
@Override
|
|
568
|
+
public void onActivitySaveInstanceState(Activity activity, Bundle outState) { }
|
|
569
|
+
@Override
|
|
570
|
+
public void onActivityDestroyed(Activity activity) { }
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
## 📊 Java vs Kotlin Comparison
|
|
579
|
+
|
|
580
|
+
### Simple Show
|
|
581
|
+
|
|
582
|
+
#### Kotlin
|
|
583
|
+
```kotlin
|
|
584
|
+
showInterstitialAd("ad-unit") { next() }
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
#### Java
|
|
588
|
+
```java
|
|
589
|
+
InterstitialAdBuilder.with(this)
|
|
590
|
+
.adUnit("ad-unit")
|
|
591
|
+
.show(new OnAdCompleteListener() {
|
|
592
|
+
@Override
|
|
593
|
+
public void onComplete() {
|
|
594
|
+
next();
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### With Callbacks
|
|
600
|
+
|
|
601
|
+
#### Kotlin
|
|
602
|
+
```kotlin
|
|
603
|
+
InterstitialAdBuilder.with(this)
|
|
604
|
+
.adUnit("ad-unit")
|
|
605
|
+
.onAdShown { analytics.log("shown") }
|
|
606
|
+
.onFailed { error -> Log.e("Ad", error.message) }
|
|
607
|
+
.show { next() }
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
#### Java
|
|
611
|
+
```java
|
|
612
|
+
InterstitialAdBuilder.with(this)
|
|
613
|
+
.adUnit("ad-unit")
|
|
614
|
+
.onAdShown(new OnAdShownListener() {
|
|
615
|
+
@Override
|
|
616
|
+
public void onAdShown() {
|
|
617
|
+
analytics.log("shown");
|
|
618
|
+
}
|
|
619
|
+
})
|
|
620
|
+
.onFailed(new OnAdFailedListener() {
|
|
621
|
+
@Override
|
|
622
|
+
public void onAdFailed(LoadAdError error) {
|
|
623
|
+
Log.e("Ad", error.getMessage());
|
|
624
|
+
}
|
|
625
|
+
})
|
|
626
|
+
.show(new OnAdCompleteListener() {
|
|
627
|
+
@Override
|
|
628
|
+
public void onComplete() {
|
|
629
|
+
next();
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## 🎯 Best Practices for Java
|
|
637
|
+
|
|
638
|
+
### 1. Reuse Builders
|
|
639
|
+
```java
|
|
640
|
+
// ✅ GOOD: Create once, reuse
|
|
641
|
+
private InterstitialAdBuilder adBuilder;
|
|
642
|
+
|
|
643
|
+
@Override
|
|
644
|
+
protected void onCreate(Bundle savedInstanceState) {
|
|
645
|
+
super.onCreate(savedInstanceState);
|
|
646
|
+
adBuilder = InterstitialAdBuilder.with(this)
|
|
647
|
+
.adUnit("ad-unit")
|
|
648
|
+
.everyNthTime(3);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
private void showAd() {
|
|
652
|
+
adBuilder.show(new OnAdCompleteListener() {
|
|
653
|
+
@Override
|
|
654
|
+
public void onComplete() { next(); }
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// ❌ BAD: Create every time
|
|
659
|
+
private void showAd() {
|
|
660
|
+
InterstitialAdBuilder.with(this)
|
|
661
|
+
.adUnit("ad-unit")
|
|
662
|
+
.everyNthTime(3)
|
|
663
|
+
.show(...);
|
|
664
|
+
}
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
### 2. Use Combined Callback
|
|
668
|
+
```java
|
|
669
|
+
// ✅ GOOD: Single callback class
|
|
670
|
+
.show(new InterstitialAdCallback() {
|
|
671
|
+
@Override public void onAdLoaded() { }
|
|
672
|
+
@Override public void onAdShown() { }
|
|
673
|
+
@Override public void onAdFailed(LoadAdError error) { }
|
|
674
|
+
@Override public void onComplete() { }
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
// ❌ WORSE: Multiple separate callbacks
|
|
678
|
+
.onAdLoaded(...).onAdShown(...).onFailed(...).show(...)
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
### 3. Extract Reusable Callbacks
|
|
682
|
+
```java
|
|
683
|
+
// ✅ GOOD: Reusable
|
|
684
|
+
public class AdCallbacks {
|
|
685
|
+
public static class GameOver implements OnAdCompleteListener {
|
|
686
|
+
private Activity activity;
|
|
687
|
+
|
|
688
|
+
public GameOver(Activity activity) {
|
|
689
|
+
this.activity = activity;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
@Override
|
|
693
|
+
public void onComplete() {
|
|
694
|
+
activity.startActivity(new Intent(activity, GameActivity.class));
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Usage
|
|
700
|
+
.show(new AdCallbacks.GameOver(this));
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
---
|
|
704
|
+
|
|
705
|
+
## 🔍 Troubleshooting (Java)
|
|
706
|
+
|
|
707
|
+
### Issue: Callbacks Not Working
|
|
708
|
+
|
|
709
|
+
**Problem:**
|
|
710
|
+
```java
|
|
711
|
+
// ❌ WRONG: Doesn't implement interface
|
|
712
|
+
.show(new Object() {
|
|
713
|
+
public void onComplete() { }
|
|
714
|
+
});
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
**Solution:**
|
|
718
|
+
```java
|
|
719
|
+
// ✅ CORRECT: Implement interface
|
|
720
|
+
.show(new OnAdCompleteListener() {
|
|
721
|
+
@Override
|
|
722
|
+
public void onComplete() { }
|
|
723
|
+
});
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
### Issue: Memory Leaks
|
|
727
|
+
|
|
728
|
+
**Problem:**
|
|
729
|
+
```java
|
|
730
|
+
// ❌ WRONG: Inner class holds activity reference
|
|
731
|
+
.show(new OnAdCompleteListener() {
|
|
732
|
+
@Override
|
|
733
|
+
public void onComplete() {
|
|
734
|
+
MyActivity.this.finish(); // Can leak
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
**Solution:**
|
|
740
|
+
```java
|
|
741
|
+
// ✅ CORRECT: Use WeakReference or static class
|
|
742
|
+
static class CompleteListener implements OnAdCompleteListener {
|
|
743
|
+
private WeakReference<Activity> activityRef;
|
|
744
|
+
|
|
745
|
+
CompleteListener(Activity activity) {
|
|
746
|
+
this.activityRef = new WeakReference<>(activity);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
@Override
|
|
750
|
+
public void onComplete() {
|
|
751
|
+
Activity activity = activityRef.get();
|
|
752
|
+
if (activity != null && !activity.isFinishing()) {
|
|
753
|
+
activity.finish();
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
---
|
|
760
|
+
|
|
761
|
+
## 📝 Summary
|
|
762
|
+
|
|
763
|
+
### Java Compatibility Features
|
|
764
|
+
- ✅ **`@JvmStatic`** - Companion object methods accessible
|
|
765
|
+
- ✅ **Interface callbacks** - No lambda required
|
|
766
|
+
- ✅ **Method overloading** - Supports both Kotlin and Java patterns
|
|
767
|
+
- ✅ **All features available** - 100% feature parity with Kotlin
|
|
768
|
+
|
|
769
|
+
### Available Interfaces
|
|
770
|
+
- ✅ `OnAdCompleteListener` - Main completion callback
|
|
771
|
+
- ✅ `OnAdLoadedListener` - Ad loaded callback
|
|
772
|
+
- ✅ `OnAdShownListener` - Ad shown callback
|
|
773
|
+
- ✅ `OnAdFailedListener` - Failure callback
|
|
774
|
+
- ✅ `InterstitialAdCallback` - Combined callback
|
|
775
|
+
|
|
776
|
+
### Key Benefits for Java Developers
|
|
777
|
+
- ✅ **Fluent API** - Same builder pattern as Kotlin
|
|
778
|
+
- ✅ **Type-safe** - All callbacks strongly typed
|
|
779
|
+
- ✅ **No lambdas required** - Interface-based callbacks
|
|
780
|
+
- ✅ **Full feature set** - All functionality available
|
|
781
|
+
- ✅ **Well documented** - Complete Java examples
|
|
782
|
+
|
|
783
|
+
---
|
|
784
|
+
|
|
785
|
+
**InterstitialAdBuilder is fully production-ready for Java projects!** ☕
|