[#11] Change how settings adapter work. Directly set system settings in MainActivity.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -1,83 +0,0 @@
|
|||||||
package me.zobrist.tichucounter
|
|
||||||
|
|
||||||
import android.content.SharedPreferences
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.WindowManager
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
|
||||||
import androidx.core.os.LocaleListCompat
|
|
||||||
import androidx.preference.PreferenceManager
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
|
||||||
import me.zobrist.tichucounter.domain.Language
|
|
||||||
import me.zobrist.tichucounter.domain.SettingsAdapter
|
|
||||||
import me.zobrist.tichucounter.domain.Theme
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
|
||||||
abstract class BaseActivity : AppCompatActivity(),
|
|
||||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
lateinit var settingsAdapter: SettingsAdapter
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
|
|
||||||
keepScreenOn(settingsAdapter.keepScreenOn)
|
|
||||||
updateTheme(settingsAdapter.theme)
|
|
||||||
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.registerOnSharedPreferenceChangeListener(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.registerOnSharedPreferenceChangeListener(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onPause() {
|
|
||||||
super.onPause()
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.unregisterOnSharedPreferenceChangeListener(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
|
|
||||||
when (key) {
|
|
||||||
settingsAdapter.language::class.simpleName -> setLanguage(settingsAdapter.language)
|
|
||||||
settingsAdapter.keepScreenOn::class.simpleName -> keepScreenOn(settingsAdapter.keepScreenOn)
|
|
||||||
settingsAdapter.theme::class.simpleName -> updateTheme(settingsAdapter.theme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun updateTheme(theme: Theme) {
|
|
||||||
|
|
||||||
val themeValue = when (theme) {
|
|
||||||
Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO
|
|
||||||
Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES
|
|
||||||
Theme.DEFAULT -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
|
|
||||||
}
|
|
||||||
|
|
||||||
if (themeValue != AppCompatDelegate.getDefaultNightMode()) {
|
|
||||||
AppCompatDelegate.setDefaultNightMode(themeValue)
|
|
||||||
delegate.applyDayNight()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun keepScreenOn(keepOn: Boolean) {
|
|
||||||
if (keepOn) {
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
|
||||||
} else {
|
|
||||||
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setLanguage(language: Language) {
|
|
||||||
val currentLocale = AppCompatDelegate.getApplicationLocales()[0].toString()
|
|
||||||
|
|
||||||
if (language.value != currentLocale) {
|
|
||||||
val newLocale = LocaleListCompat.forLanguageTags(language.value)
|
|
||||||
AppCompatDelegate.setApplicationLocales(newLocale)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
package me.zobrist.tichucounter
|
package me.zobrist.tichucounter
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.WindowManager
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.*
|
import androidx.compose.material.icons.filled.*
|
||||||
@@ -15,6 +18,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.core.os.LocaleListCompat
|
||||||
import androidx.navigation.NavDestination.Companion.hierarchy
|
import androidx.navigation.NavDestination.Companion.hierarchy
|
||||||
import androidx.navigation.NavGraph.Companion.findStartDestination
|
import androidx.navigation.NavGraph.Companion.findStartDestination
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
@@ -26,8 +30,7 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
|||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.zobrist.tichucounter.domain.NavigationAction
|
import me.zobrist.tichucounter.domain.*
|
||||||
import me.zobrist.tichucounter.domain.TopBarAction
|
|
||||||
import me.zobrist.tichucounter.repository.GameRepository
|
import me.zobrist.tichucounter.repository.GameRepository
|
||||||
import me.zobrist.tichucounter.ui.AppTheme
|
import me.zobrist.tichucounter.ui.AppTheme
|
||||||
import me.zobrist.tichucounter.ui.MainViewModel
|
import me.zobrist.tichucounter.ui.MainViewModel
|
||||||
@@ -39,11 +42,14 @@ import me.zobrist.tichucounter.ui.settings.SettingsViewModel
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class MainActivity : BaseActivity() {
|
class MainActivity : AppCompatActivity(), ISettingsChangeListener {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var gameRepository: GameRepository
|
lateinit var gameRepository: GameRepository
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var settingsAdapter: SettingsAdapter
|
||||||
|
|
||||||
private val counterViewModel: CounterViewModel by viewModels()
|
private val counterViewModel: CounterViewModel by viewModels()
|
||||||
private val historyViewModel: HistoryViewModel by viewModels()
|
private val historyViewModel: HistoryViewModel by viewModels()
|
||||||
private val settingsViewModel: SettingsViewModel by viewModels()
|
private val settingsViewModel: SettingsViewModel by viewModels()
|
||||||
@@ -53,6 +59,8 @@ class MainActivity : BaseActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
settingsAdapter.registerOnChangeListener(this)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
AppTheme {
|
AppTheme {
|
||||||
val systemUiController = rememberSystemUiController()
|
val systemUiController = rememberSystemUiController()
|
||||||
@@ -62,6 +70,41 @@ class MainActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
settingsAdapter.unregisterOnChangeListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLanguageChanged(language: Language) {
|
||||||
|
val currentLocale = AppCompatDelegate.getApplicationLocales()[0].toString()
|
||||||
|
|
||||||
|
if (language.value != currentLocale) {
|
||||||
|
val newLocale = LocaleListCompat.forLanguageTags(language.value)
|
||||||
|
AppCompatDelegate.setApplicationLocales(newLocale)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onThemeChanged(theme: Theme) {
|
||||||
|
val themeValue = when (theme) {
|
||||||
|
Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO
|
||||||
|
Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES
|
||||||
|
Theme.DEFAULT -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
|
||||||
|
}
|
||||||
|
|
||||||
|
if (themeValue != AppCompatDelegate.getDefaultNightMode()) {
|
||||||
|
AppCompatDelegate.setDefaultNightMode(themeValue)
|
||||||
|
delegate.applyDayNight()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onScreenOnChanged(keepOn: KeepScreenOn) {
|
||||||
|
if (keepOn.value) {
|
||||||
|
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||||
|
} else {
|
||||||
|
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun MyScaffoldLayout(
|
fun MyScaffoldLayout(
|
||||||
|
|||||||
@@ -5,37 +5,90 @@ import androidx.appcompat.app.AppCompatDelegate.getApplicationLocales
|
|||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
enum class Theme { DEFAULT, DARK, LIGHT }
|
enum class Theme { DEFAULT, DARK, LIGHT }
|
||||||
enum class Language(val value: String) { ENGLISH("en"), GERMAN("de") }
|
enum class Language(val value: String) { ENGLISH("en"), GERMAN("de") }
|
||||||
|
enum class KeepScreenOn(val value: Boolean) { ON(true), OFF(false) }
|
||||||
|
|
||||||
|
interface ISettingsChangeListener {
|
||||||
|
fun onLanguageChanged(language: Language)
|
||||||
|
fun onThemeChanged(theme: Theme)
|
||||||
|
fun onScreenOnChanged(keepOn: KeepScreenOn)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
class SettingsAdapter @Inject constructor(@ApplicationContext private val context: Context) {
|
class SettingsAdapter @Inject constructor(@ApplicationContext private val context: Context) {
|
||||||
|
|
||||||
private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
private var listenerList = mutableListOf<ISettingsChangeListener>()
|
||||||
|
|
||||||
val language: Language
|
var language: Language
|
||||||
get() {
|
private set
|
||||||
return try {
|
|
||||||
var setting = sharedPreferences.getString(Language::class.simpleName, null)
|
var theme: Theme
|
||||||
enumValueOf(setting!!)
|
private set
|
||||||
} catch (_: NullPointerException) {
|
|
||||||
val current = getCurrentAppLanguage()
|
var keepScreenOn: KeepScreenOn
|
||||||
setLanguage(current)
|
private set
|
||||||
current
|
|
||||||
}
|
init {
|
||||||
|
language = try {
|
||||||
|
enumValueOf(sharedPreferences.getString(Language::class.simpleName, null)!!)
|
||||||
|
} catch (_: NullPointerException) {
|
||||||
|
getCurrentAppLanguage()
|
||||||
}
|
}
|
||||||
|
|
||||||
val theme: Theme
|
theme = try {
|
||||||
get() {
|
enumValueOf(sharedPreferences.getString(Theme::class.simpleName, null)!!)
|
||||||
val setting = sharedPreferences.getString(Theme::class.simpleName, Theme.DEFAULT.name)
|
} catch (_: java.lang.Exception) {
|
||||||
return enumValueOf(setting!!)
|
Theme.DEFAULT
|
||||||
}
|
}
|
||||||
|
|
||||||
val keepScreenOn: Boolean
|
keepScreenOn = try {
|
||||||
get() {
|
enumValueOf(sharedPreferences.getString(KeepScreenOn::class.simpleName, null)!!)
|
||||||
return sharedPreferences.getBoolean("keep_screen_on", false)
|
} catch (_: java.lang.Exception) {
|
||||||
|
KeepScreenOn.OFF
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun registerOnChangeListener(listener: ISettingsChangeListener) {
|
||||||
|
listenerList.add(listener)
|
||||||
|
|
||||||
|
listener.onThemeChanged(theme)
|
||||||
|
listener.onLanguageChanged(language)
|
||||||
|
listener.onScreenOnChanged(keepScreenOn)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unregisterOnChangeListener(listener: ISettingsChangeListener?) {
|
||||||
|
if (listener != null) {
|
||||||
|
listenerList.remove(listener)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setLanguage(language: Language) {
|
||||||
|
this.language = language
|
||||||
|
updatePreference(Language::class.simpleName, language.name)
|
||||||
|
notifyListeners(language)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setTheme(theme: Theme) {
|
||||||
|
this.theme = theme
|
||||||
|
updatePreference(Theme::class.simpleName, theme.name)
|
||||||
|
notifyListeners(theme)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setKeepScreenOn(setting: KeepScreenOn) {
|
||||||
|
this.keepScreenOn = setting
|
||||||
|
updatePreference(KeepScreenOn::class.simpleName, setting.name)
|
||||||
|
notifyListeners(setting)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updatePreference(name: String?, value: String) {
|
||||||
|
val editor = sharedPreferences.edit()
|
||||||
|
editor.putString(name, value)
|
||||||
|
editor.apply()
|
||||||
|
}
|
||||||
|
|
||||||
private fun getCurrentAppLanguage(): Language {
|
private fun getCurrentAppLanguage(): Language {
|
||||||
return when (getApplicationLocales()[0].toString()) {
|
return when (getApplicationLocales()[0].toString()) {
|
||||||
@@ -44,22 +97,22 @@ class SettingsAdapter @Inject constructor(@ApplicationContext private val contex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setLanguage(language: Language) {
|
private fun notifyListeners(language: Language) {
|
||||||
val editor = sharedPreferences.edit()
|
listenerList.forEach {
|
||||||
editor.putString(Language::class.simpleName, language.name)
|
it.onLanguageChanged(language)
|
||||||
editor.apply()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setTheme(theme: Theme) {
|
private fun notifyListeners(theme: Theme) {
|
||||||
val editor = sharedPreferences.edit()
|
listenerList.forEach {
|
||||||
editor.putString(Theme::class.simpleName, theme.name)
|
it.onThemeChanged(theme)
|
||||||
editor.apply()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setKeepScreenOn(setting: Boolean) {
|
private fun notifyListeners(keepScreenOn: KeepScreenOn) {
|
||||||
val editor = sharedPreferences.edit()
|
listenerList.forEach {
|
||||||
editor.putBoolean("keep_screen_on", setting)
|
it.onScreenOnChanged(keepScreenOn)
|
||||||
editor.apply()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import me.zobrist.tichucounter.R
|
import me.zobrist.tichucounter.R
|
||||||
|
import me.zobrist.tichucounter.domain.KeepScreenOn
|
||||||
import me.zobrist.tichucounter.domain.Language
|
import me.zobrist.tichucounter.domain.Language
|
||||||
import me.zobrist.tichucounter.domain.Theme
|
import me.zobrist.tichucounter.domain.Theme
|
||||||
import me.zobrist.tichucounter.ui.AppTheme
|
import me.zobrist.tichucounter.ui.AppTheme
|
||||||
@@ -38,7 +39,7 @@ val themeMap = mapOf(
|
|||||||
@Composable
|
@Composable
|
||||||
fun SettingsView(viewModel: SettingsViewModel) {
|
fun SettingsView(viewModel: SettingsViewModel) {
|
||||||
SettingsView(
|
SettingsView(
|
||||||
viewModel.screenOn,
|
viewModel.screenOn.value,
|
||||||
viewModel.language,
|
viewModel.language,
|
||||||
viewModel.theme,
|
viewModel.theme,
|
||||||
{ viewModel.updateScreenOn(it) },
|
{ viewModel.updateScreenOn(it) },
|
||||||
@@ -51,7 +52,7 @@ fun SettingsView(
|
|||||||
valueScreenOn: Boolean = true,
|
valueScreenOn: Boolean = true,
|
||||||
valueLanguage: Language = Language.ENGLISH,
|
valueLanguage: Language = Language.ENGLISH,
|
||||||
valueTheme: Theme = Theme.DARK,
|
valueTheme: Theme = Theme.DARK,
|
||||||
updateScreenOn: (Boolean) -> Unit = {},
|
updateScreenOn: (KeepScreenOn) -> Unit = {},
|
||||||
updateLanguage: (Language) -> Unit = {},
|
updateLanguage: (Language) -> Unit = {},
|
||||||
updateTheme: (Theme) -> Unit = {}
|
updateTheme: (Theme) -> Unit = {}
|
||||||
) {
|
) {
|
||||||
@@ -59,7 +60,7 @@ fun SettingsView(
|
|||||||
BooleanSetting(
|
BooleanSetting(
|
||||||
stringResource(R.string.keep_screen_on),
|
stringResource(R.string.keep_screen_on),
|
||||||
valueScreenOn
|
valueScreenOn
|
||||||
) { updateScreenOn(it) }
|
) { updateScreenOn(if (it) KeepScreenOn.ON else KeepScreenOn.OFF) }
|
||||||
|
|
||||||
StringSetting(
|
StringSetting(
|
||||||
stringResource(R.string.choose_language_text),
|
stringResource(R.string.choose_language_text),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateOf
|
|||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import me.zobrist.tichucounter.domain.KeepScreenOn
|
||||||
import me.zobrist.tichucounter.domain.Language
|
import me.zobrist.tichucounter.domain.Language
|
||||||
import me.zobrist.tichucounter.domain.SettingsAdapter
|
import me.zobrist.tichucounter.domain.SettingsAdapter
|
||||||
import me.zobrist.tichucounter.domain.Theme
|
import me.zobrist.tichucounter.domain.Theme
|
||||||
@@ -20,7 +21,7 @@ class SettingsViewModel @Inject constructor(private val settings: SettingsAdapte
|
|||||||
var theme by mutableStateOf(settings.theme)
|
var theme by mutableStateOf(settings.theme)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var screenOn by mutableStateOf(false)
|
var screenOn by mutableStateOf(settings.keepScreenOn)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
fun updateLanguage(language: Language) {
|
fun updateLanguage(language: Language) {
|
||||||
@@ -33,7 +34,7 @@ class SettingsViewModel @Inject constructor(private val settings: SettingsAdapte
|
|||||||
this.theme = settings.theme
|
this.theme = settings.theme
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateScreenOn(value: Boolean) {
|
fun updateScreenOn(value: KeepScreenOn) {
|
||||||
settings.setKeepScreenOn(value)
|
settings.setKeepScreenOn(value)
|
||||||
screenOn = settings.keepScreenOn
|
screenOn = settings.keepScreenOn
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user