Apply application preferences.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-12-31 11:54:20 +01:00
parent 3b7b71ce77
commit e01df3a5c7
11 changed files with 124 additions and 161 deletions

View File

@@ -11,6 +11,11 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<service
android:name=".SettingsService"
android:enabled="true"
android:exported="true"></service>
<activity <activity
android:name=".SettingsActivity" android:name=".SettingsActivity"
android:exported="false" android:exported="false"

View File

@@ -0,0 +1,67 @@
package me.zobrist.tichucounter
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
abstract class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
keepScreenOn(sharedPreferences.getBoolean("screen_on", false))
updateTheme(sharedPreferences.getString("theme", null))
PreferenceManager.getDefaultSharedPreferences(this)
.registerOnSharedPreferenceChangeListener { sharedPreferences, key ->
if (key == "language") {
setLanguage(sharedPreferences.getString("language", null))
}
if (key == "screen_on") {
keepScreenOn(sharedPreferences.getBoolean("screen_on", false))
}
if (key == "theme") {
updateTheme(sharedPreferences.getString("theme", null))
}
}
}
private fun updateTheme(theme: String?) {
var 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
}
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(locale: String?) {
val currentLocale = AppCompatDelegate.getApplicationLocales()[0].toString()
if (locale != null && locale != currentLocale) {
val newLocale = LocaleListCompat.forLanguageTags(locale)
AppCompatDelegate.setApplicationLocales(newLocale)
}
}
}

View File

@@ -5,11 +5,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.WindowManager
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@@ -23,7 +19,7 @@ import me.zobrist.tichucounter.repository.GameRepository
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : BaseActivity() {
private var currentRound: Round = Round(0, 0, null, null) private var currentRound: Round = Round(0, 0, null, null)
@@ -45,9 +41,10 @@ class MainActivity : AppCompatActivity() {
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
setSupportActionBar(binding.toolbar) setSupportActionBar(binding.toolbar)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
val game = gameRepository.getActiveGame() val game = gameRepository.getActiveGame()
@@ -56,11 +53,6 @@ class MainActivity : AppCompatActivity() {
} }
} }
updateTheme(this.getSharedPreferences("Settings", MODE_PRIVATE).getInt("Theme", 2))
keepScreenOn(
this.getSharedPreferences("Settings", MODE_PRIVATE).getBoolean("Screen_On", false)
)
keyboardViewModel.scoreA.observe(this) { value -> keyboardViewModel.scoreA.observe(this) { value ->
val oldValue = currentRound.scoreA val oldValue = currentRound.scoreA
currentRound.scoreA = value currentRound.scoreA = value
@@ -98,14 +90,6 @@ class MainActivity : AppCompatActivity() {
} }
} }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit()
prefs.apply()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present. // Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu) menuInflater.inflate(R.menu.menu_main, menu)
@@ -147,106 +131,7 @@ class MainActivity : AppCompatActivity() {
startActivity(i) startActivity(i)
true true
} }
//R.id.action_theme -> {
// chooseThemeDialog()
// true
//}
//R.id.action_language -> {
// chooseLanguageDialog()
// true
//}
//R.id.action_screenOn -> {
// item.isChecked = !item.isChecked
// keepScreenOn(item.isChecked)
// true
//}
else -> super.onOptionsItemSelected(item) else -> super.onOptionsItemSelected(item)
} }
} }
private fun chooseThemeDialog() {
val builder = AlertDialog.Builder(this)
builder.setTitle(getString(R.string.choose_theme_text))
val styles = arrayOf(
getString(R.string.light),
getString(R.string.dark),
getString(R.string.android_default_text)
)
val checkedItem = this.getSharedPreferences("Settings", MODE_PRIVATE).getInt("Theme", 2)
val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit()
builder.setSingleChoiceItems(styles, checkedItem) { dialog, which ->
prefs.putInt("Theme", which)
prefs.apply()
updateTheme(which)
dialog.dismiss()
}
val dialog = builder.create()
dialog.show()
}
private fun chooseLanguageDialog() {
val builder = AlertDialog.Builder(this)
builder.setTitle(getString(R.string.choose_language_text))
val languagesMap = mapOf(
getString(R.string.english) to "en", getString(R.string.german) to "de"
)
val languagesDisplayKeys = languagesMap.keys.toTypedArray()
val languagesDisplayValues = languagesMap.values.toTypedArray()
val checkedItem = AppCompatDelegate.getApplicationLocales()[0].toString()
var checkedItemIndex = languagesDisplayValues.indexOf(checkedItem)
if (checkedItemIndex == -1) {
checkedItemIndex = 0
}
builder.setSingleChoiceItems(languagesDisplayKeys, checkedItemIndex) { dialog, which ->
val newLocale =
LocaleListCompat.forLanguageTags(languagesMap[languagesDisplayKeys[which]])
AppCompatDelegate.setApplicationLocales(newLocale)
startActivity(Intent(this, MainActivity::class.java))
finish()
dialog.dismiss()
}
val dialog = builder.create()
dialog.show()
}
private fun updateTheme(which: Int) {
when (which) {
0 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
2 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
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)
}
val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit()
prefs.putBoolean("Screen_On", keepOn)
prefs.apply()
}
} }

View File

@@ -1,22 +1,15 @@
package me.zobrist.tichucounter package me.zobrist.tichucounter
import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.activity.OnBackPressedCallback import androidx.preference.ListPreference
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.zobrist.tichucounter.databinding.SettingsActivityBinding import me.zobrist.tichucounter.databinding.SettingsActivityBinding
@AndroidEntryPoint class SettingsActivity : BaseActivity() {
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: SettingsActivityBinding private lateinit var binding: SettingsActivityBinding
@@ -54,8 +47,22 @@ class SettingsActivity : AppCompatActivity() {
class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey) setPreferencesFromResource(R.xml.root_preferences, rootKey)
val index = when (getCurrentLocale()) {
"de" -> 1
"en" -> 0
else -> 0
}
findPreference<ListPreference>("language")?.setValueIndex(index)
}
private fun getCurrentLocale(): String? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
resources.configuration.locales.get(0).language
} else {
resources.configuration.locale.language
}
} }
} }
} }

View File

@@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@color/colorPrimary" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/colorPrimary"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
</vector> </vector>

View File

@@ -1,5 +1,11 @@
<vector android:autoMirrored="true" android:height="24dp" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:tint="#FFFFFF" android:viewportHeight="24" android:width="24dp"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@color/colorPrimary" android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z"/> android:autoMirrored="true"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/colorPrimary"
android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z" />
</vector> </vector>

View File

@@ -7,11 +7,11 @@
android:icon="@drawable/ic_baseline_undo_24" android:icon="@drawable/ic_baseline_undo_24"
android:orderInCategory="5" android:orderInCategory="5"
android:title="@string/undo" android:title="@string/undo"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_clear" android:id="@+id/action_clear"
android:icon="@drawable/ic_baseline_add_24"
android:checkable="false" android:checkable="false"
android:icon="@drawable/ic_baseline_add_24"
android:orderInCategory="10" android:orderInCategory="10"
android:title="@string/clear" android:title="@string/clear"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />

View File

@@ -15,4 +15,5 @@
<string name="light">Hell</string> <string name="light">Hell</string>
<string name="dark">Dunkel</string> <string name="dark">Dunkel</string>
<string name="settings">Einstellungen</string> <string name="settings">Einstellungen</string>
<string name="display">Anzeige</string>
</resources> </resources>

View File

@@ -14,12 +14,12 @@
<!-- Language Preference --> <!-- Language Preference -->
<string-array name="language_entries"> <string-array name="language_entries">
<item>@string/german</item>
<item>@string/english</item> <item>@string/english</item>
<item>@string/german</item>
</string-array> </string-array>
<string-array name="language_values"> <string-array name="language_values">
<item>german</item> <item>en</item>
<item>english</item> <item>de</item>
</string-array> </string-array>
</resources> </resources>

View File

@@ -3,6 +3,7 @@
<string name="app_name" translatable="false">Tichu Counter</string> <string name="app_name" translatable="false">Tichu Counter</string>
<string name="team_a" translatable="false">Team A</string> <string name="team_a" translatable="false">Team A</string>
<string name="team_b" translatable="false">Team B</string> <string name="team_b" translatable="false">Team B</string>
<string name="title_activity_settings" translatable="false">SettingsActivity</string>
<string name="clear">Start new game</string> <string name="clear">Start new game</string>
<string name="undo">Undo last round</string> <string name="undo">Undo last round</string>
@@ -18,21 +19,6 @@
<string name="german">German</string> <string name="german">German</string>
<string name="light">Light</string> <string name="light">Light</string>
<string name="dark">Dark</string> <string name="dark">Dark</string>
<string name="title_activity_settings">SettingsActivity</string> <string name="display">Display</string>
<!-- Preference Titles -->
<string name="messages_header">Messages</string>
<string name="sync_header">Sync</string>
<!-- Messages Preferences -->
<string name="signature_title">Your signature</string>
<string name="reply_title">Theme</string>
<!-- Sync Preferences -->
<string name="sync_title">Sync email periodically</string>
<string name="attachment_title">Download incoming attachments</string>
<string name="attachment_summary_on">Automatically download attachments for incoming emails
</string>
<string name="attachment_summary_off">Only download attachments when manually requested</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
</resources> </resources>

View File

@@ -1,6 +1,6 @@
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="@string/messages_header"> <PreferenceCategory app:title="@string/display">
<ListPreference <ListPreference
app:defaultValue="default" app:defaultValue="default"
@@ -20,7 +20,8 @@
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:key="screen" app:defaultValue="true"
app:key="screen_on"
app:title="@string/keep_screen_on" /> app:title="@string/keep_screen_on" />
</PreferenceCategory> </PreferenceCategory>