1
0
Fork 0

fixed crashing when navigating from a notification to the Settings screen; eliminated unnecessary passing of SettingsStore around the screens

This commit is contained in:
sspanak 2024-03-15 12:24:52 +02:00 committed by Dimo Karaivanov
parent c63804c5e2
commit 962792728f
12 changed files with 56 additions and 70 deletions

View file

@ -32,7 +32,7 @@ import io.github.sspanak.tt9.preferences.screens.languages.LanguagesScreen;
import io.github.sspanak.tt9.preferences.screens.setup.SetupScreen; import io.github.sspanak.tt9.preferences.screens.setup.SetupScreen;
public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
public SettingsStore settings; private SettingsStore settings;
@Override @Override
@ -85,6 +85,7 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
} }
} }
/** /**
* getScreenName * getScreenName
* Determines the name of the screen for the given preference, as defined in the preference's "fragment" attribute. * Determines the name of the screen for the given preference, as defined in the preference's "fragment" attribute.
@ -166,6 +167,15 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
} }
public SettingsStore getSettings() {
if (settings == null) {
settings = new SettingsStore(this);
}
return settings;
}
private void applyTheme() { private void applyTheme() {
AppCompatDelegate.setDefaultNightMode(settings.getTheme()); AppCompatDelegate.setDefaultNightMode(settings.getTheme());
} }

View file

@ -34,7 +34,7 @@ public class DebugScreen extends BaseScreenFragment {
@Override @Override
protected void onCreate() { protected void onCreate() {
(new ItemLogLevel(findPreference(ItemLogLevel.NAME))).populate().preview().enableClickHandler(); (new ItemLogLevel(findPreference(ItemLogLevel.NAME))).populate().preview().enableClickHandler();
(new ItemInputHandlingMode(findPreference(ItemInputHandlingMode.NAME), activity.settings)).populate().preview().enableClickHandler(); (new ItemInputHandlingMode(findPreference(ItemInputHandlingMode.NAME), activity.getSettings())).populate().preview().enableClickHandler();
initSystemLogsSwitch(); initSystemLogsSwitch();
enableLogsCopy(); enableLogsCopy();

View file

@ -31,10 +31,10 @@ public class HotkeysScreen extends BaseScreenFragment {
findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE), findPreference(SectionKeymap.ITEM_NEXT_LANGUAGE),
findPreference(SectionKeymap.ITEM_SHOW_SETTINGS), findPreference(SectionKeymap.ITEM_SHOW_SETTINGS),
}; };
SectionKeymap section = new SectionKeymap(Arrays.asList(dropDowns), activity, activity.settings); SectionKeymap section = new SectionKeymap(Arrays.asList(dropDowns), activity);
section.populate().activate(); section.populate().activate();
(new ItemResetKeys(findPreference(ItemResetKeys.NAME), activity, activity.settings, section)) (new ItemResetKeys(findPreference(ItemResetKeys.NAME), activity, section))
.enableClickHandler(); .enableClickHandler();
} }
} }

View file

@ -5,7 +5,7 @@ import android.content.Context;
import androidx.preference.Preference; import androidx.preference.Preference;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.SettingsStore; import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.helpers.Hotkeys; import io.github.sspanak.tt9.preferences.helpers.Hotkeys;
import io.github.sspanak.tt9.preferences.items.ItemClickable; import io.github.sspanak.tt9.preferences.items.ItemClickable;
import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.UI;
@ -14,23 +14,21 @@ import io.github.sspanak.tt9.ui.UI;
class ItemResetKeys extends ItemClickable { class ItemResetKeys extends ItemClickable {
public static final String NAME = "reset_keys"; public static final String NAME = "reset_keys";
private final Context context; private final PreferencesActivity activity;
private final SectionKeymap dropdowns; private final SectionKeymap dropdowns;
private final SettingsStore settings;
ItemResetKeys(Preference item, Context context, SettingsStore settings, SectionKeymap dropdowns) { ItemResetKeys(Preference item, PreferencesActivity activity, SectionKeymap dropdowns) {
super(item); super(item);
this.context = context; this.activity = activity;
this.dropdowns = dropdowns; this.dropdowns = dropdowns;
this.settings = settings;
} }
@Override @Override
protected boolean onClick(Preference p) { protected boolean onClick(Preference p) {
Hotkeys.setDefault(settings); Hotkeys.setDefault(activity.getSettings());
dropdowns.reloadSettings(); dropdowns.reloadSettings();
UI.toast(context, R.string.function_reset_keys_done); UI.toast(activity, R.string.function_reset_keys_done);
return true; return true;
} }
} }

View file

@ -9,6 +9,7 @@ import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import io.github.sspanak.tt9.Logger; import io.github.sspanak.tt9.Logger;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.SettingsStore; import io.github.sspanak.tt9.preferences.SettingsStore;
import io.github.sspanak.tt9.preferences.helpers.Hotkeys; import io.github.sspanak.tt9.preferences.helpers.Hotkeys;
@ -29,10 +30,10 @@ public class SectionKeymap {
private final SettingsStore settings; private final SettingsStore settings;
public SectionKeymap(Collection<DropDownPreference> dropDowns, Context context, SettingsStore settings) { public SectionKeymap(Collection<DropDownPreference> dropDowns, PreferencesActivity activity) {
items = dropDowns; items = dropDowns;
hotkeys = new Hotkeys(context); hotkeys = new Hotkeys(activity);
this.settings = settings; this.settings = activity.getSettings();
} }

View file

@ -1,20 +1,19 @@
package io.github.sspanak.tt9.preferences.screens.languages; package io.github.sspanak.tt9.preferences.screens.languages;
import android.app.Activity;
import androidx.preference.Preference; import androidx.preference.Preference;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.exporter.AbstractExporter; import io.github.sspanak.tt9.db.exporter.AbstractExporter;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemClickable; import io.github.sspanak.tt9.preferences.items.ItemClickable;
import io.github.sspanak.tt9.ui.DictionaryNotification; import io.github.sspanak.tt9.ui.DictionaryNotification;
abstract class ItemExportAbstract extends ItemClickable { abstract class ItemExportAbstract extends ItemClickable {
final protected Activity activity; final protected PreferencesActivity activity;
final private Runnable onStart; final private Runnable onStart;
final private Runnable onFinish; final private Runnable onFinish;
ItemExportAbstract(Preference item, Activity activity, Runnable onStart, Runnable onFinish) { ItemExportAbstract(Preference item, PreferencesActivity activity, Runnable onStart, Runnable onFinish) {
super(item); super(item);
this.activity = activity; this.activity = activity;
this.onStart = onStart; this.onStart = onStart;

View file

@ -1,17 +1,16 @@
package io.github.sspanak.tt9.preferences.screens.languages; package io.github.sspanak.tt9.preferences.screens.languages;
import android.app.Activity;
import androidx.preference.Preference; import androidx.preference.Preference;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.exporter.CustomWordsExporter; import io.github.sspanak.tt9.db.exporter.CustomWordsExporter;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
class ItemExportCustomWords extends ItemExportAbstract { class ItemExportCustomWords extends ItemExportAbstract {
final public static String NAME = "dictionary_export_custom"; final public static String NAME = "dictionary_export_custom";
ItemExportCustomWords(Preference item, Activity activity, Runnable onStart, Runnable onFinish) { ItemExportCustomWords(Preference item, PreferencesActivity activity, Runnable onStart, Runnable onFinish) {
super(item, activity, onStart, onFinish); super(item, activity, onStart, onFinish);
} }

View file

@ -1,7 +1,5 @@
package io.github.sspanak.tt9.preferences.screens.languages; package io.github.sspanak.tt9.preferences.screens.languages;
import android.app.Activity;
import androidx.preference.Preference; import androidx.preference.Preference;
import io.github.sspanak.tt9.Logger; import io.github.sspanak.tt9.Logger;
@ -9,17 +7,13 @@ import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.exporter.DictionaryExporter; import io.github.sspanak.tt9.db.exporter.DictionaryExporter;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.SettingsStore; import io.github.sspanak.tt9.preferences.PreferencesActivity;
class ItemExportDictionary extends ItemExportAbstract { class ItemExportDictionary extends ItemExportAbstract {
final public static String NAME = "dictionary_export"; final public static String NAME = "dictionary_export";
protected final SettingsStore settings; ItemExportDictionary(Preference item, PreferencesActivity activity, Runnable onStart, Runnable onFinish) {
ItemExportDictionary(Preference item, Activity activity, SettingsStore settings, Runnable onStart, Runnable onFinish) {
super(item, activity, onStart, onFinish); super(item, activity, onStart, onFinish);
this.settings = settings;
} }
@ -40,7 +34,7 @@ class ItemExportDictionary extends ItemExportAbstract {
protected boolean onStartExporting() { protected boolean onStartExporting() {
return DictionaryExporter.getInstance() return DictionaryExporter.getInstance()
.setLanguages(LanguageCollection.getAll(activity, settings.getEnabledLanguageIds())) .setLanguages(LanguageCollection.getAll(activity, activity.getSettings().getEnabledLanguageIds()))
.export(activity); .export(activity);
} }
@ -48,7 +42,7 @@ class ItemExportDictionary extends ItemExportAbstract {
protected String getLoadingMessage() { protected String getLoadingMessage() {
String message = activity.getString(R.string.dictionary_export_generating_csv); String message = activity.getString(R.string.dictionary_export_generating_csv);
Language language = LanguageCollection.getLanguage(activity, settings.getInputLanguage()); Language language = LanguageCollection.getLanguage(activity, activity.getSettings().getInputLanguage());
if (language != null) { if (language != null) {
message = activity.getString(R.string.dictionary_export_generating_csv_for_language, language.getName()); message = activity.getString(R.string.dictionary_export_generating_csv_for_language, language.getName());
} }

View file

@ -1,6 +1,5 @@
package io.github.sspanak.tt9.preferences.screens.languages; package io.github.sspanak.tt9.preferences.screens.languages;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import androidx.preference.Preference; import androidx.preference.Preference;
@ -11,7 +10,7 @@ import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryLoader; import io.github.sspanak.tt9.db.DictionaryLoader;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.SettingsStore; import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemClickable; import io.github.sspanak.tt9.preferences.items.ItemClickable;
import io.github.sspanak.tt9.ui.DictionaryLoadingBar; import io.github.sspanak.tt9.ui.DictionaryLoadingBar;
import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.UI;
@ -20,8 +19,7 @@ import io.github.sspanak.tt9.ui.UI;
class ItemLoadDictionary extends ItemClickable { class ItemLoadDictionary extends ItemClickable {
public final static String NAME = "dictionary_load"; public final static String NAME = "dictionary_load";
private final Context context; private final PreferencesActivity activity;
private final SettingsStore settings;
private final Runnable onStart; private final Runnable onStart;
private final Runnable onFinish; private final Runnable onFinish;
@ -29,13 +27,12 @@ class ItemLoadDictionary extends ItemClickable {
private final DictionaryLoadingBar progressBar; private final DictionaryLoadingBar progressBar;
ItemLoadDictionary(Preference item, Context context, SettingsStore settings, Runnable onStart, Runnable onFinish) { ItemLoadDictionary(Preference item, PreferencesActivity context, Runnable onStart, Runnable onFinish) {
super(item); super(item);
this.context = context; this.activity = context;
this.loader = DictionaryLoader.getInstance(context); this.loader = DictionaryLoader.getInstance(context);
this.progressBar = DictionaryLoadingBar.getInstance(context); this.progressBar = DictionaryLoadingBar.getInstance(context);
this.settings = settings;
this.onStart = onStart; this.onStart = onStart;
this.onFinish = onFinish; this.onFinish = onFinish;
@ -53,24 +50,24 @@ class ItemLoadDictionary extends ItemClickable {
private void onLoadingStatusChange(Bundle status) { private void onLoadingStatusChange(Bundle status) {
progressBar.show(context, status); progressBar.show(activity, status);
item.setSummary(progressBar.getTitle() + " " + progressBar.getMessage()); item.setSummary(progressBar.getTitle() + " " + progressBar.getMessage());
if (progressBar.isCancelled()) { if (progressBar.isCancelled()) {
setReadyStatus(); setReadyStatus();
} else if (progressBar.isFailed()) { } else if (progressBar.isFailed()) {
setReadyStatus(); setReadyStatus();
UI.toastFromAsync(context, progressBar.getMessage()); UI.toastFromAsync(activity, progressBar.getMessage());
} else if (!progressBar.inProgress()) { } else if (!progressBar.inProgress()) {
setReadyStatus(); setReadyStatus();
UI.toastFromAsync(context, R.string.dictionary_loaded); UI.toastFromAsync(activity, R.string.dictionary_loaded);
} }
} }
@Override @Override
protected boolean onClick(Preference p) { protected boolean onClick(Preference p) {
ArrayList<Language> languages = LanguageCollection.getAll(context, settings.getEnabledLanguageIds()); ArrayList<Language> languages = LanguageCollection.getAll(activity, activity.getSettings().getEnabledLanguageIds());
setLoadingStatus(); setLoadingStatus();
if (!loader.load(languages)) { if (!loader.load(languages)) {
@ -85,13 +82,13 @@ class ItemLoadDictionary extends ItemClickable {
private void setLoadingStatus() { private void setLoadingStatus() {
loader.setOnStatusChange(this::onLoadingStatusChange); loader.setOnStatusChange(this::onLoadingStatusChange);
onStart.run(); onStart.run();
item.setTitle(context.getString(R.string.dictionary_cancel_load)); item.setTitle(activity.getString(R.string.dictionary_cancel_load));
} }
private void setReadyStatus() { private void setReadyStatus() {
onFinish.run(); onFinish.run();
item.setTitle(context.getString(R.string.dictionary_load_title)); item.setTitle(activity.getString(R.string.dictionary_load_title));
item.setSummary(progressBar.isFailed() || progressBar.isCancelled() ? progressBar.getMessage() : ""); item.setSummary(progressBar.isFailed() || progressBar.isCancelled() ? progressBar.getMessage() : "");
} }
} }

View file

@ -1,7 +1,5 @@
package io.github.sspanak.tt9.preferences.screens.languages; package io.github.sspanak.tt9.preferences.screens.languages;
import android.content.Context;
import androidx.preference.MultiSelectListPreference; import androidx.preference.MultiSelectListPreference;
import java.util.ArrayList; import java.util.ArrayList;
@ -10,20 +8,18 @@ import java.util.HashSet;
import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.SettingsStore; import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.UI;
class ItemSelectLanguage { class ItemSelectLanguage {
public static final String NAME = "pref_languages"; public static final String NAME = "pref_languages";
private final Context context; private final PreferencesActivity activity;
private final SettingsStore settings;
private final MultiSelectListPreference item; private final MultiSelectListPreference item;
ItemSelectLanguage(Context context, MultiSelectListPreference multiSelect, SettingsStore settings) { ItemSelectLanguage(PreferencesActivity activity, MultiSelectListPreference multiSelect) {
this.context = context; this.activity = activity;
this.item = multiSelect; this.item = multiSelect;
this.settings = settings;
} }
public ItemSelectLanguage populate() { public ItemSelectLanguage populate() {
@ -31,9 +27,9 @@ class ItemSelectLanguage {
return this; return this;
} }
ArrayList<Language> languages = LanguageCollection.getAll(context, true); ArrayList<Language> languages = LanguageCollection.getAll(activity, true);
if (languages.isEmpty()) { if (languages.isEmpty()) {
UI.alert(context, R.string.error, R.string.failed_loading_language_definitions); UI.alert(activity, R.string.error, R.string.failed_loading_language_definitions);
// do not return, the MultiSelect component requires arrays, even if empty, otherwise it crashes // do not return, the MultiSelect component requires arrays, even if empty, otherwise it crashes
} }
@ -49,7 +45,7 @@ class ItemSelectLanguage {
item.setEntries(keys.toArray(new CharSequence[0])); item.setEntries(keys.toArray(new CharSequence[0]));
item.setEntryValues(values.toArray(new CharSequence[0])); item.setEntryValues(values.toArray(new CharSequence[0]));
item.setValues(settings.getEnabledLanguagesIdsAsStrings()); item.setValues(activity.getSettings().getEnabledLanguagesIdsAsStrings());
previewSelection(); previewSelection();
return this; return this;
@ -67,8 +63,8 @@ class ItemSelectLanguage {
newLanguages.add("1"); newLanguages.add("1");
} }
settings.saveEnabledLanguageIds(newLanguages); activity.getSettings().saveEnabledLanguageIds(newLanguages);
item.setValues(settings.getEnabledLanguagesIdsAsStrings()); item.setValues(activity.getSettings().getEnabledLanguagesIdsAsStrings());
previewSelection(); previewSelection();
// we validate and save manually above, so "false" disables automatic save // we validate and save manually above, so "false" disables automatic save
@ -80,7 +76,7 @@ class ItemSelectLanguage {
private void previewSelection() { private void previewSelection() {
item.setSummary( item.setSummary(
LanguageCollection.toString(LanguageCollection.getAll(context, settings.getEnabledLanguageIds(), true)) LanguageCollection.toString(LanguageCollection.getAll(activity, activity.getSettings().getEnabledLanguageIds(), true))
); );
} }
} }

View file

@ -8,25 +8,21 @@ import io.github.sspanak.tt9.db.WordStoreAsync;
import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.PreferencesActivity; import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.SettingsStore;
class ItemTruncateUnselected extends ItemTruncateAll { class ItemTruncateUnselected extends ItemTruncateAll {
public static final String NAME = "dictionary_truncate_unselected"; public static final String NAME = "dictionary_truncate_unselected";
private final SettingsStore settings;
ItemTruncateUnselected(Preference item, PreferencesActivity context, Runnable onStart, Runnable onFinish) {
ItemTruncateUnselected(Preference item, PreferencesActivity context, SettingsStore settings, Runnable onStart, Runnable onFinish) {
super(item, context, onStart, onFinish); super(item, context, onStart, onFinish);
this.settings = settings;
} }
@Override @Override
protected boolean onClick(Preference p) { protected boolean onClick(Preference p) {
ArrayList<Integer> unselectedLanguageIds = new ArrayList<>(); ArrayList<Integer> unselectedLanguageIds = new ArrayList<>();
ArrayList<Integer> selectedLanguageIds = settings.getEnabledLanguageIds(); ArrayList<Integer> selectedLanguageIds = activity.getSettings().getEnabledLanguageIds();
for (Language lang : LanguageCollection.getAll(activity, false)) { for (Language lang : LanguageCollection.getAll(activity, false)) {
if (!selectedLanguageIds.contains(lang.getId())) { if (!selectedLanguageIds.contains(lang.getId())) {
unselectedLanguageIds.add(lang.getId()); unselectedLanguageIds.add(lang.getId());

View file

@ -30,21 +30,18 @@ public class LanguagesScreen extends BaseScreenFragment {
protected void onCreate() { protected void onCreate() {
ItemSelectLanguage multiSelect = new ItemSelectLanguage( ItemSelectLanguage multiSelect = new ItemSelectLanguage(
activity, activity,
findPreference(ItemSelectLanguage.NAME), findPreference(ItemSelectLanguage.NAME)
activity.settings
); );
multiSelect.populate().enableValidation(); multiSelect.populate().enableValidation();
loadItem = new ItemLoadDictionary(findPreference(ItemLoadDictionary.NAME), loadItem = new ItemLoadDictionary(findPreference(ItemLoadDictionary.NAME),
activity, activity,
activity.settings,
() -> ItemClickable.disableOthers(clickables, loadItem), () -> ItemClickable.disableOthers(clickables, loadItem),
this::onActionFinish this::onActionFinish
); );
exportDictionaryItem = new ItemExportDictionary(findPreference(ItemExportDictionary.NAME), exportDictionaryItem = new ItemExportDictionary(findPreference(ItemExportDictionary.NAME),
activity, activity,
activity.settings,
this::onActionStart, this::onActionStart,
this::onActionFinish this::onActionFinish
); );
@ -55,7 +52,6 @@ public class LanguagesScreen extends BaseScreenFragment {
clickables.add(new ItemTruncateUnselected( clickables.add(new ItemTruncateUnselected(
findPreference(ItemTruncateUnselected.NAME), findPreference(ItemTruncateUnselected.NAME),
activity, activity,
activity.settings,
this::onActionStart, this::onActionStart,
this::onActionFinish this::onActionFinish
)); ));