@@ -42,6 +42,8 @@ import com.gigaworks.tech.calculator.ui.main.helper.removeNumberSeparator
42
42
import com.gigaworks.tech.calculator.ui.main.viewmodel.MainViewModel
43
43
import com.gigaworks.tech.calculator.ui.settings.SettingsActivity
44
44
import com.gigaworks.tech.calculator.ui.view.CalculatorEditText
45
+ import com.gigaworks.tech.calculator.util.ADS_DISABLED
46
+ import com.gigaworks.tech.calculator.util.ADS_ENABLED
45
47
import com.gigaworks.tech.calculator.util.AccentTheme
46
48
import com.gigaworks.tech.calculator.util.AngleType
47
49
import com.gigaworks.tech.calculator.util.AppPreference
@@ -51,13 +53,25 @@ import com.gigaworks.tech.calculator.util.CLICK_ABOUT
51
53
import com.gigaworks.tech.calculator.util.CLICK_CLEAR
52
54
import com.gigaworks.tech.calculator.util.CLICK_HISTORY
53
55
import com.gigaworks.tech.calculator.util.CLICK_MEMORY
56
+ import com.gigaworks.tech.calculator.util.CLICK_PRIVACY_SETTINGS
54
57
import com.gigaworks.tech.calculator.util.CLICK_SETTINGS
55
58
import com.gigaworks.tech.calculator.util.CLICK_TUTORIAL
56
59
import com.gigaworks.tech.calculator.util.EVALUATE
60
+ import com.gigaworks.tech.calculator.util.GoogleMobileAdsConsentManager
57
61
import com.gigaworks.tech.calculator.util.NumberSeparator
58
62
import com.gigaworks.tech.calculator.util.SHARE_EXPRESSION
59
63
import com.gigaworks.tech.calculator.util.getAccentTheme
64
+ import com.gigaworks.tech.calculator.util.logD
65
+ import com.gigaworks.tech.calculator.util.logE
66
+ import com.gigaworks.tech.calculator.util.visible
67
+ import com.google.android.gms.ads.AdRequest
68
+ import com.google.android.gms.ads.MobileAds
69
+ import com.google.firebase.Firebase
70
+ import com.google.firebase.remoteconfig.FirebaseRemoteConfig
71
+ import com.google.firebase.remoteconfig.get
72
+ import com.google.firebase.remoteconfig.remoteConfig
60
73
import dagger.hilt.android.AndroidEntryPoint
74
+ import java.util.concurrent.atomic.AtomicBoolean
61
75
import kotlin.math.sqrt
62
76
63
77
@@ -66,6 +80,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
66
80
67
81
private val viewModel: MainViewModel by viewModels()
68
82
private var mCurrentAnimator: Animator ? = null
83
+ private val isMobileAdsInitializeCalled = AtomicBoolean (false )
84
+ private lateinit var googleMobileAdsConsentManager: GoogleMobileAdsConsentManager
69
85
70
86
override fun onCreate (savedInstanceState : Bundle ? ) {
71
87
val appPreference = AppPreference (this )
@@ -81,7 +97,74 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
81
97
setAppTheme()
82
98
83
99
// Add onBackPressedDispatcher callback
84
- onBackPressedDispatcher.addCallback(this ,onBackPressedCallback)
100
+ onBackPressedDispatcher.addCallback(this , onBackPressedCallback)
101
+
102
+ // setup remote config
103
+ setupRemoteConfig()
104
+
105
+ // enable Google ads
106
+ enableAds()
107
+
108
+ }
109
+
110
+ private fun initializeMobileAdsSdk () {
111
+ if (isMobileAdsInitializeCalled.getAndSet(true )) {
112
+ return
113
+ }
114
+ MobileAds .initialize(this ) {}
115
+ logD(" Consent granted: ${googleMobileAdsConsentManager.canRequestAds} " )
116
+ val adRequest = AdRequest .Builder ().build()
117
+ binding.adView.loadAd(adRequest)
118
+ logEvent(ADS_ENABLED )
119
+ }
120
+
121
+ private fun enableAds () {
122
+ googleMobileAdsConsentManager =
123
+ GoogleMobileAdsConsentManager .getInstance(applicationContext)
124
+ val remoteConfig = Firebase .remoteConfig
125
+ val shouldEnableAds = remoteConfig[" enable_ads" ].asBoolean()
126
+ logD(" enable_ads=$shouldEnableAds " )
127
+ if (! shouldEnableAds) {
128
+ logD(" disabling ads due to remote config" )
129
+ logEvent(ADS_DISABLED )
130
+ binding.adView.visible(false )
131
+ return
132
+ }
133
+
134
+ logD(" Google Mobile Ads SDK Version: ${MobileAds .getVersion()} " )
135
+ googleMobileAdsConsentManager.gatherConsent(this ) { error ->
136
+ if (error != null ) {
137
+ // Consent not obtained in current session.
138
+ logE(" ${error.errorCode} : ${error.message} " )
139
+ }
140
+
141
+ if (googleMobileAdsConsentManager.canRequestAds) {
142
+ initializeMobileAdsSdk()
143
+ }
144
+
145
+ if (googleMobileAdsConsentManager.isPrivacyOptionsRequired) {
146
+ // Regenerate the options menu to include a privacy setting.
147
+ invalidateOptionsMenu()
148
+ }
149
+ }
150
+
151
+ if (googleMobileAdsConsentManager.canRequestAds) {
152
+ initializeMobileAdsSdk()
153
+ }
154
+
155
+ }
156
+
157
+ private fun setupRemoteConfig () {
158
+ val remoteConfig: FirebaseRemoteConfig = Firebase .remoteConfig
159
+ remoteConfig.setDefaultsAsync(R .xml.remote_config_defaults)
160
+ remoteConfig.activate()
161
+ remoteConfig.fetchAndActivate().addOnCompleteListener(this ) {
162
+ if (it.isSuccessful) {
163
+ logD(" Remote config fetch success" )
164
+ } else {
165
+ logD(" Remote config fetch failed" )
166
+ }
167
+ }
85
168
}
86
169
87
170
private val buttonClick = View .OnClickListener {
@@ -329,6 +412,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
329
412
330
413
override fun onCreateOptionsMenu (menu : Menu ): Boolean {
331
414
menuInflater.inflate(R .menu.main_menu, menu)
415
+ val privacySettings = menu.findItem(R .id.privacy_settings)
416
+ privacySettings?.isVisible = googleMobileAdsConsentManager.isPrivacyOptionsRequired
332
417
return super .onCreateOptionsMenu(menu)
333
418
}
334
419
@@ -359,14 +444,17 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
359
444
logEvent(CLICK_SETTINGS )
360
445
startActivity(Intent (this , SettingsActivity ::class .java))
361
446
}
447
+
362
448
R .id.history -> {
363
449
logEvent(CLICK_HISTORY )
364
450
startActivity(Intent (this , HistoryActivity ::class .java))
365
451
}
452
+
366
453
R .id.about -> {
367
454
logEvent(CLICK_ABOUT )
368
455
startActivity(Intent (this , AboutActivity ::class .java))
369
456
}
457
+
370
458
R .id.share -> {
371
459
val sharedEquation = getShareEquation()
372
460
if (sharedEquation.isNotEmpty()) {
@@ -385,10 +473,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
385
473
Toast .makeText(this , getString(R .string.share_error), Toast .LENGTH_SHORT ).show()
386
474
}
387
475
}
476
+
388
477
R .id.tutorial -> {
389
478
logEvent(CLICK_TUTORIAL )
390
479
showTutorial()
391
480
}
481
+
482
+ R .id.privacy_settings -> {
483
+ logEvent(CLICK_PRIVACY_SETTINGS )
484
+ googleMobileAdsConsentManager.showPrivacyOptionsForm(this ) { formError ->
485
+ if (formError != null ) {
486
+ logE(" ${formError.errorCode} : ${formError.message} " )
487
+ Toast .makeText(this , formError.message, Toast .LENGTH_SHORT ).show()
488
+ }
489
+ }
490
+ }
392
491
}
393
492
return super .onOptionsItemSelected(item)
394
493
}
0 commit comments