From 44bd6ce084c5f096ca4e78c018470dd358a37a16 Mon Sep 17 00:00:00 2001 From: sspanak Date: Tue, 13 May 2025 13:56:39 +0300 Subject: [PATCH] new dev bug: fixed crashing when not possible to show the new popup windows --- .../sspanak/tt9/ime/CommandHandler.java | 4 +- .../github/sspanak/tt9/ime/HotkeyHandler.java | 4 +- .../AddWordsWithoutConfirmationSwitch.java | 39 ++++++++++++++++++ .../QuickSwitchLanguagePreference.java | 40 +++++++++++++++++++ .../github/sspanak/tt9/ui/PopupBuilder.java | 5 +++ .../sspanak/tt9/ui/dialogs/AddWordDialog.java | 11 ++--- .../tt9/ui/dialogs/ChangeLanguageDialog.java | 9 +---- .../sspanak/tt9/ui/dialogs/PopupDialog.java | 6 ++- .../main/res/xml/prefs_screen_languages.xml | 10 +---- 9 files changed, 98 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/AddWordsWithoutConfirmationSwitch.java create mode 100644 app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/QuickSwitchLanguagePreference.java diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java index 75851cc9..8ac82572 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/CommandHandler.java @@ -159,10 +159,10 @@ abstract public class CommandHandler extends TextEditingHandler { } - protected void changeLang() { + protected boolean changeLang() { suggestionOps.cancelDelayedAccept(); stopVoiceInput(); - new ChangeLanguageDialog(getFinalContext(), this::setLang).show(); + return new ChangeLanguageDialog(getFinalContext(), this::setLang).show(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index b7c94059..699070c8 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -298,10 +298,8 @@ public abstract class HotkeyHandler extends CommandHandler { return true; } - if (settings.getQuickSwitchLanguage()) { + if (settings.getQuickSwitchLanguage() || !changeLang()) { nextLang(); - } else { - changeLang(); } return true; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/AddWordsWithoutConfirmationSwitch.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/AddWordsWithoutConfirmationSwitch.java new file mode 100644 index 00000000..e544c9b6 --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/AddWordsWithoutConfirmationSwitch.java @@ -0,0 +1,39 @@ +package io.github.sspanak.tt9.preferences.screens.languages; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.SwitchPreferenceCompat; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +public class AddWordsWithoutConfirmationSwitch extends SwitchPreferenceCompat { + public AddWordsWithoutConfirmationSwitch(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context); + } + + public AddWordsWithoutConfirmationSwitch(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + public AddWordsWithoutConfirmationSwitch(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public AddWordsWithoutConfirmationSwitch(@NonNull Context context) { + super(context); + init(context); + } + + private void init(Context context) { + setKey("add_word_no_confirmation"); + setTitle(R.string.add_word_no_confirmation); + setVisible(!new SettingsStore(context).isMainLayoutStealth()); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/QuickSwitchLanguagePreference.java b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/QuickSwitchLanguagePreference.java new file mode 100644 index 00000000..74f12e5a --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/screens/languages/QuickSwitchLanguagePreference.java @@ -0,0 +1,40 @@ +package io.github.sspanak.tt9.preferences.screens.languages; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.SwitchPreferenceCompat; + +import io.github.sspanak.tt9.R; +import io.github.sspanak.tt9.preferences.settings.SettingsStore; + +public class QuickSwitchLanguagePreference extends SwitchPreferenceCompat { + public QuickSwitchLanguagePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context); + } + + public QuickSwitchLanguagePreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + public QuickSwitchLanguagePreference(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public QuickSwitchLanguagePreference(@NonNull Context context) { + super(context); + init(context); + } + + private void init(Context context) { + setDefaultValue(true); + setKey("pref_quick_switch_language"); + setTitle(R.string.pref_quick_switch_language_summary); + setVisible(!new SettingsStore(context).isMainLayoutStealth()); + } +} diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java b/app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java index 9b803686..597e5daa 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/PopupBuilder.java @@ -132,6 +132,11 @@ public class PopupBuilder { return null; } + if (main.getView().getWindowToken() == null) { + Logger.d(LOG_TAG, "Not creating popup dialog, because the Main view has no token yet. Try again when it is shown to the user."); + return null; + } + Dialog dialog = DeviceInfo.AT_LEAST_ANDROID_12 ? builder12.create() : builderLegacy.create(); Window window = dialog.getWindow(); diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/AddWordDialog.java b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/AddWordDialog.java index 5174681e..37ba7402 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/AddWordDialog.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/AddWordDialog.java @@ -1,7 +1,5 @@ package io.github.sspanak.tt9.ui.dialogs; -import android.app.Dialog; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -11,20 +9,15 @@ import io.github.sspanak.tt9.ime.TraditionalT9; import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; -import io.github.sspanak.tt9.ui.main.MainView; public class AddWordDialog extends PopupDialog { - @Nullable private final MainView mainView; @NonNull private final Language language; @NonNull private final SettingsStore settings; @Nullable private final String word; - private Dialog popup; - public AddWordDialog(@NonNull TraditionalT9 tt9, @NonNull Language language, @Nullable String word) { super(tt9, R.style.TTheme_AddWord); - mainView = tt9.getMainView(); title = tt9.getResources().getString(R.string.add_word_title); OKLabel = tt9.getResources().getString(R.string.add_word_add); @@ -57,6 +50,8 @@ public class AddWordDialog extends PopupDialog { return; } - render(this::onOK, null, null); + if (!render(this::onOK, null, null)) { + onOK(); + } } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/ChangeLanguageDialog.java b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/ChangeLanguageDialog.java index d9d8301e..9ec5d73e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/ChangeLanguageDialog.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/ChangeLanguageDialog.java @@ -1,6 +1,5 @@ package io.github.sspanak.tt9.ui.dialogs; -import android.app.Dialog; import android.content.DialogInterface; import android.view.KeyEvent; import android.view.View; @@ -18,17 +17,14 @@ import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.languages.LanguageCollection; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.LanguageRadioButton; -import io.github.sspanak.tt9.ui.main.MainView; import io.github.sspanak.tt9.util.ConsumerCompat; import io.github.sspanak.tt9.util.sys.DeviceInfo; public class ChangeLanguageDialog extends PopupDialog { private final ArrayList languages; - private final MainView mainView; private final SettingsStore settings; private final ConsumerCompat onLanguageChanged; - private Dialog popup; private final ArrayList radioButtonsCache = new ArrayList<>(); @@ -38,7 +34,6 @@ public class ChangeLanguageDialog extends PopupDialog { title = tt9.getResources().getString(R.string.language_popup_title); OKLabel = null; - mainView = tt9.getMainView(); settings = tt9.getSettings(); languages = LanguageCollection.getAll(settings.getEnabledLanguageIds(), true); onLanguageChanged = changeHandler; @@ -139,7 +134,7 @@ public class ChangeLanguageDialog extends PopupDialog { } - public void show() { - render(null, this::close, generateRadioButtons()); + public boolean show() { + return render(null, this::close, generateRadioButtons()); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/PopupDialog.java b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/PopupDialog.java index 4683ee6c..97411673 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/PopupDialog.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/dialogs/PopupDialog.java @@ -50,7 +50,7 @@ abstract public class PopupDialog implements DialogInterface.OnKeyListener { return false; } - protected Dialog render(Runnable onOK, Runnable onCancel, View customView) { + protected boolean render(Runnable onOK, Runnable onCancel, View customView) { PopupBuilder popupBuilder = new PopupBuilder(context); if (onOK != null) { popupBuilder.setPositiveButton(OKLabel, onOK); @@ -59,12 +59,14 @@ abstract public class PopupDialog implements DialogInterface.OnKeyListener { popupBuilder.setView(customView); } - return popup = popupBuilder + popup = popupBuilder .setCancelable(true) .setTitle(title) .setMessage(message) .setNegativeButton(true, onCancel) .setOnKeyListener(this) .showFromIme(mainView); + + return popup != null; } } diff --git a/app/src/main/res/xml/prefs_screen_languages.xml b/app/src/main/res/xml/prefs_screen_languages.xml index 93a2cf59..738fde71 100644 --- a/app/src/main/res/xml/prefs_screen_languages.xml +++ b/app/src/main/res/xml/prefs_screen_languages.xml @@ -29,19 +29,13 @@ app:key="dictionary_truncate" app:title="@string/dictionary_truncate_title" /> - + - +