diff --git a/CHANGELOG.md b/CHANGELOG.md index 60149bd39..ff15b4924 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +* Make it possible to invite members into a channel via a QR code, + and make channels more secure * metadata protection: protect Date header * metadata protection: protect Autocrypt header * better multi-device: synchronize group creation across devices diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index 11611665a..ffc30e9b5 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 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity 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 class ProfileActivity extends PassphraseRequiredActionBarActivity 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 class ProfileAdapter extends RecyclerView.Adapter 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 7e167a36b..cc5424cf5 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 class QrCodeHandler { 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; @@ -216,6 +217,9 @@ public class QrCodeHandler { 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 class SelectedContactsAdapter extends BaseAdapter { 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 class SelectedContactsAdapter extends BaseAdapter { } 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 a14f95777..0832aea3a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -986,6 +986,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