Skip to content

Commit

Permalink
Replace preferences by datastore
Browse files Browse the repository at this point in the history
  • Loading branch information
Drjacky committed Feb 8, 2021
1 parent dddbd18 commit 285892c
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 30 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ dependencies {
implementation(Depends.Libraries.fragment_ktx)
implementation(Depends.Libraries.paging_runtime_ktx)
implementation(Depends.Libraries.paging_rx_ktx)
implementation(Depends.Libraries.preference_ktx)
implementation(Depends.Libraries.dataStore_preferences)
//dependency injection
implementation(Depends.Libraries.hilt_android)
kapt(Depends.Libraries.hilt_android_compiler)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@ package app.web.drjackycv.mvvmtemplate.application
import android.os.StrictMode
import android.os.StrictMode.ThreadPolicy
import android.os.StrictMode.VmPolicy
import androidx.appcompat.app.AppCompatDelegate
import androidx.multidex.MultiDexApplication
import androidx.preference.PreferenceManager
import app.web.drjackycv.domain.extension.allowReads
import app.web.drjackycv.mvvmtemplate.BuildConfig
import app.web.drjackycv.presentation.base.preference.Settings
import app.web.drjackycv.presentation.datastore.DataStoreManager
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
import javax.inject.Inject


@HiltAndroidApp
class MVVMTemplateApplication : MultiDexApplication() {

@Inject
lateinit var dataStoreManager: DataStoreManager

override fun onCreate() {
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
Expand All @@ -36,16 +37,7 @@ class MVVMTemplateApplication : MultiDexApplication() {
)
}
super.onCreate()
setNightMode()
Timber.plant(Timber.DebugTree())
}

private fun setNightMode() {
allowReads {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val mode = prefs.getInt(Settings.NIGHT_MODE, Settings.MODE_NIGHT_DEFAULT)
AppCompatDelegate.setDefaultNightMode(mode)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.content.res.Resources
import app.web.drjackycv.data.network.BaseHttpClient
import app.web.drjackycv.data.network.BaseRetrofit
import app.web.drjackycv.domain.extension.allowWrites
import app.web.drjackycv.presentation.datastore.DataStoreManager
import com.chuckerteam.chucker.api.ChuckerCollector
import com.chuckerteam.chucker.api.RetentionManager
import com.google.gson.Gson
Expand Down Expand Up @@ -50,4 +51,9 @@ class AppModule {
)
}

@Provides
@Singleton
fun dataStoreManager(@ApplicationContext appContext: Context): DataStoreManager =
DataStoreManager(appContext)

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ object Depends {
const val lottieVersion = "3.6.0"
const val glideVersion = "4.12.0"
const val autoDispose = "1.4.0"
const val preferenceVersion = "1.1.1"
const val dataStorePreferenceVersion = "1.0.0-alpha06"

const val mockitoKotlinVersion = "2.2.0"
const val mockitoCoreVersion = "3.6.28"
Expand Down Expand Up @@ -149,8 +149,8 @@ object Depends {
const val chucker = "com.github.chuckerteam.chucker:library:${Versions.chuckerVersion}"
const val chucker_no_op =
"com.github.chuckerteam.chucker:library-no-op:${Versions.chuckerVersion}"
const val preference_ktx =
"androidx.preference:preference-ktx:${Versions.preferenceVersion}"
const val dataStore_preferences =
"androidx.datastore:datastore-preferences:${Versions.dataStorePreferenceVersion}"
}

object Environments {
Expand Down
2 changes: 1 addition & 1 deletion presentation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ dependencies {
implementation(Depends.Libraries.android_core_ktx)
implementation(Depends.Libraries.fragment_ktx)
implementation(Depends.Libraries.recyclerview)
implementation(Depends.Libraries.preference_ktx)
implementation(Depends.Libraries.dataStore_preferences)
//reactive
implementation(Depends.Libraries.rx_java_android)
implementation(Depends.Libraries.rx_binding3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package app.web.drjackycv.presentation.base.preference

import android.os.Build
import androidx.appcompat.app.AppCompatDelegate
import androidx.datastore.preferences.core.intPreferencesKey

object Settings {

const val NIGHT_MODE = "night_mode"
val NIGHT_MODE = intPreferencesKey("night_mode")

val MODE_NIGHT_DEFAULT =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package app.web.drjackycv.presentation.datastore

import android.content.Context
import androidx.appcompat.app.AppCompatDelegate
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.createDataStore
import app.web.drjackycv.presentation.base.preference.Settings
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class DataStoreManager(appContext: Context) {

private val settingsDataStore = appContext.createDataStore("settings")

suspend fun setThemeMode(mode: Int) {
settingsDataStore.edit { settings ->
settings[Settings.NIGHT_MODE] = mode
}
}

val themeMode: Flow<Int> = settingsDataStore.data.map { preferences ->
preferences[Settings.NIGHT_MODE] ?: AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@ package app.web.drjackycv.presentation.main
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.preference.PreferenceManager
import app.web.drjackycv.domain.extension.allowReads
import app.web.drjackycv.presentation.R
import app.web.drjackycv.presentation.base.preference.Settings
import app.web.drjackycv.presentation.databinding.ActivityMainBinding
import app.web.drjackycv.presentation.datastore.DataStoreManager
import app.web.drjackycv.presentation.extension.setOnReactiveClickListener
import app.web.drjackycv.presentation.extension.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collect
import javax.inject.Inject


@AndroidEntryPoint
Expand All @@ -22,6 +26,10 @@ class MainActivity : AppCompatActivity() {
private val navController: NavController by lazy {
findNavController(R.id.activityMainChooseHostFragment)
}
private var uiStateJob: Job? = null

@Inject
lateinit var dataStoreManager: DataStoreManager

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -31,24 +39,31 @@ class MainActivity : AppCompatActivity() {

override fun onSupportNavigateUp() = navController.navigateUp()

override fun onStop() {
uiStateJob?.cancel()
super.onStop()
}

private fun setupUI() {
val mode = AppCompatDelegate.getDefaultNightMode()
setNightMode(mode)
lifecycleScope.launchWhenStarted {
dataStoreManager.themeMode.collect { mode ->
setNightMode(mode)
}
}
}