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.
Files changed (74) hide show
  1. package/content/README.md +851 -0
  2. package/content/docs/AD_FREQUENCY_CONTROL.md +450 -0
  3. package/content/docs/AD_LOADING_STRATEGIES.md +369 -0
  4. package/content/docs/API_REFERENCE.md +734 -0
  5. package/content/docs/APP_PURCHASE_GUIDE.md +704 -0
  6. package/content/docs/BANNER_AD_IMPROVEMENTS.md +325 -0
  7. package/content/docs/COMPOSE_INTEGRATION.md +477 -0
  8. package/content/docs/CONFIGURATION_USAGE.md +168 -0
  9. package/content/docs/INTERSTITIAL_BUILDER_GUIDE.md +518 -0
  10. package/content/docs/JAVA_USAGE_GUIDE.md +785 -0
  11. package/content/docs/LOADING_STRATEGY_EXAMPLES.md +463 -0
  12. package/content/docs/NATIVE_AD_MANAGER_ENHANCEMENTS.md +347 -0
  13. package/content/docs/NATIVE_AD_PRELOADING.md +467 -0
  14. package/content/docs/NATIVE_TEMPLATE_VIEW.md +413 -0
  15. package/content/docs/app-open-ads.md +412 -0
  16. package/content/docs/interstitial-ads.md +269 -0
  17. package/content/docs/native-ads-caching.md +182 -0
  18. package/content/docs/release-notes/RELEASE_NOTES_v2.1.0.md +156 -0
  19. package/content/docs/release-notes/RELEASE_NOTES_v2.2.0.md +248 -0
  20. package/content/docs/release-notes/RELEASE_NOTES_v2.3.0.md +280 -0
  21. package/content/docs/release-notes/RELEASE_NOTES_v2.5.0.md +73 -0
  22. package/content/docs/release-notes/RELEASE_NOTES_v2.6.0.md +265 -0
  23. package/content/docs/release-notes/RELEASE_NOTES_v2.7.0.md +168 -0
  24. package/content/docs/release-notes/RELEASE_NOTES_v2.8.0.md +153 -0
  25. package/content/docs/release-notes/RELEASE_NOTES_v2.9.0.md +479 -0
  26. package/content/docs/release-notes/RELEASE_NOTES_v3.0.0.md +343 -0
  27. package/content/docs/release-notes/RELEASE_NOTES_v3.1.0.md +131 -0
  28. package/content/docs/release-notes/RELEASE_NOTES_v3.3.0.md +252 -0
  29. package/content/docs/release-notes/RELEASE_NOTES_v3.3.2.md +215 -0
  30. package/content/docs/release-notes/RELEASE_NOTES_v3.3.3.md +116 -0
  31. package/content/docs/release-notes/RELEASE_NOTES_v3.3.4.md +142 -0
  32. package/content/docs/release-notes/RELEASE_NOTES_v3.3.5.md +94 -0
  33. package/content/docs/rewarded-ads.md +623 -0
  34. package/content/wiki/Ad-Loading-Strategies.md +209 -0
  35. package/content/wiki/App-Open-Ads.md +189 -0
  36. package/content/wiki/Banner-Ads.md +133 -0
  37. package/content/wiki/Billing-Integration.md +69 -0
  38. package/content/wiki/Configuration.md +252 -0
  39. package/content/wiki/Consumable-Products.md +166 -0
  40. package/content/wiki/Home.md +144 -0
  41. package/content/wiki/Interstitial-Ads.md +313 -0
  42. package/content/wiki/Jetpack-Compose.md +270 -0
  43. package/content/wiki/NativeAdManager.md +220 -0
  44. package/content/wiki/Purchase-Categories.md +94 -0
  45. package/content/wiki/Rewarded-Ads.md +420 -0
  46. package/content/wiki/Subscription-Upgrades.md +278 -0
  47. package/content/wiki/Subscriptions.md +368 -0
  48. package/content/wiki/_Footer.md +3 -0
  49. package/content/wiki/_Sidebar.md +18 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +6 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/server.d.ts +1 -0
  54. package/dist/server.js +18 -0
  55. package/dist/server.js.map +1 -0
  56. package/dist/tools/code-generation.d.ts +2 -0
  57. package/dist/tools/code-generation.js +264 -0
  58. package/dist/tools/code-generation.js.map +1 -0
  59. package/dist/tools/documentation.d.ts +2 -0
  60. package/dist/tools/documentation.js +202 -0
  61. package/dist/tools/documentation.js.map +1 -0
  62. package/dist/types.d.ts +18 -0
  63. package/dist/types.js +83 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/utils/doc-loader.d.ts +17 -0
  66. package/dist/utils/doc-loader.js +245 -0
  67. package/dist/utils/doc-loader.js.map +1 -0
  68. package/dist/utils/search.d.ts +2 -0
  69. package/dist/utils/search.js +62 -0
  70. package/dist/utils/search.js.map +1 -0
  71. package/dist/utils/templates.d.ts +60 -0
  72. package/dist/utils/templates.js +793 -0
  73. package/dist/utils/templates.js.map +1 -0
  74. 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!** ☕