From a603362223a08b2e1f666c0c3c6da615daff2a5a Mon Sep 17 00:00:00 2001 From: Toni Leino Date: Tue, 28 Apr 2026 16:33:18 +0300 Subject: [PATCH] Fix: terminal freezes when activity is destroyed while new instance already bound When the activity is recreated (e.g. on theme reload or home-launcher restart after Exit), the new TermuxActivity can bind to the service and call setTermuxTerminalSessionClient() before the old activity's onDestroy() runs. The old onDestroy() then calls unsetTermuxTerminalSessionClient() unconditionally, replacing the new activity's session client with the no-op service client. This causes onTextChanged() to stop triggering terminal redraws, freezing the terminal until the app is force-stopped. Fix by passing the calling activity's own client to a new guarded overload of unsetTermuxTerminalSessionClient() that skips the unset if another activity has already taken over the client slot. --- app/src/main/java/com/termux/app/TermuxActivity.java | 4 +++- app/src/main/java/com/termux/app/TermuxService.java | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 0c9f74125b..90e48804c7 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -354,7 +354,9 @@ public void onDestroy() { if (mTermuxService != null) { // Do not leave service and session clients with references to activity. - mTermuxService.unsetTermuxTerminalSessionClient(); + // Pass our own client so we don't clobber a newer activity's client if we are being + // destroyed while a new instance has already bound (e.g. after home-launcher restart). + mTermuxService.unsetTermuxTerminalSessionClient(mTermuxTerminalSessionActivityClient); mTermuxService = null; } diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index 8025d0bd2c..b80d11883e 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -775,6 +775,13 @@ public synchronized void unsetTermuxTerminalSessionClient() { mTermuxTerminalSessionActivityClient = null; } + /** Only unsets the client if it matches {@code client}, so a newly bound activity's client is + * not clobbered by a previous activity's {@code onDestroy()}. */ + public synchronized void unsetTermuxTerminalSessionClient(TermuxTerminalSessionActivityClient client) { + if (mTermuxTerminalSessionActivityClient == client) + unsetTermuxTerminalSessionClient(); + } +