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.
This commit is contained in:
agnostic-apollo
2021-03-18 22:19:33 +05:00
parent d9b5344b24
commit ae260fad9c
2 changed files with 14 additions and 5 deletions

View File

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

View File

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