From a7d4fa8318bf423d2bd28f571cf4363e55b36fe7 Mon Sep 17 00:00:00 2001 From: sspanak Date: Tue, 13 May 2025 14:57:25 +0300 Subject: [PATCH] fixed several async operation listeners, assigned to static objects, not being cleared after the end of the operation --- .../tt9/db/customWords/CustomWordsImporter.java | 9 +++++++++ .../sspanak/tt9/db/words/DictionaryDeleter.java | 6 ++---- .../sspanak/tt9/db/words/DictionaryLoader.java | 17 ++++++++++++++--- .../sspanak/tt9/ime/TextEditingHandler.java | 2 +- .../github/sspanak/tt9/ime/TraditionalT9.java | 2 ++ .../github/sspanak/tt9/util/sys/Clipboard.java | 4 ++++ 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/db/customWords/CustomWordsImporter.java b/app/src/main/java/io/github/sspanak/tt9/db/customWords/CustomWordsImporter.java index b79f1b4d..4489ed5e 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/customWords/CustomWordsImporter.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/customWords/CustomWordsImporter.java @@ -48,6 +48,13 @@ public class CustomWordsImporter extends AbstractFileProcessor { } + public void clearAllHandlers() { + failureHandler = null; + progressHandler = null; + successHandler = null; + } + + public void setProgressHandler(ConsumerCompat handler) { progressHandler = handler; } @@ -71,6 +78,7 @@ public class CustomWordsImporter extends AbstractFileProcessor { protected void sendSuccess() { if (successHandler != null) { successHandler.accept(file.getName()); + clearAllHandlers(); } } @@ -78,6 +86,7 @@ public class CustomWordsImporter extends AbstractFileProcessor { private void sendFailure(String errorMessage) { if (failureHandler != null) { failureHandler.accept(errorMessage); + clearAllHandlers(); } } diff --git a/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryDeleter.java b/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryDeleter.java index 02609658..e07048a6 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryDeleter.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryDeleter.java @@ -58,10 +58,7 @@ public class DictionaryDeleter extends BaseSyncStore { } deleteTask = null; - - if (notification != null) { - notification.run(); - } + onFinish(); Logger.d(LOG_TAG, "Deleted " + languages.size() + " languages. Time: " + Timer.stop(LOG_TAG) + " ms"); } @@ -91,6 +88,7 @@ public class DictionaryDeleter extends BaseSyncStore { private void onFinish() { if (notification != null) { notification.run(); + notification = null; } } diff --git a/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryLoader.java b/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryLoader.java index de64bf51..e8bae0cf 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryLoader.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/words/DictionaryLoader.java @@ -350,7 +350,12 @@ public class DictionaryLoader { progressMsg.putLong("time", Timer.get(IMPORT_TIMER)); progressMsg.putInt("progress", Math.round(progress)); progressMsg.putInt("currentFile", currentFile); - asyncHandler.post(() -> onStatusChange.accept(progressMsg)); + asyncHandler.post(() -> { + onStatusChange.accept(progressMsg); + if (progress >= 100) { + onStatusChange = null; + } + }); } @@ -363,7 +368,10 @@ public class DictionaryLoader { Bundle errorMsg = new Bundle(); errorMsg.putString("error", message); errorMsg.putInt("languageId", langId); - asyncHandler.post(() -> onStatusChange.accept(errorMsg)); + asyncHandler.post(() -> { + onStatusChange.accept(errorMsg); + onStatusChange = null; + }); } @@ -377,7 +385,10 @@ public class DictionaryLoader { errorMsg.putString("error", message); errorMsg.putLong("fileLine", fileLine + 1); errorMsg.putInt("languageId", langId); - asyncHandler.post(() -> onStatusChange.accept(errorMsg)); + asyncHandler.post(() -> { + onStatusChange.accept(errorMsg); + onStatusChange = null; + }); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TextEditingHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/TextEditingHandler.java index 821b7ad4..ce8a2bfc 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TextEditingHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TextEditingHandler.java @@ -110,7 +110,7 @@ abstract public class TextEditingHandler extends VoiceHandler { mainView.showCommandPalette(); } - Clipboard.setOnChangeListener(this, null); + Clipboard.clearListener(this); resetStatus(); return true; } 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 d1913c56..2b332447 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 @@ -22,6 +22,7 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.ui.UI; import io.github.sspanak.tt9.ui.dialogs.RequestPermissionDialog; import io.github.sspanak.tt9.util.Logger; +import io.github.sspanak.tt9.util.sys.Clipboard; import io.github.sspanak.tt9.util.sys.DeviceInfo; import io.github.sspanak.tt9.util.sys.SystemSettings; @@ -174,6 +175,7 @@ public class TraditionalT9 extends MainViewHandler { stopVoiceInput(); onFinishTyping(); suggestionOps.clear(); + Clipboard.clearListener(this); statusBar.setText(mInputMode); if (isInputViewShown()) { diff --git a/app/src/main/java/io/github/sspanak/tt9/util/sys/Clipboard.java b/app/src/main/java/io/github/sspanak/tt9/util/sys/Clipboard.java index bd865fcb..cb72c8e4 100644 --- a/app/src/main/java/io/github/sspanak/tt9/util/sys/Clipboard.java +++ b/app/src/main/java/io/github/sspanak/tt9/util/sys/Clipboard.java @@ -65,6 +65,10 @@ public class Clipboard { externalChangeListener = newListener; } + public static void clearListener(Context context) { + setOnChangeListener(context, null); + } + private static void changeListener() { if (ignoreNextChange) { ignoreNextChange = false;