1
0
Fork 0

another attempt to fix the 'priviliged options' problem

This commit is contained in:
sspanak 2024-07-18 16:17:58 +03:00 committed by Dimo Karaivanov
parent 71fd37e1ac
commit df4ec5478f
4 changed files with 49 additions and 2 deletions

View file

@ -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

View file

@ -103,6 +103,7 @@ abstract public class CommandHandler extends TextEditingHandler {
suggestionOps.cancelDelayedAccept();
stopVoiceInput();
UI.showChangeKeyboardDialog(this);
onDeath();
}

View file

@ -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)) {

View file

@ -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();