From 9f65cb5ce892eb808c29900bf3fc31db0dc26f2d Mon Sep 17 00:00:00 2001 From: sspanak Date: Tue, 1 Aug 2023 17:46:47 +0300 Subject: [PATCH] added 'automatic dark theme' option --- res/values-bg/strings.xml | 3 + res/values-de/strings.xml | 3 + res/values-es/strings.xml | 3 + res/values-fr/strings.xml | 3 + res/values-it/strings.xml | 3 + res/values-iw/strings.xml | 3 + res/values-nl/strings.xml | 3 + res/values-pt-rBR/strings.xml | 3 + res/values-ru/strings.xml | 3 + res/values-uk/strings.xml | 3 + res/values/strings.xml | 3 + res/xml/prefs_screen_appearance.xml | 9 +-- .../tt9/preferences/PreferencesActivity.java | 4 +- .../tt9/preferences/SettingsStore.java | 19 ++++- .../tt9/preferences/items/ItemDropDown.java | 72 +++++++++++++++++++ .../preferences/items/ItemSelectTheme.java | 43 +++++++++++ .../items/ItemToggleDarkTheme.java | 27 ------- .../preferences/screens/AppearanceScreen.java | 7 +- src/io/github/sspanak/tt9/ui/AddWordAct.java | 4 +- 19 files changed, 178 insertions(+), 40 deletions(-) create mode 100644 src/io/github/sspanak/tt9/preferences/items/ItemDropDown.java create mode 100644 src/io/github/sspanak/tt9/preferences/items/ItemSelectTheme.java delete mode 100644 src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 6105842a..97c20212 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -69,4 +69,7 @@ Усилване на звук Изтриване… Грешка + Да + Не + Автоматично diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 67dafde0..dad0558a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -23,4 +23,7 @@ Neue Zeile Ersteinrichtung Fehler + Ja + Nein + Automatisch diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 951edd64..4dc41656 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -69,4 +69,7 @@ Llamar Bajar volumen Subir Volumen + + No + Automática diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 97b5f294..3331c04f 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -64,4 +64,7 @@ Pavé numérique à l\'écran Suppression… Erreur + Oui + Non + Automatique diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 3f02c29f..47350d46 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -32,5 +32,8 @@ Abilita l\'impostazione se ci sono 7–8–9 sulla prima riga, invece di 1–2–3. Configurazione iniziale Errore + Si + No + Automatica diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 03a7c3fd..6305f374 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -55,4 +55,7 @@ שורה חדשה רווח טעות + כן + לא + אוטומטי diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index f86ebca5..aadda67d 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -23,4 +23,7 @@ Initiële setup Verwijderen… Fout + Ja + Nee + Automatisch diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index 95f729d2..d406c597 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -58,4 +58,7 @@ Inverter Ordem das Teclas Limpar Não Selecionados Erro + Sim + Não + Automático diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index af911e78..47d76e9e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -69,4 +69,7 @@ Увеличить громкости Удаление… Ошибка + Да + Нет + Автоматически diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 8ce64ed6..e45b7ad7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -69,4 +69,7 @@ Зменшення гучності Видалення… Помилка + Так + Ні + Автоматично diff --git a/res/values/strings.xml b/res/values/strings.xml index 4e6258d4..d6b98f98 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -35,6 +35,9 @@ Automatically start sentences with a capital letter. Languages Dark Theme + Yes + No + Auto Character for Double 0-key Press Show On-Screen Keys Show On-Screen Numpad diff --git a/res/xml/prefs_screen_appearance.xml b/res/xml/prefs_screen_appearance.xml index 70f6df44..6e2d90d9 100644 --- a/res/xml/prefs_screen_appearance.xml +++ b/res/xml/prefs_screen_appearance.xml @@ -1,10 +1,11 @@ - values; + + public ItemDropDown(DropDownPreference item) { + this.item = item; + } + + protected void populate(LinkedHashMap values) { + if (item == null) { + Logger.w("tt9/ItemDropDown.populate", "Cannot populate a NULL item. Ignoring."); + return; + } + + this.values = values != null ? values : new LinkedHashMap<>(); + + ArrayList keys = new ArrayList<>(); + for (int key : this.values.keySet()) { + keys.add(String.valueOf(key)); + } + + item.setEntryValues(keys.toArray(new CharSequence[0])); + item.setEntries(this.values.values().toArray(new CharSequence[0])); + } + + public ItemDropDown enableClickHandler() { + if (item == null) { + Logger.w("tt9/SectionKeymap.populateItem", "Cannot set a click listener a NULL item. Ignoring."); + return this; + } + + item.setOnPreferenceChangeListener(this::onClick); + return this; + } + + protected boolean onClick(Preference preference, Object newKey) { + try { + String previewValue = values.get(Integer.parseInt(newKey.toString())); + ((DropDownPreference) preference).setValue(newKey.toString()); + setPreview(previewValue); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + private void setPreview(String value) { + if (item != null) { + item.setSummary(value); + } + } + + public ItemDropDown preview() { + try { + setPreview(values.get(Integer.parseInt(item.getValue()))); + } catch (NumberFormatException e) { + setPreview(""); + } + + return this; + } +} diff --git a/src/io/github/sspanak/tt9/preferences/items/ItemSelectTheme.java b/src/io/github/sspanak/tt9/preferences/items/ItemSelectTheme.java new file mode 100644 index 00000000..a9b77762 --- /dev/null +++ b/src/io/github/sspanak/tt9/preferences/items/ItemSelectTheme.java @@ -0,0 +1,43 @@ +package io.github.sspanak.tt9.preferences.items; + +import android.content.Context; + +import androidx.appcompat.app.AppCompatDelegate; +import androidx.preference.DropDownPreference; +import androidx.preference.Preference; + +import java.util.LinkedHashMap; + +import io.github.sspanak.tt9.R; + +public class ItemSelectTheme extends ItemDropDown { + public static final String NAME = "pref_theme"; + + private final Context context; + + public ItemSelectTheme(Context context, DropDownPreference item) { + super(item); + this.context = context; + } + + public ItemDropDown populate() { + LinkedHashMap themes = new LinkedHashMap<>(); + themes.put(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, context.getString(R.string.pref_dark_theme_auto)); + themes.put(AppCompatDelegate.MODE_NIGHT_NO, context.getString(R.string.pref_dark_theme_no)); + themes.put(AppCompatDelegate.MODE_NIGHT_YES, context.getString(R.string.pref_dark_theme_yes)); + + super.populate(themes); + + return this; + } + + @Override + protected boolean onClick(Preference preference, Object newKey) { + if (super.onClick(preference, newKey)) { + AppCompatDelegate.setDefaultNightMode(Integer.parseInt(newKey.toString())); + return true; + } + + return false; + } +} diff --git a/src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java b/src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java deleted file mode 100644 index c582256c..00000000 --- a/src/io/github/sspanak/tt9/preferences/items/ItemToggleDarkTheme.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.sspanak.tt9.preferences.items; - -import androidx.appcompat.app.AppCompatDelegate; -import androidx.preference.Preference; -import androidx.preference.SwitchPreferenceCompat; - -public class ItemToggleDarkTheme { - public static final String NAME = "pref_dark_theme"; - - private final SwitchPreferenceCompat themeToggle; - - public ItemToggleDarkTheme(SwitchPreferenceCompat item) { - themeToggle = item; - } - - public void enableToggleHandler() { - themeToggle.setOnPreferenceChangeListener(this::onChange); - } - - private boolean onChange(Preference p, Object newValue) { - AppCompatDelegate.setDefaultNightMode( - ((boolean) newValue) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO - ); - - return true; - } -} diff --git a/src/io/github/sspanak/tt9/preferences/screens/AppearanceScreen.java b/src/io/github/sspanak/tt9/preferences/screens/AppearanceScreen.java index 397fe309..abe5c998 100644 --- a/src/io/github/sspanak/tt9/preferences/screens/AppearanceScreen.java +++ b/src/io/github/sspanak/tt9/preferences/screens/AppearanceScreen.java @@ -2,7 +2,7 @@ package io.github.sspanak.tt9.preferences.screens; import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.preferences.PreferencesActivity; -import io.github.sspanak.tt9.preferences.items.ItemToggleDarkTheme; +import io.github.sspanak.tt9.preferences.items.ItemSelectTheme; public class AppearanceScreen extends BaseScreenFragment { public AppearanceScreen() { init(); } @@ -13,6 +13,9 @@ public class AppearanceScreen extends BaseScreenFragment { @Override protected void onCreate() { - (new ItemToggleDarkTheme(findPreference(ItemToggleDarkTheme.NAME))).enableToggleHandler(); + (new ItemSelectTheme(activity, findPreference(ItemSelectTheme.NAME))) + .populate() + .enableClickHandler() + .preview(); } } diff --git a/src/io/github/sspanak/tt9/ui/AddWordAct.java b/src/io/github/sspanak/tt9/ui/AddWordAct.java index d381701b..386f08be 100644 --- a/src/io/github/sspanak/tt9/ui/AddWordAct.java +++ b/src/io/github/sspanak/tt9/ui/AddWordAct.java @@ -27,9 +27,7 @@ public class AddWordAct extends AppCompatActivity { protected void onCreate(Bundle savedData) { settings = new SettingsStore(this); - AppCompatDelegate.setDefaultNightMode( - settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO - ); + AppCompatDelegate.setDefaultNightMode(settings.getTheme()); super.onCreate(savedData);