From ae260fad9cff11c40334eb895d1d0e05942b03d5 Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Thu, 18 Mar 2021 22:19:33 +0500 Subject: [PATCH] Fix old bug where termux app would crash if sessions list ListView was not notified of new sessions To reproduce: 1. Create 2 sessions. 2. From either session, run a random `RUN_COMMAND` intent command with `am` command and shift to the other session. Termux app would crash and throw the `The content of the adapter has changed but ListView did not receive a notification.` exception. TermuxService was previously not notifying the ListView of the sessions list that a new session has been added, if the activity was in foreground. --- .../main/java/com/termux/app/TermuxService.java | 5 +++++ .../termux/app/terminal/TermuxSessionClient.java | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxService.java b/app/src/main/java/com/termux/app/TermuxService.java index fe7abe74..cc960e90 100644 --- a/app/src/main/java/com/termux/app/TermuxService.java +++ b/app/src/main/java/com/termux/app/TermuxService.java @@ -319,6 +319,11 @@ public final class TermuxService extends Service { TermuxAppSharedPreferences preferences = new TermuxAppSharedPreferences(this); preferences.setCurrentSession(newSession.mHandle); + // Notify {@link TermuxSessionsListViewController} that sessions list has been updated if + // activity in is foreground + if(mTermuxSessionClient != null) + mTermuxSessionClient.terminalSessionListNotifyUpdated(); + // Launch the main Termux app, which will now show the current session: startActivity(new Intent(this, TermuxActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } diff --git a/app/src/main/java/com/termux/app/terminal/TermuxSessionClient.java b/app/src/main/java/com/termux/app/terminal/TermuxSessionClient.java index 79972773..467b778b 100644 --- a/app/src/main/java/com/termux/app/terminal/TermuxSessionClient.java +++ b/app/src/main/java/com/termux/app/terminal/TermuxSessionClient.java @@ -68,7 +68,7 @@ public class TermuxSessionClient extends TermuxSessionClientBase { mActivity.showToast(toToastTitle(updatedSession), true); } - mActivity.terminalSessionListNotifyUpdated(); + terminalSessionListNotifyUpdated(); } @Override @@ -101,7 +101,7 @@ public class TermuxSessionClient extends TermuxSessionClientBase { } } - mActivity.terminalSessionListNotifyUpdated(); + terminalSessionListNotifyUpdated(); } @Override @@ -152,7 +152,7 @@ public class TermuxSessionClient extends TermuxSessionClientBase { TerminalSession session = mActivity.getCurrentSession(); final int indexOfSession = mActivity.getTermuxService().getSessions().indexOf(session); mActivity.showToast(toToastTitle(session), false); - mActivity.terminalSessionListNotifyUpdated(); + terminalSessionListNotifyUpdated(); final ListView termuxSessionsListView = mActivity.findViewById(R.id.terminal_sessions_list); termuxSessionsListView.setItemChecked(indexOfSession, true); @@ -178,7 +178,7 @@ public class TermuxSessionClient extends TermuxSessionClientBase { DialogUtils.textInput(mActivity, R.string.session_rename_title, sessionToRename.mSessionName, R.string.session_rename_positive_button, text -> { sessionToRename.mSessionName = text; - mActivity.terminalSessionListNotifyUpdated(); + terminalSessionListNotifyUpdated(); }, -1, null, -1, null, null); } @@ -250,7 +250,7 @@ public class TermuxSessionClient extends TermuxSessionClientBase { TermuxService service = mActivity.getTermuxService(); int index = service.removeTerminalSession(finishedSession); - mActivity.terminalSessionListNotifyUpdated(); + terminalSessionListNotifyUpdated(); if (mActivity.getTermuxService().getSessions().isEmpty()) { // There are no sessions to show, so finish the activity. mActivity.finishActivityIfNotFinishing(); @@ -262,6 +262,10 @@ public class TermuxSessionClient extends TermuxSessionClientBase { } } + public void terminalSessionListNotifyUpdated() { + mActivity.terminalSessionListNotifyUpdated(); + } + String toToastTitle(TerminalSession session) {