1+ package com.rk.taskmanager.ads
2+
3+ import android.app.Activity
4+ import android.util.Log
5+ import androidx.lifecycle.lifecycleScope
6+ import com.google.android.gms.ads.AdError
7+ import com.google.android.gms.ads.AdRequest
8+ import com.google.android.gms.ads.FullScreenContentCallback
9+ import com.google.android.gms.ads.LoadAdError
10+ import com.google.android.gms.ads.interstitial.InterstitialAd
11+ import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
12+ import com.rk.taskmanager.MainActivity
13+ import com.rk.taskmanager.RateLimiter
14+ import kotlinx.coroutines.Dispatchers
15+ import kotlinx.coroutines.launch
16+ import kotlinx.coroutines.sync.Mutex
17+ import kotlinx.coroutines.sync.withLock
18+
19+ object InterstitialsAds {
20+ private const val INTERSTITIAL_AD_UNIT_ID = " ca-app-pub-4934006287453841/3488196785"
21+
22+ private val TAG = this @InterstitialsAds::class .java.simpleName
23+ private var interstitialAd: InterstitialAd ? = null
24+
25+ fun isAdAvailable (): Boolean = interstitialAd != null
26+ private val loadMutex = Mutex ()
27+ private val adRateLimiter = RateLimiter <String >(3 * 60 * 1000L )
28+
29+
30+ fun loadAd (activity : MainActivity ,onLoaded : (Boolean )-> Unit ){
31+ if (loadMutex.isLocked) {
32+ return
33+ }
34+ if (interstitialAd != null ) {
35+ return
36+ }
37+ if (MainActivity .instance?.isinitialized == false ) {
38+ return
39+ }
40+
41+ activity.lifecycleScope.launch(Dispatchers .Main .immediate) {
42+ runCatching {
43+ loadMutex.withLock {
44+ InterstitialAd .load(
45+ activity,
46+ INTERSTITIAL_AD_UNIT_ID ,
47+ AdRequest .Builder ().build(),
48+ object : InterstitialAdLoadCallback () {
49+ override fun onAdLoaded (ad : InterstitialAd ) {
50+ Log .d(TAG , " Ad was loaded." )
51+ interstitialAd = ad
52+ onLoaded.invoke(true )
53+ }
54+
55+ override fun onAdFailedToLoad (adError : LoadAdError ) {
56+ Log .d(TAG , adError.message)
57+ interstitialAd = null
58+ onLoaded.invoke(false )
59+ }
60+ },
61+ )
62+ }
63+ }.onFailure { it.printStackTrace() }
64+ }
65+
66+
67+ }
68+
69+ fun showAd (activity : MainActivity , callback : (Boolean ) -> Unit ) {
70+ if (MainActivity .instance?.isinitialized == false ) {
71+ return
72+ }
73+ if (adRateLimiter.canRun(" showAd" ).not ()){
74+ Log .d(TAG ," ad skipped due to rate limit" )
75+ return
76+ }
77+
78+ activity.lifecycleScope.launch(Dispatchers .Main .immediate) {
79+ runCatching {
80+ if (interstitialAd != null ) {
81+ interstitialAd?.fullScreenContentCallback =
82+ object : FullScreenContentCallback () {
83+ override fun onAdDismissedFullScreenContent () {
84+ // Called when fullscreen content is dismissed.
85+ Log .d(TAG , " Ad was dismissed." )
86+ // Don't forget to set the ad reference to null so you
87+ // don't show the ad a second time.
88+ interstitialAd = null
89+ }
90+
91+ override fun onAdFailedToShowFullScreenContent (adError : AdError ) {
92+ // Called when fullscreen content failed to show.
93+ Log .d(TAG , " Ad failed to show." )
94+ // Don't forget to set the ad reference to null so you
95+ // don't show the ad a second time.
96+ interstitialAd = null
97+ }
98+
99+ override fun onAdShowedFullScreenContent () {
100+ // Called when fullscreen content is shown.
101+ Log .d(TAG , " Ad showed fullscreen content." )
102+ }
103+
104+ override fun onAdImpression () {
105+ // Called when an impression is recorded for an ad.
106+ Log .d(TAG , " Ad recorded an impression." )
107+ }
108+
109+ override fun onAdClicked () {
110+ // Called when ad is clicked.
111+ Log .d(TAG , " Ad was clicked." )
112+ }
113+ }
114+ interstitialAd?.show(activity)
115+ adRateLimiter.markRun(" showAd" )
116+ callback.invoke(true )
117+ }else {
118+ loadAd(activity){}
119+ callback.invoke(false )
120+ }
121+ }.onFailure {
122+ it.printStackTrace()
123+ }
124+
125+ }
126+ }
127+
128+
129+
130+ }
0 commit comments