Skip to content

Commit 2b831eb

Browse files
authored
Merge pull request #10 from armancodv/config
config
2 parents ed1c399 + c5b6154 commit 2b831eb

40 files changed

+255
-191
lines changed

app/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ dependencies {
100100
implementation 'com.google.firebase:firebase-crashlytics-ktx'
101101
implementation 'com.google.firebase:firebase-analytics-ktx'
102102
implementation 'com.google.firebase:firebase-perf-ktx'
103+
implementation 'com.google.firebase:firebase-config-ktx'
104+
105+
// json
106+
implementation 'com.google.code.gson:gson:2.8.6'
103107

104108
testImplementation 'junit:junit:4.13.2'
105109
androidTestImplementation 'androidx.test.ext:junit:1.1.2'

app/src/debug/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.armanco.integral">
44

5+
<uses-permission android:name="android.permission.INTERNET" />
56
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
67
<uses-permission android:name="android.permission.WAKE_LOCK"/>
78
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.armanco.integral">
44

5+
<uses-permission android:name="android.permission.INTERNET" />
6+
57
<application
68
android:name=".IntegralApp"
79
android:allowBackup="true"

app/src/main/java/com/armanco/integral/AppModule.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import android.content.Context
44
import androidx.room.Room
55
import com.armanco.integral.managers.db.Db
66
import com.armanco.integral.utils.facade.EventFacade
7+
import com.google.firebase.ktx.Firebase
8+
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
9+
import com.google.firebase.remoteconfig.ktx.remoteConfig
10+
import com.google.firebase.remoteconfig.ktx.remoteConfigSettings
711
import dagger.Module
812
import dagger.Provides
913
import dagger.hilt.InstallIn
@@ -36,4 +40,16 @@ object AppModule {
3640
@Singleton
3741
@Provides
3842
fun provideEventFacade() = EventFacade()
43+
44+
@Singleton
45+
@Provides
46+
fun provideRemoteConfig(): FirebaseRemoteConfig {
47+
val remoteConfig = Firebase.remoteConfig
48+
val configSettings = remoteConfigSettings {
49+
minimumFetchIntervalInSeconds = 3600
50+
}
51+
remoteConfig.setConfigSettingsAsync(configSettings)
52+
return remoteConfig
53+
}
54+
3955
}

app/src/main/java/com/armanco/integral/MainActivity.kt

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
11
package com.armanco.integral
22

33
import android.os.Bundle
4-
import android.view.View
4+
import androidx.activity.viewModels
55
import androidx.appcompat.app.AppCompatActivity
66
import androidx.navigation.fragment.NavHostFragment
77
import androidx.navigation.ui.AppBarConfiguration
88
import androidx.navigation.ui.setupWithNavController
9+
import com.armanco.integral.utils.extensions.configAds
910
import com.armanco.integral.utils.extensions.isPersian
1011
import com.armanco.integral.utils.extensions.isPro
1112
import com.armanco.integral.utils.extensions.setLocale
12-
import com.armanco.integral.utils.facade.EventFacade
1313
import com.google.android.gms.ads.AdRequest
14+
import com.google.android.gms.ads.AdSize
15+
import com.google.android.gms.ads.AdView
1416
import com.google.android.gms.ads.MobileAds
1517
import dagger.hilt.android.AndroidEntryPoint
1618
import kotlinx.android.synthetic.main.activity_main.*
1719
import java.util.*
18-
import javax.inject.Inject
20+
1921

2022
@AndroidEntryPoint
2123
class MainActivity: AppCompatActivity() {
2224

23-
@Inject
24-
lateinit var eventFacade: EventFacade
25-
2625
override fun onCreate(savedInstanceState: Bundle?) {
2726
super.onCreate(savedInstanceState)
2827
setContentView(R.layout.activity_main)
29-
if(!isPro) initAdMob()
30-
else removeAdMob()
28+
val model: MainViewModel by viewModels()
29+
model.initEvents(this)
30+
model.configAds.observe(this) {
31+
if(!isPro) initAdMob(it?.bannerId)
32+
else removeAdMob()
33+
}
34+
model.remoteConfig.fetchAndActivate().addOnCompleteListener(this) {
35+
model.configAds.postValue(model.remoteConfig.configAds)
36+
}
37+
3138
initToolbar()
32-
eventFacade.init(this)
3339
}
3440

3541
override fun onResume() {
@@ -39,14 +45,21 @@ class MainActivity: AppCompatActivity() {
3945
}
4046
}
4147

42-
private fun initAdMob() {
48+
private fun initAdMob(bannerId: String?) {
4349
MobileAds.initialize(this)
44-
val adRequest = AdRequest.Builder().build()
45-
adView?.loadAd(adRequest)
50+
removeAdMob()
51+
val adView = AdView(this)
52+
adView.adSize = AdSize.BANNER
53+
adView.adUnitId = bannerId
54+
if (adView.adSize != null && adView.adUnitId != null) {
55+
val adRequest = AdRequest.Builder().build()
56+
adView.loadAd(adRequest)
57+
adContainer?.addView(adView)
58+
}
4659
}
4760

4861
private fun removeAdMob() {
49-
adView?.visibility = View.GONE
62+
adContainer?.removeAllViews()
5063
}
5164

5265
private fun initToolbar() {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.armanco.integral
2+
3+
import android.content.Context
4+
import androidx.lifecycle.MutableLiveData
5+
import androidx.lifecycle.ViewModel
6+
import com.armanco.integral.utils.extensions.configAds
7+
import com.armanco.integral.utils.facade.EventFacade
8+
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
9+
import dagger.hilt.android.lifecycle.HiltViewModel
10+
import javax.inject.Inject
11+
12+
@HiltViewModel
13+
class MainViewModel @Inject constructor(
14+
private val eventFacade: EventFacade,
15+
val remoteConfig: FirebaseRemoteConfig,
16+
): ViewModel() {
17+
var configAds = MutableLiveData(remoteConfig.configAds)
18+
19+
fun initEvents(context: Context) {
20+
eventFacade.init(context)
21+
}
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.armanco.integral.models
2+
3+
data class ConfigAds (
4+
val bannerId: String? = null,
5+
val interstitialId: String? = null
6+
) {
7+
companion object {
8+
const val KEY = "ads"
9+
}
10+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.armanco.integral.models
2+
3+
data class ConfigLinks (
4+
val proPackageName: String? = null,
5+
val reportBug: String? = null,
6+
val contribute: String? = null,
7+
val privacy: String? = null,
8+
val terms: String? = null,
9+
) {
10+
companion object {
11+
const val KEY = "links"
12+
const val PRO_PACKAGE_NAME_DEFAULT = "com.armanco.integral_pro"
13+
const val REPORT_BUG_DEFAULT = "https://github.com/armancodv/integral/issues"
14+
const val CONTRIBUTE_DEFAULT = "https://github.com/armancodv/integral"
15+
const val PRIVACY_DEFAULT = "https://github.com/armancodv/integral/blob/master/privacy/PRIVACY-POLICY.md"
16+
const val TERMS_DEFAULT = "https://github.com/armancodv/integral/blob/master/privacy/TERMS-AND-CONDITIONS.md"
17+
}
18+
}

app/src/main/java/com/armanco/integral/navigation/image/ImageFragment.kt

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import com.armanco.integral.R
88
import com.armanco.integral.utils.extensions.isPro
99
import com.google.android.gms.ads.AdListener
1010
import com.google.android.gms.ads.AdRequest
11-
import com.google.android.gms.ads.InterstitialAd
11+
import com.google.android.gms.ads.interstitial.InterstitialAd;
12+
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
1213
import com.google.android.gms.ads.LoadAdError
1314
import dagger.hilt.android.AndroidEntryPoint
1415
import kotlinx.android.synthetic.main.fragment_image.*
@@ -22,24 +23,29 @@ class ImageFragment: Fragment(R.layout.fragment_image) {
2223
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2324
super.onViewCreated(view, savedInstanceState)
2425
model.load()
25-
if(!isPro) showInterstitialAd()
26+
model.configAds.observe(viewLifecycleOwner) {
27+
if(!isPro) showInterstitialAd(model.configAds.value?.interstitialId)
28+
}
2629
arguments?.getInt(IMAGE_KEY)?.let { photoView?.setImageResource(it) }
2730
}
2831

29-
private fun showInterstitialAd() {
30-
mInterstitialAd = InterstitialAd(activity)
31-
mInterstitialAd?.adUnitId = "ca-app-pub-4301546764905932/6653178697"
32-
val adRequest = AdRequest.Builder().build()
33-
mInterstitialAd?.loadAd(adRequest)
34-
mInterstitialAd?.adListener = object : AdListener() {
35-
override fun onAdLoaded() {
36-
mInterstitialAd?.show()
37-
}
38-
override fun onAdFailedToLoad(adError: LoadAdError) {}
39-
override fun onAdOpened() {}
40-
override fun onAdClicked() {}
41-
override fun onAdLeftApplication() {}
42-
override fun onAdClosed() {}
32+
private fun showInterstitialAd(interstitialId: String?) {
33+
if (activity != null && interstitialId != null) {
34+
val adRequest = AdRequest.Builder().build()
35+
InterstitialAd.load(
36+
requireContext(),
37+
interstitialId,
38+
adRequest,
39+
object : InterstitialAdLoadCallback() {
40+
override fun onAdFailedToLoad(adError: LoadAdError) {
41+
mInterstitialAd = null
42+
}
43+
44+
override fun onAdLoaded(interstitialAd: InterstitialAd) {
45+
mInterstitialAd = interstitialAd
46+
mInterstitialAd?.show(activity!!)
47+
}
48+
})
4349
}
4450
}
4551

app/src/main/java/com/armanco/integral/navigation/image/ImageViewModel.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ package com.armanco.integral.navigation.image
22

33
import androidx.lifecycle.MutableLiveData
44
import androidx.lifecycle.ViewModel
5-
import androidx.lifecycle.viewModelScope
6-
import com.armanco.integral.managers.repository.FormulaRepository
7-
import com.armanco.integral.models.Formula
5+
import com.armanco.integral.utils.extensions.configAds
86
import com.armanco.integral.utils.facade.EventFacade
7+
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
98
import dagger.hilt.android.lifecycle.HiltViewModel
10-
import kotlinx.coroutines.launch
119
import javax.inject.Inject
1210

1311
@HiltViewModel
1412
class ImageViewModel @Inject constructor(
15-
private val eventFacade: EventFacade
16-
): ViewModel() {
13+
private val eventFacade: EventFacade,
14+
private val remoteConfig: FirebaseRemoteConfig,
15+
) : ViewModel() {
16+
var configAds = MutableLiveData(remoteConfig.configAds)
1717
fun load() {
1818
eventFacade.screenView(ImageFragment::class.java.simpleName)
1919
}

0 commit comments

Comments
 (0)