Skip to content

Commit 717777f

Browse files
Hocuriadbenitez
andauthored
Show channels in a proper "Channel" chat (#3783)
* Rename "broadcast list" to "channel"/"broadcast channel" both in UI and code * feat: Add new channel types * Update CHANGELOG.md * adb's review * refactor: Rename BroadcastChannel to Broadcast * Revert accidental change * Make it possible to leave channels - In a chat, if the chat is an InBroadcast, and it's not a contact request, then the `Leave` menu option is shown with the translated stock string `menu_leave_channel` as its label. - If the user clicks on it, the confirmation dialog has `menu_leave_channel` (rather than `menu_leave_group`) as its positive option. Counterpart of chatmail/core#6984. --------- Co-authored-by: adbenitez <asieldbenitez@gmail.com> Co-authored-by: adb <adb@merlinux.eu>
1 parent 23d521b commit 717777f

23 files changed

+102
-55
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
* Improve hint for app drafts
1111
* Add Text-To-Speech (TTS) support for in-chat apps
1212
* New icon for the QR icon
13+
* Start rebuilding the experimental broadcast lists
14+
into proper channels - note that this is work-in-progress
1315
* Improved separation between unencryted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
1416
* Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon
1517
* Classic email chats/threads get a big email / letter icon making it easy to recognize

src/main/java/com/b44t/messenger/DcChat.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ public class DcChat {
66
public static final int DC_CHAT_TYPE_SINGLE = 100;
77
public static final int DC_CHAT_TYPE_GROUP = 120;
88
public static final int DC_CHAT_TYPE_MAILINGLIST = 140;
9-
public static final int DC_CHAT_TYPE_BROADCAST = 160;
9+
public static final int DC_CHAT_TYPE_OUT_BROADCAST = 160;
10+
public static final int DC_CHAT_TYPE_IN_BROADCAST = 165;
1011

1112
public static final int DC_CHAT_NO_CHAT = 0;
1213
public final static int DC_CHAT_ID_ARCHIVED_LINK = 6;
@@ -54,15 +55,18 @@ public DcChat(int accountId, long chatCPtr) {
5455

5556
public boolean isMultiUser() {
5657
int type = getType();
57-
return type == DC_CHAT_TYPE_GROUP || type == DC_CHAT_TYPE_MAILINGLIST || type == DC_CHAT_TYPE_BROADCAST;
58+
return type != DC_CHAT_TYPE_SINGLE;
5859
}
5960

6061
public boolean isMailingList() {
6162
return getType() == DC_CHAT_TYPE_MAILINGLIST;
6263
}
6364

64-
public boolean isBroadcast() {
65-
return getType() == DC_CHAT_TYPE_BROADCAST;
65+
public boolean isInBroadcast() {
66+
return getType() == DC_CHAT_TYPE_IN_BROADCAST;
67+
}
68+
public boolean isOutBroadcast() {
69+
return getType() == DC_CHAT_TYPE_OUT_BROADCAST;
6670
}
6771

6872
public boolean isHalfBlocked() {

src/main/java/com/b44t/messenger/DcContact.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class DcContact {
1010
public final static int DC_CONTACT_ID_NEW_GROUP = -2; // - " -
1111
public final static int DC_CONTACT_ID_ADD_MEMBER = -3; // - " -
1212
public final static int DC_CONTACT_ID_QR_INVITE = -4; // - " -
13-
public final static int DC_CONTACT_ID_NEW_BROADCAST_LIST = -5; // - " -
13+
public final static int DC_CONTACT_ID_NEW_BROADCAST = -5; // - " -
1414
public final static int DC_CONTACT_ID_ADD_ACCOUNT = -6; // - " -
1515

1616
public DcContact(long contactCPtr) {

src/main/java/com/b44t/messenger/rpc/Rpc.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ public void addOrUpdateTransport(int accountId, EnteredLoginParam param) throws
160160
getResult("add_or_update_transport", accountId, param);
161161
}
162162

163+
public int createBroadcast(int accountId, String chatName) throws RpcException {
164+
return gson.fromJson(getResult("create_broadcast", accountId, chatName), Integer.class);
165+
}
166+
163167
private static class Request {
164168
private final String jsonrpc = "2.0";
165169
public final String method;

src/main/java/org/thoughtcrime/securesms/ConversationActivity.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959

6060
import androidx.annotation.NonNull;
6161
import androidx.annotation.Nullable;
62+
import androidx.annotation.StringRes;
6263
import androidx.appcompat.app.ActionBar;
6364
import androidx.appcompat.app.AlertDialog;
6465
import androidx.appcompat.widget.SearchView;
@@ -431,7 +432,7 @@ public boolean onPrepareOptionsMenu(Menu menu) {
431432

432433
getMenuInflater().inflate(R.menu.conversation, menu);
433434

434-
if (dcChat.isSelfTalk() || dcChat.isBroadcast()) {
435+
if (dcChat.isSelfTalk() || dcChat.isOutBroadcast()) {
435436
menu.findItem(R.id.menu_mute_notifications).setVisible(false);
436437
} else if(dcChat.isMuted()) {
437438
menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute);
@@ -441,14 +442,16 @@ public boolean onPrepareOptionsMenu(Menu menu) {
441442
menu.findItem(R.id.menu_show_map).setVisible(false);
442443
}
443444

444-
if (!dcChat.canSend() || dcChat.isBroadcast() || dcChat.isMailingList()) {
445+
if (!dcChat.canSend() || dcChat.isMailingList() ) {
445446
menu.findItem(R.id.menu_ephemeral_messages).setVisible(false);
446447
}
447448

448449
if (isMultiUser()) {
449-
if (dcChat.isEncrypted()
450+
if (dcChat.isInBroadcast() && !dcChat.isContactRequest()) {
451+
menu.findItem(R.id.menu_leave).setTitle(R.string.menu_leave_channel).setVisible(true);
452+
} else if (dcChat.isEncrypted()
450453
&& dcChat.canSend()
451-
&& !dcChat.isBroadcast()
454+
&& !dcChat.isOutBroadcast()
452455
&& !dcChat.isMailingList()) {
453456
menu.findItem(R.id.menu_leave).setVisible(true);
454457
}
@@ -625,9 +628,16 @@ private void handleAllMedia() {
625628
}
626629

627630
private void handleLeaveGroup() {
631+
@StringRes int leaveLabel;
632+
if (dcChat.isInBroadcast()) {
633+
leaveLabel = R.string.menu_leave_channel;
634+
} else {
635+
leaveLabel = R.string.menu_leave_group;
636+
}
637+
628638
AlertDialog dialog = new AlertDialog.Builder(this)
629639
.setMessage(getString(R.string.ask_leave_group))
630-
.setPositiveButton(R.string.menu_leave_group, (d, which) -> {
640+
.setPositiveButton(leaveLabel, (d, which) -> {
631641
dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
632642
Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show();
633643
})

src/main/java/org/thoughtcrime/securesms/ConversationFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ public void onActivityCreated(Bundle bundle) {
168168
private void setNoMessageText() {
169169
DcChat dcChat = getListAdapter().getChat();
170170
if(dcChat.isMultiUser()){
171-
if (dcChat.isBroadcast()) {
172-
noMessageTextView.setText(R.string.chat_new_broadcast_hint);
171+
if (dcChat.isInBroadcast() || dcChat.isOutBroadcast()) {
172+
noMessageTextView.setText(R.string.chat_new_channel_hint);
173173
} else if (dcChat.isUnpromoted()) {
174174
noMessageTextView.setText(R.string.chat_new_group_hint);
175175
}

src/main/java/org/thoughtcrime/securesms/ConversationTitleView.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ public void setTitle(@NonNull GlideRequests glideRequests, @NonNull DcChat dcCha
8787
} else {
8888
subtitleStr = context.getString(R.string.mailing_list);
8989
}
90-
} else if (dcChat.isBroadcast()) {
90+
} else if (dcChat.isInBroadcast()) {
91+
subtitleStr = context.getString(R.string.channel);
92+
} else if (dcChat.isOutBroadcast()) {
9193
if (!profileView) {
9294
subtitleStr = context.getResources().getQuantityString(R.plurals.n_recipients, chatContacts.length, chatContacts.length);
9395
}

src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.b44t.messenger.DcChat;
2424
import com.b44t.messenger.DcContact;
2525
import com.b44t.messenger.DcContext;
26+
import com.b44t.messenger.rpc.RpcException;
2627
import com.bumptech.glide.load.engine.DiskCacheStrategy;
2728
import com.bumptech.glide.request.target.CustomTarget;
2829
import com.bumptech.glide.request.transition.Transition;
@@ -48,7 +49,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
4849
{
4950

5051
public static final String EDIT_GROUP_CHAT_ID = "edit_group_chat_id";
51-
public static final String CREATE_BROADCAST = "group_create_broadcast";
52+
public static final String CREATE_BROADCAST = "create_broadcast";
5253
public static final String CLONE_CHAT_EXTRA = "clone_chat";
5354

5455
private static final int PICK_CONTACT = 1;
@@ -58,7 +59,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
5859
private DcContext dcContext;
5960

6061
private boolean verified;
61-
private boolean broadcast;
62+
private boolean broadcast;
6263
private EditText groupName;
6364
private ListView lv;
6465
private ImageView avatar;
@@ -88,12 +89,12 @@ protected void onCreate(Bundle state, boolean ready) {
8889
isEdit = true;
8990
DcChat dcChat = dcContext.getChat(groupChatId);
9091
verified = dcChat.isProtected();
91-
broadcast = dcChat.isBroadcast();
92+
broadcast = dcChat.isOutBroadcast();
9293
}
9394

9495
int chatId = getIntent().getIntExtra(CLONE_CHAT_EXTRA, 0);
9596
if (chatId != 0) {
96-
broadcast = dcContext.getChat(chatId).isBroadcast();
97+
broadcast = dcContext.getChat(chatId).isOutBroadcast();
9798
}
9899

99100
initializeResources();
@@ -120,7 +121,7 @@ private void updateViewState() {
120121
title = getString(R.string.global_menu_edit_desktop);
121122
}
122123
else if(broadcast) {
123-
title = getString(R.string.new_broadcast_list);
124+
title = getString(R.string.new_channel);
124125
}
125126
else {
126127
title = getString(R.string.menu_new_group);
@@ -160,9 +161,8 @@ private void initializeResources() {
160161
}
161162

162163
if (broadcast) {
163-
avatar.setVisibility(View.GONE);
164-
groupName.setHint(R.string.broadcast_list_name);
165-
chatHints.setVisibility(isEdit()? View.GONE : View.VISIBLE);
164+
groupName.setHint(R.string.channel_name);
165+
chatHints.setVisibility(View.VISIBLE);
166166
} else {
167167
chatHints.setVisibility(View.GONE);
168168
}
@@ -257,8 +257,12 @@ public void onItemDeleteClick(int contactId) {
257257

258258
private void createGroup(String groupName) {
259259
if (broadcast) {
260-
groupChatId = dcContext.createBroadcastList();
261-
dcContext.setChatName(groupChatId, groupName);
260+
try {
261+
groupChatId = DcHelper.getRpc(this).createBroadcast(dcContext.getAccountId(), groupName);
262+
} catch (RpcException e) {
263+
e.printStackTrace();
264+
return;
265+
}
262266
} else {
263267
groupChatId = dcContext.createGroupChat(verified, groupName);
264268
}

src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ private void handleIntent() {
102102
public void onContactSelected(int contactId) {
103103
if(contactId == DcContact.DC_CONTACT_ID_NEW_GROUP) {
104104
startActivity(new Intent(this, GroupCreateActivity.class));
105-
} else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) {
105+
} else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST) {
106106
Intent intent = new Intent(this, GroupCreateActivity.class);
107107
intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true);
108108
startActivity(intent);

src/main/java/org/thoughtcrime/securesms/ProfileActivity.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
5151
private boolean chatIsMultiUser;
5252
private boolean chatIsDeviceTalk;
5353
private boolean chatIsMailingList;
54-
private boolean chatIsBroadcast;
54+
private boolean chatIsOutBroadcast;
55+
private boolean chatIsInBroadcast;
5556
private int contactId;
5657
private boolean contactIsBot;
5758
private Toolbar toolbar;
@@ -76,8 +77,8 @@ protected void onCreate(Bundle bundle, boolean ready) {
7677
String title = getString(R.string.profile);
7778
if (chatIsMailingList) {
7879
title = getString(R.string.mailing_list);
79-
} else if (chatIsBroadcast) {
80-
title = getString(R.string.broadcast_list);
80+
} else if (chatIsOutBroadcast || chatIsInBroadcast) {
81+
title = getString(R.string.channel);
8182
} else if (chatIsMultiUser) {
8283
title = getString(R.string.tab_group);
8384
} else if (contactIsBot) {
@@ -114,8 +115,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
114115
menu.findItem(R.id.show_encr_info).setVisible(false);
115116
menu.findItem(R.id.share).setVisible(false);
116117
} else if (chatIsMultiUser) {
117-
menu.findItem(R.id.edit_name).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
118-
if (chatIsBroadcast) {
118+
if (chatIsOutBroadcast) {
119119
canReceive = false;
120120
} else {
121121
if (!dcChat.isEncrypted()
@@ -190,7 +190,8 @@ private void initializeResources() {
190190
chatIsMultiUser = false;
191191
chatIsDeviceTalk = false;
192192
chatIsMailingList= false;
193-
chatIsBroadcast = false;
193+
chatIsInBroadcast = false;
194+
chatIsOutBroadcast = false;
194195

195196
if (contactId!=0) {
196197
DcContact dcContact = dcContext.getContact(contactId);
@@ -203,7 +204,8 @@ private void initializeResources() {
203204
chatIsMultiUser = dcChat.isMultiUser();
204205
chatIsDeviceTalk = dcChat.isDeviceTalk();
205206
chatIsMailingList = dcChat.isMailingList();
206-
chatIsBroadcast = dcChat.isBroadcast();
207+
chatIsInBroadcast = dcChat.isInBroadcast();
208+
chatIsOutBroadcast = dcChat.isOutBroadcast();
207209
if(!chatIsMultiUser) {
208210
final int[] members = dcContext.getChatContacts(chatId);
209211
contactId = members.length>=1? members[0] : 0;

0 commit comments

Comments
 (0)