From df4ec5478fbb0ac26ca36b90e36708134eeda51d Mon Sep 17 00:00:00 2001 From: sspanak Date: Thu, 18 Jul 2024 16:17:58 +0300 Subject: [PATCH] another attempt to fix the 'priviliged options' problem --- .../sspanak/tt9/ime/AbstractHandler.java | 1 + .../sspanak/tt9/ime/CommandHandler.java | 1 + .../github/sspanak/tt9/ime/TraditionalT9.java | 31 +++++++++++++++++++ .../sspanak/tt9/util/SystemSettings.java | 18 +++++++++-- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/AbstractHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/AbstractHandler.java index f14e68b6..cb803fba 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/AbstractHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/AbstractHandler.java @@ -21,6 +21,7 @@ abstract public class AbstractHandler extends InputMethodService { abstract protected boolean onStart(InputConnection inputConnection, EditorInfo inputField); abstract protected void onFinishTyping(); abstract protected void onStop(); + abstract protected void onDeath(); abstract protected void setInputField(InputConnection inputConnection, EditorInfo inputField); // UI 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 431ba2ee..e1d3fbd9 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 @@ -103,6 +103,7 @@ abstract public class CommandHandler extends TextEditingHandler { suggestionOps.cancelDelayedAccept(); stopVoiceInput(); UI.showChangeKeyboardDialog(this); + onDeath(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java index 663c0ae7..b7cbe0c0 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -17,10 +17,12 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.dialogs.PopupDialog; import io.github.sspanak.tt9.util.Logger; +import io.github.sspanak.tt9.util.SystemSettings; public class TraditionalT9 extends MainViewHandler { @NonNull private final Handler normalizationHandler = new Handler(Looper.getMainLooper()); + private final Handler deathDetector = new Handler(Looper.getMainLooper()); @Override @@ -116,6 +118,8 @@ public class TraditionalT9 extends MainViewHandler { @Override protected boolean onStart(InputConnection connection, EditorInfo field) { + deathDetector.removeCallbacksAndMessages(null); + if (!super.onStart(connection, field)) { return false; } @@ -157,6 +161,33 @@ public class TraditionalT9 extends MainViewHandler { } + /** + * On Android 11 the IME is sometimes not killed when the user switches to a different one. + * Here we attempt to detect if we are disabled, then hide and kill ourselves. + */ + protected void onDeath() { + if (SystemSettings.isTT9Active(this)) { + Logger.w("onDeath", "===> Still active, rescheduling"); + deathDetector.postDelayed(this::onDeath, 2000); + return; + } else { + deathDetector.removeCallbacksAndMessages(null); + } + + Logger.w("onDeath", "===> Killing self"); + requestHideSelf(0); + onStop(); + stopSelf(); + } + + + @Override + public void onDestroy() { + super.onDestroy(); + onDeath(); + } + + @Override protected boolean onNumber(int key, boolean hold, int repeat) { if (mInputMode instanceof ModePredictive && DictionaryLoader.autoLoad(this, mLanguage)) { diff --git a/app/src/main/java/io/github/sspanak/tt9/util/SystemSettings.java b/app/src/main/java/io/github/sspanak/tt9/util/SystemSettings.java index 763d3ae6..e0caff7c 100644 --- a/app/src/main/java/io/github/sspanak/tt9/util/SystemSettings.java +++ b/app/src/main/java/io/github/sspanak/tt9/util/SystemSettings.java @@ -1,9 +1,9 @@ package io.github.sspanak.tt9.util; -import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.LocaleList; +import android.provider.Settings; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -14,7 +14,7 @@ public class SystemSettings { private static InputMethodManager inputManager; private static String packageName; - public static boolean isTT9Enabled(Activity context) { + public static boolean isTT9Enabled(Context context) { inputManager = inputManager == null ? (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE) : inputManager; packageName = packageName == null ? context.getPackageName() : packageName; @@ -26,6 +26,20 @@ public class SystemSettings { return false; } + public static boolean isTT9Active(Context context) { + String defaultIME = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + inputManager = inputManager == null ? (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE) : inputManager; + packageName = packageName == null ? context.getPackageName() : packageName; + + + for (final InputMethodInfo imeInfo : inputManager.getEnabledInputMethodList()) { + if (packageName.equals(imeInfo.getPackageName()) && imeInfo.getId().equals(defaultIME)) { + return true; + } + } + return false; + } + public static String getLocale() { Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? LocaleList.getDefault().get(0) : Locale.getDefault(); String country = locale.getCountry();