diff --git a/CHANGELOG.md b/CHANGELOG.md index 05b4ea5f5..cf1193fb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Delta Chat Android Changelog +## Unreleased +* Make it possible to invite members into a channel via a QR code, + and make channels more secure + ## v2.22.0 2025-10 diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 41c80cf3f..e74f31221 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 41c80cf3f2dfca71639771e73cf2fd361ec5881d +Subproject commit e74f31221f0b41c5f14d8fe7db6935e639039afa diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index df91fe82e..511d27c7c 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -53,6 +53,7 @@ public class DcContext { public final static int DC_QR_ASK_VERIFYCONTACT = 200; public final static int DC_QR_ASK_VERIFYGROUP = 202; + public final static int DC_QR_ASK_JOIN_BROADCAST= 204; public final static int DC_QR_FPR_OK = 210; public final static int DC_QR_FPR_MISMATCH = 220; public final static int DC_QR_FPR_WITHOUT_ADDR = 230; diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 9aaa1e355..ebb7a100b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1152,7 +1152,10 @@ else if (!body.isEmpty()){ if (doSend) { if (dcContext.sendMsg(dcChat.getId(), msg) == 0) { - Util.runOnMain(()-> Toast.makeText(ConversationActivity.this, dcContext.getLastError(), Toast.LENGTH_LONG).show()); + String lastError = dcContext.getLastError(); + if (!"".equals(lastError)) { + Util.runOnMain(() -> Toast.makeText(ConversationActivity.this, lastError, Toast.LENGTH_LONG).show()); + } future.set(chatId); return; } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java index bc85a3cdf..3b836106b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java @@ -110,7 +110,7 @@ public boolean onCreateOptionsMenu(Menu menu) { if (chatId != 0) { DcChat dcChat = dcContext.getChat(chatId); - menu.findItem(R.id.menu_clone).setVisible(chatIsMultiUser && !chatIsInBroadcast && !chatIsMailingList); + menu.findItem(R.id.menu_clone).setVisible(chatIsMultiUser && !chatIsInBroadcast && !chatIsOutBroadcast && !chatIsMailingList); if (chatIsDeviceTalk) { menu.findItem(R.id.edit_name).setVisible(false); menu.findItem(R.id.show_encr_info).setVisible(false); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index 9aac1f71b..90bab620e 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java @@ -314,10 +314,10 @@ public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact itemData.add(new ItemData(ITEM_DIVIDER, null, 0)); if (dcChat != null) { if (dcChat.canSend() && dcChat.isEncrypted()) { - itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); if (!isOutBroadcast) { - itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); + itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); } + itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); } } for (int value : memberList) { diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index d43f061e4..00da3556d 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -43,6 +43,7 @@ public void handleQrData(String rawString) { switch (qrParsed.getState()) { case DcContext.DC_QR_ASK_VERIFYCONTACT: case DcContext.DC_QR_ASK_VERIFYGROUP: + case DcContext.DC_QR_ASK_JOIN_BROADCAST: showVerifyContactOrGroup(activity, builder, rawString, qrParsed, name); break; @@ -225,6 +226,9 @@ private void showVerifyContactOrGroup(Activity activity, AlertDialog.Builder bui case DcContext.DC_QR_ASK_VERIFYGROUP: msg = activity.getString(R.string.qrscan_ask_join_group, qrParsed.getText1()); break; + case DcContext.DC_QR_ASK_JOIN_BROADCAST: + msg = activity.getString(R.string.qrscan_ask_join_channel, qrParsed.getText1()); + break; default: msg = activity.getString(R.string.ask_start_chat_with, name); break; diff --git a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java index 887e07c80..70ec1fd5f 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java @@ -54,7 +54,9 @@ public SelectedContactsAdapter(@NonNull Context context, public void changeData(Collection contactIds) { contacts.clear(); - contacts.add(DC_CONTACT_ID_ADD_MEMBER); + if (!isBroadcast) { + contacts.add(DC_CONTACT_ID_ADD_MEMBER); + } if (contactIds != null) { for (int id : contactIds) { if (id != DC_CONTACT_ID_SELF) { @@ -75,7 +77,7 @@ public void remove(@NonNull Integer contactId) { } public Set getContacts() { - final Set set = new HashSet<>(contacts.size()-1); + final Set set = new HashSet<>(contacts.size()); for (int i = 1; i < contacts.size(); i++) { set.add(contacts.get(i)); } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 8a05c9687..cd2ed0912 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1020,6 +1020,7 @@ Move the QR code to the camera QR code could not be decoded Do you want to join the group \"%1$s\"? + Do you want to join the channel \"%1$s\"? The scanned fingerprint does not match the last seen for %1$s. This QR code contains a fingerprint but no address.\n\nFor an out-of-band-verification, please establish an encrypted connection to the recipient first. Scanned QR code text:\n\n%1$s