From e09bd26859b0914d175eaea24205ccba1d2c184c Mon Sep 17 00:00:00 2001 From: Fabian Zobrist Date: Thu, 19 Jan 2023 19:38:01 +0100 Subject: [PATCH] Update android studio. Add compose settings screen. --- app/build.gradle | 2 +- .../me/zobrist/tichucounter/BaseActivity.kt | 37 ++++-- .../me/zobrist/tichucounter/MainActivity.kt | 7 +- .../tichucounter/domain/SettingsAdapter.kt | 50 +++++++ .../tichucounter/ui/settings/SettingsView.kt | 122 ++++++++++++++++++ .../ui/settings/SettingsViewModel.kt | 41 ++++++ app/src/main/res/drawable-mdpi/back.png | Bin 3381 -> 0 bytes app/src/main/res/drawable-mdpi/checkmark.png | Bin 9289 -> 0 bytes app/src/main/res/drawable-night/back.png | Bin 3879 -> 0 bytes .../main/res/menu/activity_main_drawer.xml | 20 --- app/src/main/res/menu/menu_counter.xml | 18 --- .../main/res/navigation/mobile_navigation.xml | 24 ---- app/src/main/res/values/arrays.xml | 25 ---- build.gradle | 2 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 245 insertions(+), 107 deletions(-) create mode 100644 app/src/main/java/me/zobrist/tichucounter/domain/SettingsAdapter.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsViewModel.kt delete mode 100644 app/src/main/res/drawable-mdpi/back.png delete mode 100644 app/src/main/res/drawable-mdpi/checkmark.png delete mode 100644 app/src/main/res/drawable-night/back.png delete mode 100644 app/src/main/res/menu/activity_main_drawer.xml delete mode 100644 app/src/main/res/menu/menu_counter.xml delete mode 100644 app/src/main/res/navigation/mobile_navigation.xml delete mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/build.gradle b/app/build.gradle index a4cc544..c10a5fc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ android { targetSdkVersion 33 versionCode versionProperties["versionCode"].toInteger() versionName "1.1.0Beta1" - resConfigs("de", "en") + resConfigs 'de', 'en' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables { diff --git a/app/src/main/java/me/zobrist/tichucounter/BaseActivity.kt b/app/src/main/java/me/zobrist/tichucounter/BaseActivity.kt index a8343a7..a83c63f 100644 --- a/app/src/main/java/me/zobrist/tichucounter/BaseActivity.kt +++ b/app/src/main/java/me/zobrist/tichucounter/BaseActivity.kt @@ -7,17 +7,23 @@ 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) - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) - keepScreenOn(sharedPreferences.getBoolean("screen_on", false)) - updateTheme(sharedPreferences.getString("theme", null)) + keepScreenOn(settingsAdapter.keepScreenOn) + updateTheme(settingsAdapter.theme) PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(this) @@ -37,20 +43,19 @@ abstract class BaseActivity : AppCompatActivity(), override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { when (key) { - "language" -> setLanguage(sharedPreferences.getString(key, null)) - "screen_on" -> keepScreenOn(sharedPreferences.getBoolean(key, false)) - "theme" -> updateTheme(sharedPreferences.getString(key, null)) + 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: String?) { + private fun updateTheme(theme: Theme) { val themeValue = when (theme) { - "light" -> AppCompatDelegate.MODE_NIGHT_NO - "dark" -> AppCompatDelegate.MODE_NIGHT_YES - "default" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO + Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES + Theme.DEFAULT -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM } if (themeValue != AppCompatDelegate.getDefaultNightMode()) { @@ -67,7 +72,13 @@ abstract class BaseActivity : AppCompatActivity(), } } - private fun setLanguage(locale: String?) { + private fun setLanguage(language: Language) { + + val locale = when (language) { + Language.ENGLISH -> "en" + Language.GERMAN -> "de" + else -> null + } val currentLocale = AppCompatDelegate.getApplicationLocales()[0].toString() diff --git a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt b/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt index 7bfe64b..ff0f02b 100644 --- a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt +++ b/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt @@ -31,6 +31,8 @@ import me.zobrist.tichucounter.ui.MainViewModel import me.zobrist.tichucounter.ui.counter.* import me.zobrist.tichucounter.ui.history.HistoryList import me.zobrist.tichucounter.ui.history.HistoryViewModel +import me.zobrist.tichucounter.ui.settings.SettingsView +import me.zobrist.tichucounter.ui.settings.SettingsViewModel import javax.inject.Inject @AndroidEntryPoint @@ -41,6 +43,7 @@ class MainActivity : BaseActivity() { private val counterViewModel: CounterViewModel by viewModels() private val historyViewModel: HistoryViewModel by viewModels() + private val settingsViewModel: SettingsViewModel by viewModels() private val mainViewModel: MainViewModel by viewModels() @@ -79,9 +82,7 @@ class MainActivity : BaseActivity() { } composable("settings") { - Column() { - Text("Settings") - } + SettingsView(settingsViewModel) mainViewModel.setActions(emptyList()) } } diff --git a/app/src/main/java/me/zobrist/tichucounter/domain/SettingsAdapter.kt b/app/src/main/java/me/zobrist/tichucounter/domain/SettingsAdapter.kt new file mode 100644 index 0000000..9d3d636 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/domain/SettingsAdapter.kt @@ -0,0 +1,50 @@ +package me.zobrist.tichucounter.domain + +import android.content.Context +import androidx.preference.PreferenceManager +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +enum class Theme { DEFAULT, DARK, LIGHT } +enum class Language { DEFAULT, GERMAN, ENGLISH } + + +class SettingsAdapter @Inject constructor(@ApplicationContext private val context: Context) { + + private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + val language: Language + get() { + return Language.values()[sharedPreferences.getInt(Language::class.simpleName, 0)] + } + + val theme: Theme + get() { + return Theme.values()[sharedPreferences.getInt(Theme::class.simpleName, 0)] + } + + val keepScreenOn: Boolean + get() { + return sharedPreferences.getBoolean("keep_screen_on", false) + } + + + fun setLanguage(language: Language) { + val editor = sharedPreferences.edit() + editor.putInt(Language::class.simpleName, language.ordinal) + editor.commit() + } + + fun setTheme(theme: Theme) { + val editor = sharedPreferences.edit() + editor.putInt(Theme::class.simpleName, theme.ordinal) + editor.commit() + } + + fun setKeepScreenOn(setting: Boolean) { + val editor = sharedPreferences.edit() + editor.putBoolean("keep_screen_on", setting) + editor.commit() + } + +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt new file mode 100644 index 0000000..75f7d08 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt @@ -0,0 +1,122 @@ +package me.zobrist.tichucounter.ui.settings + +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import me.zobrist.tichucounter.R +import me.zobrist.tichucounter.domain.Language +import me.zobrist.tichucounter.domain.Theme + + +val languageMap = mapOf( + Language.DEFAULT to R.string.android_default_text, + Language.ENGLISH to R.string.english, + Language.GERMAN to R.string.german +) + +val themeMap = mapOf( + Theme.DEFAULT to R.string.android_default_text, + Theme.DARK to R.string.dark, + Theme.LIGHT to R.string.light +) + + +@Composable +fun SettingsView(viewModel: SettingsViewModel) { + SettingsView( + viewModel.screenOn, + viewModel.language, + viewModel.theme, + { viewModel.updateScreenOn(it) }, + { viewModel.updateLanguage(it) }, + { viewModel.updateTheme(it) }) +} + +@Preview +@Composable +fun SettingsView( + valueScreenOn: Boolean = true, + valueLanguage: Language = Language.ENGLISH, + valueTheme: Theme = Theme.DARK, + updateScreenOn: (Boolean) -> Unit = {}, + updateLanguage: (Language) -> Unit = {}, + updateTheme: (Theme) -> Unit = {} +) { + Column() { + BooleanSetting( + stringResource(R.string.keep_screen_on), + valueScreenOn + ) { updateScreenOn(it) } + + StringSetting( + stringResource(R.string.choose_language_text), + languageMap, + valueLanguage, + ) { updateLanguage(it) } + + StringSetting( + stringResource(R.string.choose_theme_text), + themeMap, + valueTheme, + ) { updateTheme(it) } + } +} + +@Composable +fun BooleanSetting(name: String, value: Boolean, updateValue: (Boolean) -> Unit) { + Row { + Column() { + Text(text = name) + } + Column() { + Checkbox(checked = value, onCheckedChange = { updateValue(it) }) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun StringSetting(name: String, map: Map, selected: T, onSelected: (T) -> Unit) { + + var expanded by remember { mutableStateOf(false) } + + Row() { + TextField( + value = stringResource(map[selected]!!), + onValueChange = { }, + singleLine = true, + label = { Text(name) }, + readOnly = true, + modifier = Modifier + .onFocusChanged { + if (it.isFocused) { + expanded = true + } + } + ) + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + map.forEach { + DropdownMenuItem( + onClick = { + onSelected(it.key) + expanded = false + }, + text = { Text(stringResource(it.value)) }, + trailingIcon = { + if (it.key == selected) { + Icon(Icons.Outlined.Check, contentDescription = null) + } + }) + } + } + } +} diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsViewModel.kt new file mode 100644 index 0000000..3db0b89 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsViewModel.kt @@ -0,0 +1,41 @@ +package me.zobrist.tichucounter.ui.settings + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import me.zobrist.tichucounter.domain.Language +import me.zobrist.tichucounter.domain.SettingsAdapter +import me.zobrist.tichucounter.domain.Theme +import javax.inject.Inject + +@HiltViewModel +class SettingsViewModel @Inject constructor(private val settings: SettingsAdapter) : ViewModel() { + + + var language by mutableStateOf(settings.language) + private set + + var theme by mutableStateOf(settings.theme) + private set + + var screenOn by mutableStateOf(false) + private set + + fun updateLanguage(language: Language) { + settings.setLanguage(language) + this.language = settings.language + } + + fun updateTheme(theme: Theme) { + settings.setTheme(theme) + this.theme = settings.theme + } + + fun updateScreenOn(value: Boolean) { + settings.setKeepScreenOn(value) + screenOn = settings.keepScreenOn + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-mdpi/back.png b/app/src/main/res/drawable-mdpi/back.png deleted file mode 100644 index 72b8bd7d6e51121fd9717618c6ecf62c990189f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3381 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 LNkvXXu0mjfF~lRb diff --git a/app/src/main/res/drawable-mdpi/checkmark.png b/app/src/main/res/drawable-mdpi/checkmark.png deleted file mode 100644 index 75d22632c8cf040e2e5a19a7e5a339fb66095cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9289 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 p_1Hp^tsYWIz9IKCspL?< diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml deleted file mode 100644 index 0bff127..0000000 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_counter.xml b/app/src/main/res/menu/menu_counter.xml deleted file mode 100644 index b3832dc..0000000 --- a/app/src/main/res/menu/menu_counter.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml deleted file mode 100644 index 6f638ab..0000000 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml deleted file mode 100644 index e93c628..0000000 --- a/app/src/main/res/values/arrays.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - @string/dark - @string/light - @string/android_default_text - - - - dark - light - default - - - - - @string/english - @string/german - - - - en - de - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index f1a53dd..b2dbe00 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' + classpath 'com.android.tools.build:gradle:7.4.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 4d15d01..30dbeb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,6 @@ org.gradle.jvmargs=-Xmx2048m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7e135b5..f9d4a26 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip