Skip to content

Commit d09e362

Browse files
feat: bump version
1 parent 481eb40 commit d09e362

File tree

9 files changed

+313
-140
lines changed

9 files changed

+313
-140
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ android {
7171
targetSdk = 36
7272

7373
//versioning
74-
versionCode = 20
75-
versionName = "1.2.0"
74+
versionCode = 21
75+
versionName = "1.2.1"
7676
vectorDrawables {
7777
useSupportLibrary = true
7878
}

app/src/main/java/com/rk/taskmanager/MainActivity.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ import androidx.navigation.compose.NavHost
1414
import androidx.navigation.compose.composable
1515
import androidx.navigation.compose.rememberNavController
1616
import com.google.android.gms.ads.MobileAds
17+
import com.google.android.gms.ads.RequestConfiguration
1718
import com.rk.DaemonResult
1819
import com.rk.daemon_messages
1920
import com.rk.isConnected
2021
import com.rk.send_daemon_messages
2122
import com.rk.startDaemon
22-
import com.rk.taskmanager.ads.loadAd
23+
import com.rk.taskmanager.ads.InterstitialsAds
24+
import com.rk.taskmanager.ads.RewardedAds
2325
import com.rk.taskmanager.animations.NavigationAnimationTransitions
2426
import com.rk.taskmanager.screens.MainScreen
2527
import com.rk.taskmanager.screens.ProcessInfo
@@ -61,13 +63,21 @@ class MainActivity : ComponentActivity() {
6163
super.onCreate(savedInstanceState)
6264
enableEdgeToEdge()
6365

64-
lifecycleScope.launch(Dispatchers.IO) {
65-
MobileAds.initialize(this@MainActivity)
66-
isinitialized = true
67-
if (Settings.shouldPreLoadThemeAd){
68-
loadAd(this@MainActivity)
69-
}
66+
MobileAds.initialize(this@MainActivity)
67+
MobileAds.setRequestConfiguration(
68+
RequestConfiguration.Builder()
69+
70+
//IF YOU ARE BUILDING THIS APP ADD YOUR DEVICE AS A TEST DEVICE
71+
.setTestDeviceIds(listOf("01AAD58E267D992B923B739EB497E211"))
72+
.build()
73+
)
74+
75+
isinitialized = true
76+
if (Settings.shouldPreLoadThemeAd){
77+
RewardedAds.loadAd(this@MainActivity)
7078
}
79+
InterstitialsAds.loadAd(this@MainActivity){}
80+
7181

7282

7383

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.rk.taskmanager
2+
3+
import android.os.SystemClock
4+
5+
class RateLimiter<T>(
6+
private val intervalMillis: Long // time between allowed actions
7+
) {
8+
private val lastActionTime = mutableMapOf<T, Long>()
9+
10+
fun canRun(key: T): Boolean {
11+
val now = SystemClock.elapsedRealtime()
12+
val last = lastActionTime[key] ?: 0L
13+
return now - last >= intervalMillis
14+
}
15+
16+
fun markRun(key: T) {
17+
lastActionTime[key] = SystemClock.elapsedRealtime()
18+
}
19+
20+
fun runIfAllowed(key: T, block: () -> Unit): Boolean {
21+
return if (canRun(key)) {
22+
markRun(key)
23+
block()
24+
true
25+
} else false
26+
}
27+
}

app/src/main/java/com/rk/taskmanager/ads/Ads.kt

Lines changed: 0 additions & 120 deletions
This file was deleted.
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
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

Comments
 (0)