Skip to content

Commit b6a1feb

Browse files
committed
feat: add admob
1 parent f82bc37 commit b6a1feb

File tree

27 files changed

+364
-17
lines changed

27 files changed

+364
-17
lines changed

.idea/gradle.xml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/kotlinc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ dependencies {
109109
implementation 'com.google.firebase:firebase-crashlytics-ktx'
110110
implementation 'com.google.firebase:firebase-analytics-ktx'
111111
implementation 'com.google.firebase:firebase-perf-ktx'
112+
implementation("com.google.firebase:firebase-config")
112113

113114
// room
114115
def roomVersion = "2.6.1"
@@ -120,6 +121,10 @@ dependencies {
120121
implementation("com.google.android.play:core:1.10.3")
121122
implementation("com.google.android.play:core-ktx:1.8.1")
122123

124+
// google adMob
125+
implementation 'com.google.android.gms:play-services-ads:22.6.0'
126+
implementation("com.google.android.ump:user-messaging-platform:2.1.0")
127+
123128
// test
124129
testImplementation 'junit:junit:4.13.2'
125130

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
android:label="@string/app_name"
1818
android:supportsRtl="true"
1919
android:theme="@style/BaseTheme">
20+
<meta-data
21+
android:name="com.google.android.gms.ads.APPLICATION_ID"
22+
android:value="ca-app-pub-2673776259760115~8162653366"/>
2023
<activity
2124
android:name=".ui.main.MainActivity"
2225
android:exported="true">

app/src/main/java/com/gigaworks/tech/calculator/ui/main/MainActivity.kt

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ import com.gigaworks.tech.calculator.ui.main.helper.removeNumberSeparator
4242
import com.gigaworks.tech.calculator.ui.main.viewmodel.MainViewModel
4343
import com.gigaworks.tech.calculator.ui.settings.SettingsActivity
4444
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
4547
import com.gigaworks.tech.calculator.util.AccentTheme
4648
import com.gigaworks.tech.calculator.util.AngleType
4749
import com.gigaworks.tech.calculator.util.AppPreference
@@ -51,13 +53,25 @@ import com.gigaworks.tech.calculator.util.CLICK_ABOUT
5153
import com.gigaworks.tech.calculator.util.CLICK_CLEAR
5254
import com.gigaworks.tech.calculator.util.CLICK_HISTORY
5355
import com.gigaworks.tech.calculator.util.CLICK_MEMORY
56+
import com.gigaworks.tech.calculator.util.CLICK_PRIVACY_SETTINGS
5457
import com.gigaworks.tech.calculator.util.CLICK_SETTINGS
5558
import com.gigaworks.tech.calculator.util.CLICK_TUTORIAL
5659
import com.gigaworks.tech.calculator.util.EVALUATE
60+
import com.gigaworks.tech.calculator.util.GoogleMobileAdsConsentManager
5761
import com.gigaworks.tech.calculator.util.NumberSeparator
5862
import com.gigaworks.tech.calculator.util.SHARE_EXPRESSION
5963
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
6073
import dagger.hilt.android.AndroidEntryPoint
74+
import java.util.concurrent.atomic.AtomicBoolean
6175
import kotlin.math.sqrt
6276

6377

@@ -66,6 +80,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
6680

6781
private val viewModel: MainViewModel by viewModels()
6882
private var mCurrentAnimator: Animator? = null
83+
private val isMobileAdsInitializeCalled = AtomicBoolean(false)
84+
private lateinit var googleMobileAdsConsentManager: GoogleMobileAdsConsentManager
6985

7086
override fun onCreate(savedInstanceState: Bundle?) {
7187
val appPreference = AppPreference(this)
@@ -81,7 +97,74 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
8197
setAppTheme()
8298

8399
// 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+
}
85168
}
86169

87170
private val buttonClick = View.OnClickListener {
@@ -329,6 +412,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
329412

330413
override fun onCreateOptionsMenu(menu: Menu): Boolean {
331414
menuInflater.inflate(R.menu.main_menu, menu)
415+
val privacySettings = menu.findItem(R.id.privacy_settings)
416+
privacySettings?.isVisible = googleMobileAdsConsentManager.isPrivacyOptionsRequired
332417
return super.onCreateOptionsMenu(menu)
333418
}
334419

@@ -359,14 +444,17 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
359444
logEvent(CLICK_SETTINGS)
360445
startActivity(Intent(this, SettingsActivity::class.java))
361446
}
447+
362448
R.id.history -> {
363449
logEvent(CLICK_HISTORY)
364450
startActivity(Intent(this, HistoryActivity::class.java))
365451
}
452+
366453
R.id.about -> {
367454
logEvent(CLICK_ABOUT)
368455
startActivity(Intent(this, AboutActivity::class.java))
369456
}
457+
370458
R.id.share -> {
371459
val sharedEquation = getShareEquation()
372460
if (sharedEquation.isNotEmpty()) {
@@ -385,10 +473,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
385473
Toast.makeText(this, getString(R.string.share_error), Toast.LENGTH_SHORT).show()
386474
}
387475
}
476+
388477
R.id.tutorial -> {
389478
logEvent(CLICK_TUTORIAL)
390479
showTutorial()
391480
}
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+
}
392491
}
393492
return super.onOptionsItemSelected(item)
394493
}

app/src/main/java/com/gigaworks/tech/calculator/ui/main/viewmodel/MainViewModel.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,19 @@ import androidx.lifecycle.viewModelScope
77
import com.gigaworks.tech.calculator.R
88
import com.gigaworks.tech.calculator.domain.History
99
import com.gigaworks.tech.calculator.repository.HistoryRepository
10-
import com.gigaworks.tech.calculator.ui.main.helper.*
11-
import com.gigaworks.tech.calculator.util.*
10+
import com.gigaworks.tech.calculator.ui.main.helper.addNumberSeparator
11+
import com.gigaworks.tech.calculator.ui.main.helper.getResult
12+
import com.gigaworks.tech.calculator.ui.main.helper.isExpressionBalanced
13+
import com.gigaworks.tech.calculator.ui.main.helper.isNumber
14+
import com.gigaworks.tech.calculator.ui.main.helper.prepareExpression
15+
import com.gigaworks.tech.calculator.ui.main.helper.roundMyAnswer
16+
import com.gigaworks.tech.calculator.ui.main.helper.tryBalancingBrackets
17+
import com.gigaworks.tech.calculator.util.AngleType
18+
import com.gigaworks.tech.calculator.util.AppPreference
19+
import com.gigaworks.tech.calculator.util.AppTheme
20+
import com.gigaworks.tech.calculator.util.CalculationException
21+
import com.gigaworks.tech.calculator.util.CalculationMessage
22+
import com.gigaworks.tech.calculator.util.NumberSeparator
1223
import dagger.hilt.android.lifecycle.HiltViewModel
1324
import kotlinx.coroutines.launch
1425
import javax.inject.Inject
@@ -138,7 +149,7 @@ class MainViewModel @Inject constructor(
138149
AppPreference.NUMBER_SEPARATOR,
139150
NumberSeparator.INTERNATIONAL.name
140151
)
141-
return NumberSeparator.values().find { it.name == numberSeparator }
152+
return NumberSeparator.entries.find { it.name == numberSeparator }
142153
?: NumberSeparator.INTERNATIONAL
143154
}
144155

app/src/main/java/com/gigaworks/tech/calculator/util/Constants.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ const val CLICK_HISTORY = "click_history"
2424
//click tutorial
2525
const val CLICK_TUTORIAL = "click_tutorial"
2626

27+
//click privacy settings
28+
const val CLICK_PRIVACY_SETTINGS = "click_privacy_settings"
29+
2730
//click about
2831
const val CLICK_ABOUT = "click_about"
2932

@@ -64,4 +67,10 @@ const val FOLLOW_ME = "follow_me"
6467
const val JOIN_BETA = "join_beta"
6568

6669
//trigger feedback
67-
const val TRIGGER_STORE_FEEDBACK = "trigger_store_feedback"
70+
const val TRIGGER_STORE_FEEDBACK = "trigger_store_feedback"
71+
72+
//disable ads
73+
const val ADS_DISABLED = "ads_disabled"
74+
75+
//enable ads
76+
const val ADS_ENABLED = "ads_enabled"

app/src/main/java/com/gigaworks/tech/calculator/util/ExtensionFunctions.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ fun Activity.logD(msg: String?) {
3737
printLogD(this.getClassName(), msg)
3838
}
3939

40+
fun Activity.logW(msg: String?) {
41+
printLogW(this.getClassName(), msg)
42+
}
43+
4044
fun Activity.logE(msg: String?) {
4145
printLogE(this.getClassName(), msg)
4246
}

0 commit comments

Comments
 (0)