From da24279632a15a595f165913ee581ad4219c60b1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:39:18 +0000 Subject: [PATCH 1/3] Initial plan From a755ded2db35695f7e1b2400e3ebdcb27ba3404c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:16:44 +0000 Subject: [PATCH 2/3] Fix crash when ConversationActivity receives intent with invalid chat ID (0) Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com> --- .../thoughtcrime/securesms/ConversationActivity.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index dcc94c486..345144626 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -325,6 +325,11 @@ protected void onNewIntent(Intent intent) { return; } + if (intent.getIntExtra(CHAT_ID_EXTRA, DcChat.DC_CHAT_NO_CHAT) == DcChat.DC_CHAT_NO_CHAT) { + Log.w(TAG, "onNewIntent: ignoring intent with invalid chat ID"); + return; + } + if (!Util.isEmpty(composeText) || attachmentManager.isAttachmentPresent()) { processComposeControls(ACTION_SAVE_DRAFT); attachmentManager.clear(glideRequests, false); @@ -1116,8 +1121,11 @@ private void initializeResources() { initializeBackground(); } chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1); - if (chatId == DcChat.DC_CHAT_NO_CHAT) - throw new IllegalStateException("can't display a conversation for no chat."); + if (chatId == DcChat.DC_CHAT_NO_CHAT) { + Log.e(TAG, "initializeResources: invalid chat ID, finishing activity"); + finish(); + return; + } dcChat = DcHelper.getContext(context).getChat(chatId); recipient = new Recipient(this, dcChat); glideRequests = GlideApp.with(this); From 214ee63c4ae805c4004c7acc5f67fe004cc0b9a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:27:14 +0000 Subject: [PATCH 3/3] Fix root causes of crash: prevent chatId=0 from being passed to ConversationActivity Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com> --- .../org/thoughtcrime/securesms/ConversationActivity.java | 2 +- .../org/thoughtcrime/securesms/ConversationFragment.java | 4 ++++ .../java/org/thoughtcrime/securesms/ShareActivity.java | 2 +- .../securesms/contacts/NewContactActivity.java | 8 +++++--- .../java/org/thoughtcrime/securesms/qr/QrCodeHandler.java | 4 ++++ 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 345144626..73d14a578 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1122,7 +1122,7 @@ private void initializeResources() { } chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1); if (chatId == DcChat.DC_CHAT_NO_CHAT) { - Log.e(TAG, "initializeResources: invalid chat ID, finishing activity"); + Log.e(TAG, "initializeResources: invalid chat ID " + chatId + ", finishing activity"); finish(); return; } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 46e5de0b1..3929174dc 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -646,6 +646,10 @@ private void handleReplyMessagePrivately(final DcMsg msg) { if (getActivity() != null) { DcContext dcContext = DcHelper.getContext(getActivity()); int privateChatId = dcContext.createChatByContactId(msg.getFromId()); + if (privateChatId == 0) { + Log.w(TAG, "createChatByContactId returned 0, cannot reply privately"); + return; + } DcMsg replyMsg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT); replyMsg.setQuote(msg); dcContext.setDraft(privateChatId, replyMsg); diff --git a/src/main/java/org/thoughtcrime/securesms/ShareActivity.java b/src/main/java/org/thoughtcrime/securesms/ShareActivity.java index a9fb0ccc3..bd2013b16 100644 --- a/src/main/java/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ShareActivity.java @@ -268,7 +268,7 @@ private void handleResolvedMedia(Intent intent) { accId = dcContext.getAccountId(); } Intent composeIntent; - if (accId != -1 && chatId != -1) { + if (accId != -1 && chatId > 0) { composeIntent = getBaseShareIntent(ConversationActivity.class); composeIntent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId); composeIntent.putExtra(ConversationActivity.ACCOUNT_ID_EXTRA, accId); diff --git a/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java b/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java index 5fb33d4dd..759f7b29e 100644 --- a/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java @@ -88,9 +88,11 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { setResult(RESULT_OK, intent); } else { int chatId = dcContext.createChatByContactId(contactId); - Intent intent = new Intent(this, ConversationActivity.class); - intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId); - startActivity(intent); + if (chatId != 0) { + Intent intent = new Intent(this, ConversationActivity.class); + intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId); + startActivity(intent); + } } finish(); return true; diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index 2b8af6bbf..f9aabea23 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -324,6 +324,10 @@ private void showFingerprintOrQrSuccess( R.string.start_chat, (dialogInterface, i) -> { int chatId = dcContext.createChatByContactId(qrParsed.getId()); + if (chatId == 0) { + Log.w(TAG, "createChatByContactId returned 0, ignoring"); + return; + } Intent intent = new Intent(activity, ConversationActivity.class); intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId); if (qrParsed.getText1Meaning() == DcLot.DC_TEXT1_DRAFT) {