From d0579e93623f670fd9173a96a7b1e9fd49c80e8f Mon Sep 17 00:00:00 2001 From: sspanak Date: Tue, 13 May 2025 15:44:48 +0300 Subject: [PATCH] 9th attempt to fix the privileged options problem: removed onDestroy debugging code and explicitly destroying LanguageCollection and DataStore on shutdown --- .../io/github/sspanak/tt9/db/DataStore.java | 6 ++++++ .../github/sspanak/tt9/ime/TraditionalT9.java | 18 ++++++------------ .../tt9/languages/LanguageCollection.java | 5 +++++ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java b/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java index 55b06629..851958eb 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java @@ -40,6 +40,12 @@ public class DataStore { } + public static void destroy() { + words = null; + pairs = null; + } + + private static void runInThread(@NonNull Runnable action) { executor.submit(action); } 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 2b332447..1688ee1f 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 @@ -1,18 +1,15 @@ package io.github.sspanak.tt9.ime; import android.Manifest; -import android.app.Dialog; import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.view.View; -import android.view.Window; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import androidx.annotation.NonNull; -import io.github.sspanak.tt9.R; import io.github.sspanak.tt9.db.DataStore; import io.github.sspanak.tt9.db.words.DictionaryLoader; import io.github.sspanak.tt9.hacks.InputType; @@ -248,6 +245,8 @@ public class TraditionalT9 extends MainViewHandler { backgroundTasks.removeCallbacksAndMessages(null); zombieChecks = SettingsStore.ZOMBIE_CHECK_MAX; zombieDetector.removeCallbacksAndMessages(null); + LanguageCollection.destroy(); + DataStore.destroy(); Logger.d(LOG_TAG, "===> Final cleanup completed"); } @@ -262,18 +261,13 @@ public class TraditionalT9 extends MainViewHandler { cleanUp(); isDead = true; - // @todo: investigate the crash and remove this try-catch try { super.onDestroy(); } catch (Exception e) { - Dialog win = getWindow(); - Window winwin = win != null ? win.getWindow() : null; - View keys = winwin != null ? winwin.findViewById(R.id.main_soft_keys) : null; - boolean hasWindowToken = keys != null && keys.getWindowToken() != null; - boolean hasAppToken = keys != null && keys.getApplicationWindowToken() != null; - - String shutdownDebug = "Window token: " + hasWindowToken + "; App token: " + hasAppToken + "; main view: " + (keys != null) + "; window.window: " + (winwin != null) + "; window: " + (win != null); - throw new RuntimeException("Parent failed to destroy." + shutdownDebug); + if (mainView != null && mainView.getView() != null) { + Logger.e(LOG_TAG, "===> MainView destroy failed: " + e.getMessage() + ". Destroying manually."); + mainView.destroy(); + } } Logger.d(LOG_TAG, "===> Shutdown completed"); diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java index 631749cd..a107d05b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java +++ b/app/src/main/java/io/github/sspanak/tt9/languages/LanguageCollection.java @@ -37,6 +37,11 @@ public class LanguageCollection { } + public static void destroy() { + self = null; + } + + @Nullable public static NaturalLanguage getLanguage(String langId) { try {