diff --git a/CHANGELOG.md b/CHANGELOG.md index ac01a7a04..f82f9f021 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ * Improve hint for app drafts * Add Text-To-Speech (TTS) support for in-chat apps * New icon for the QR icon +* Start rebuilding the experimental broadcast lists + into proper channels - note that this is work-in-progress * Improved separation between unencryted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat * Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon * Classic email chats/threads get a big email / letter icon making it easy to recognize diff --git a/src/main/java/com/b44t/messenger/DcChat.java b/src/main/java/com/b44t/messenger/DcChat.java index 7dee839b8..b98d49879 100644 --- a/src/main/java/com/b44t/messenger/DcChat.java +++ b/src/main/java/com/b44t/messenger/DcChat.java @@ -6,7 +6,8 @@ public class DcChat { public static final int DC_CHAT_TYPE_SINGLE = 100; public static final int DC_CHAT_TYPE_GROUP = 120; public static final int DC_CHAT_TYPE_MAILINGLIST = 140; - public static final int DC_CHAT_TYPE_BROADCAST = 160; + public static final int DC_CHAT_TYPE_OUT_BROADCAST = 160; + public static final int DC_CHAT_TYPE_IN_BROADCAST = 165; public static final int DC_CHAT_NO_CHAT = 0; public final static int DC_CHAT_ID_ARCHIVED_LINK = 6; @@ -54,15 +55,18 @@ public class DcChat { public boolean isMultiUser() { int type = getType(); - return type == DC_CHAT_TYPE_GROUP || type == DC_CHAT_TYPE_MAILINGLIST || type == DC_CHAT_TYPE_BROADCAST; + return type != DC_CHAT_TYPE_SINGLE; } public boolean isMailingList() { return getType() == DC_CHAT_TYPE_MAILINGLIST; } - public boolean isBroadcast() { - return getType() == DC_CHAT_TYPE_BROADCAST; + public boolean isInBroadcast() { + return getType() == DC_CHAT_TYPE_IN_BROADCAST; + } + public boolean isOutBroadcast() { + return getType() == DC_CHAT_TYPE_OUT_BROADCAST; } public boolean isHalfBlocked() { diff --git a/src/main/java/com/b44t/messenger/DcContact.java b/src/main/java/com/b44t/messenger/DcContact.java index e21b32406..bde041cb1 100644 --- a/src/main/java/com/b44t/messenger/DcContact.java +++ b/src/main/java/com/b44t/messenger/DcContact.java @@ -10,7 +10,7 @@ public class DcContact { public final static int DC_CONTACT_ID_NEW_GROUP = -2; // - " - public final static int DC_CONTACT_ID_ADD_MEMBER = -3; // - " - public final static int DC_CONTACT_ID_QR_INVITE = -4; // - " - - public final static int DC_CONTACT_ID_NEW_BROADCAST_LIST = -5; // - " - + public final static int DC_CONTACT_ID_NEW_BROADCAST = -5; // - " - public final static int DC_CONTACT_ID_ADD_ACCOUNT = -6; // - " - public DcContact(long contactCPtr) { diff --git a/src/main/java/com/b44t/messenger/rpc/Rpc.java b/src/main/java/com/b44t/messenger/rpc/Rpc.java index 77e4615e9..0fc5cc82d 100644 --- a/src/main/java/com/b44t/messenger/rpc/Rpc.java +++ b/src/main/java/com/b44t/messenger/rpc/Rpc.java @@ -160,6 +160,10 @@ public class Rpc { getResult("add_or_update_transport", accountId, param); } + public int createBroadcast(int accountId, String chatName) throws RpcException { + return gson.fromJson(getResult("create_broadcast", accountId, chatName), Integer.class); + } + private static class Request { private final String jsonrpc = "2.0"; public final String method; diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index ecea1e968..0208e06b0 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -59,6 +59,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.StringRes; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.SearchView; @@ -431,7 +432,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity getMenuInflater().inflate(R.menu.conversation, menu); - if (dcChat.isSelfTalk() || dcChat.isBroadcast()) { + if (dcChat.isSelfTalk() || dcChat.isOutBroadcast()) { menu.findItem(R.id.menu_mute_notifications).setVisible(false); } else if(dcChat.isMuted()) { menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute); @@ -441,14 +442,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity menu.findItem(R.id.menu_show_map).setVisible(false); } - if (!dcChat.canSend() || dcChat.isBroadcast() || dcChat.isMailingList()) { + if (!dcChat.canSend() || dcChat.isMailingList() ) { menu.findItem(R.id.menu_ephemeral_messages).setVisible(false); } if (isMultiUser()) { - if (dcChat.isEncrypted() + if (dcChat.isInBroadcast() && !dcChat.isContactRequest()) { + menu.findItem(R.id.menu_leave).setTitle(R.string.menu_leave_channel).setVisible(true); + } else if (dcChat.isEncrypted() && dcChat.canSend() - && !dcChat.isBroadcast() + && !dcChat.isOutBroadcast() && !dcChat.isMailingList()) { menu.findItem(R.id.menu_leave).setVisible(true); } @@ -625,9 +628,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void handleLeaveGroup() { + @StringRes int leaveLabel; + if (dcChat.isInBroadcast()) { + leaveLabel = R.string.menu_leave_channel; + } else { + leaveLabel = R.string.menu_leave_group; + } + AlertDialog dialog = new AlertDialog.Builder(this) .setMessage(getString(R.string.ask_leave_group)) - .setPositiveButton(R.string.menu_leave_group, (d, which) -> { + .setPositiveButton(leaveLabel, (d, which) -> { dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF); Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show(); }) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 5ab8be496..1644218c3 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -168,8 +168,8 @@ public class ConversationFragment extends MessageSelectorFragment private void setNoMessageText() { DcChat dcChat = getListAdapter().getChat(); if(dcChat.isMultiUser()){ - if (dcChat.isBroadcast()) { - noMessageTextView.setText(R.string.chat_new_broadcast_hint); + if (dcChat.isInBroadcast() || dcChat.isOutBroadcast()) { + noMessageTextView.setText(R.string.chat_new_channel_hint); } else if (dcChat.isUnpromoted()) { noMessageTextView.setText(R.string.chat_new_group_hint); } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationTitleView.java b/src/main/java/org/thoughtcrime/securesms/ConversationTitleView.java index e5a711318..3142705c2 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationTitleView.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationTitleView.java @@ -87,7 +87,9 @@ public class ConversationTitleView extends RelativeLayout { } else { subtitleStr = context.getString(R.string.mailing_list); } - } else if (dcChat.isBroadcast()) { + } else if (dcChat.isInBroadcast()) { + subtitleStr = context.getString(R.string.channel); + } else if (dcChat.isOutBroadcast()) { if (!profileView) { subtitleStr = context.getResources().getQuantityString(R.plurals.n_recipients, chatContacts.length, chatContacts.length); } diff --git a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java index 7d6479947..67b82230d 100644 --- a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -23,6 +23,7 @@ import androidx.loader.app.LoaderManager; import com.b44t.messenger.DcChat; import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; +import com.b44t.messenger.rpc.RpcException; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; @@ -48,7 +49,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity { public static final String EDIT_GROUP_CHAT_ID = "edit_group_chat_id"; - public static final String CREATE_BROADCAST = "group_create_broadcast"; + public static final String CREATE_BROADCAST = "create_broadcast"; public static final String CLONE_CHAT_EXTRA = "clone_chat"; private static final int PICK_CONTACT = 1; @@ -58,7 +59,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity private DcContext dcContext; private boolean verified; - private boolean broadcast; + private boolean broadcast; private EditText groupName; private ListView lv; private ImageView avatar; @@ -88,12 +89,12 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity isEdit = true; DcChat dcChat = dcContext.getChat(groupChatId); verified = dcChat.isProtected(); - broadcast = dcChat.isBroadcast(); + broadcast = dcChat.isOutBroadcast(); } int chatId = getIntent().getIntExtra(CLONE_CHAT_EXTRA, 0); if (chatId != 0) { - broadcast = dcContext.getChat(chatId).isBroadcast(); + broadcast = dcContext.getChat(chatId).isOutBroadcast(); } initializeResources(); @@ -120,7 +121,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity title = getString(R.string.global_menu_edit_desktop); } else if(broadcast) { - title = getString(R.string.new_broadcast_list); + title = getString(R.string.new_channel); } else { title = getString(R.string.menu_new_group); @@ -160,9 +161,8 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity } if (broadcast) { - avatar.setVisibility(View.GONE); - groupName.setHint(R.string.broadcast_list_name); - chatHints.setVisibility(isEdit()? View.GONE : View.VISIBLE); + groupName.setHint(R.string.channel_name); + chatHints.setVisibility(View.VISIBLE); } else { chatHints.setVisibility(View.GONE); } @@ -257,8 +257,12 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity private void createGroup(String groupName) { if (broadcast) { - groupChatId = dcContext.createBroadcastList(); - dcContext.setChatName(groupChatId, groupName); + try { + groupChatId = DcHelper.getRpc(this).createBroadcast(dcContext.getAccountId(), groupName); + } catch (RpcException e) { + e.printStackTrace(); + return; + } } else { groupChatId = dcContext.createGroupChat(verified, groupName); } diff --git a/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index b4f7dce4a..3edfa9663 100644 --- a/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -102,7 +102,7 @@ public class NewConversationActivity extends ContactSelectionActivity { public void onContactSelected(int contactId) { if(contactId == DcContact.DC_CONTACT_ID_NEW_GROUP) { startActivity(new Intent(this, GroupCreateActivity.class)); - } else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) { + } else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST) { Intent intent = new Intent(this, GroupCreateActivity.class); intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true); startActivity(intent); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java index 506e49e42..f11a528f1 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileActivity.java @@ -51,7 +51,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity private boolean chatIsMultiUser; private boolean chatIsDeviceTalk; private boolean chatIsMailingList; - private boolean chatIsBroadcast; + private boolean chatIsOutBroadcast; + private boolean chatIsInBroadcast; private int contactId; private boolean contactIsBot; private Toolbar toolbar; @@ -76,8 +77,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity String title = getString(R.string.profile); if (chatIsMailingList) { title = getString(R.string.mailing_list); - } else if (chatIsBroadcast) { - title = getString(R.string.broadcast_list); + } else if (chatIsOutBroadcast || chatIsInBroadcast) { + title = getString(R.string.channel); } else if (chatIsMultiUser) { title = getString(R.string.tab_group); } else if (contactIsBot) { @@ -114,8 +115,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity menu.findItem(R.id.show_encr_info).setVisible(false); menu.findItem(R.id.share).setVisible(false); } else if (chatIsMultiUser) { - menu.findItem(R.id.edit_name).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - if (chatIsBroadcast) { + if (chatIsOutBroadcast) { canReceive = false; } else { if (!dcChat.isEncrypted() @@ -190,7 +190,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity chatIsMultiUser = false; chatIsDeviceTalk = false; chatIsMailingList= false; - chatIsBroadcast = false; + chatIsInBroadcast = false; + chatIsOutBroadcast = false; if (contactId!=0) { DcContact dcContact = dcContext.getContact(contactId); @@ -203,7 +204,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity chatIsMultiUser = dcChat.isMultiUser(); chatIsDeviceTalk = dcChat.isDeviceTalk(); chatIsMailingList = dcChat.isMailingList(); - chatIsBroadcast = dcChat.isBroadcast(); + chatIsInBroadcast = dcChat.isInBroadcast(); + chatIsOutBroadcast = dcChat.isOutBroadcast(); if(!chatIsMultiUser) { final int[] members = dcContext.getChatContacts(chatId); contactId = members.length>=1? members[0] : 0; diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index e2ecd0595..b8d04dc4f 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java @@ -53,7 +53,7 @@ public class ProfileAdapter extends RecyclerView.Adapter private final @NonNull ArrayList itemData = new ArrayList<>(); private DcChatlist itemDataSharedChats; private String itemDataStatusText; - private boolean isBroadcast; + private boolean isOutBroadcast; private int memberCount; private final Set selectedMembers; @@ -163,7 +163,7 @@ public class ProfileAdapter extends RecyclerView.Adapter String addr = null; if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) { - if (isBroadcast) { + if (isOutBroadcast) { name = context.getString(R.string.add_recipients); } else { name = context.getString(R.string.group_add_members); @@ -275,7 +275,7 @@ public class ProfileAdapter extends RecyclerView.Adapter itemData.clear(); itemDataSharedChats = sharedChats; itemDataStatusText = ""; - isBroadcast = dcChat != null && dcChat.isBroadcast(); + isOutBroadcast = dcChat != null && dcChat.isOutBroadcast(); boolean isMailingList = dcChat != null && dcChat.isMailingList(); boolean isSelfTalk = dcChat != null && dcChat.isSelfTalk(); boolean isDeviceTalk = dcChat != null && dcChat.isDeviceTalk(); @@ -313,7 +313,7 @@ public class ProfileAdapter extends RecyclerView.Adapter if (dcChat != null) { if (dcChat.canSend() && dcChat.isEncrypted()) { itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0)); - if (!isBroadcast) { + if (!isOutBroadcast) { itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0)); } } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAvatarItem.java b/src/main/java/org/thoughtcrime/securesms/ProfileAvatarItem.java index 4c70f81fc..b33798abe 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAvatarItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAvatarItem.java @@ -59,8 +59,10 @@ public class ProfileAvatarItem extends LinearLayout implements RecipientModified if (dcChat.isMailingList()) { subtitle = dcChat.getMailinglistAddr(); - } else if (dcChat.isBroadcast()) { + } else if (dcChat.isOutBroadcast()) { subtitle = getContext().getResources().getQuantityString(R.plurals.n_recipients, memberCount, memberCount); + } else if (dcChat.isInBroadcast()) { + subtitle = getContext().getString(R.string.contact); } else if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) { subtitle = getContext().getResources().getQuantityString(R.plurals.n_members, memberCount, memberCount); } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java index e3a665e5b..fd63c3a0c 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java @@ -294,7 +294,7 @@ public class ProfileFragment extends Fragment mode.finish(); }) .setNegativeButton(android.R.string.cancel, null) - .setMessage(getString(dcChat.isBroadcast() ? R.string.ask_remove_from_broadcast : R.string.ask_remove_members, readableToDelList)) + .setMessage(getString(dcChat.isOutBroadcast() ? R.string.ask_remove_from_channel : R.string.ask_remove_members, readableToDelList)) .show(); Util.redPositiveButton(dialog); return true; diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcContactsLoader.java b/src/main/java/org/thoughtcrime/securesms/connect/DcContactsLoader.java index 685279c42..06067fd5d 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcContactsLoader.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcContactsLoader.java @@ -51,8 +51,8 @@ public class DcContactsLoader extends AsyncLoader { } if (query == null && addCreateGroupLinks) { additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_GROUP); - final boolean broadcastsEnabled = Prefs.isNewBroadcastListAvailable(getContext()); - if (broadcastsEnabled) additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST); + final boolean broadcastsEnabled = Prefs.isNewBroadcastAvailable(getContext()); + if (broadcastsEnabled) additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST); } int[] all_ids = new int[contact_ids.length + additional_items.length]; System.arraycopy(additional_items, 0, all_ids, 0, additional_items.length); diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index 9dd51a522..25072cb6f 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java @@ -190,7 +190,7 @@ public class DcHelper { dcContext.setStockTranslation(112, context.getString(R.string.error_x)); dcContext.setStockTranslation(113, context.getString(R.string.not_supported_by_provider)); dcContext.setStockTranslation(114, context.getString(R.string.messages)); - dcContext.setStockTranslation(115, context.getString(R.string.broadcast_list)); + dcContext.setStockTranslation(115, context.getString(R.string.channel)); dcContext.setStockTranslation(116, context.getString(R.string.part_of_total_used)); dcContext.setStockTranslation(117, context.getString(R.string.secure_join_started)); dcContext.setStockTranslation(118, context.getString(R.string.secure_join_replies)); diff --git a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index 56cd0e765..f735cc885 100644 --- a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -268,8 +268,8 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter { if ((Boolean)newValue) { new AlertDialog.Builder(requireActivity()) - .setTitle("Thanks for trying out \"Broadcast Lists\"!") - .setMessage("• You can now create new \"Broadcast Lists\" from the \"New Chat\" dialog\n\n" - + "• In case you are using more than one device, broadcast lists are currently not synced between them\n\n" + .setTitle("Thanks for trying out \"Channels\"!") + .setMessage("• You can now create new \"Channels\" from the \"New Chat\" dialog\n\n" + "• If you want to quit the experimental feature, you can disable it at \"Settings / Advanced\"") .setCancelable(false) .setPositiveButton(R.string.ok, null) diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index 12234829f..4df6b2deb 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -172,7 +172,7 @@ public class Prefs { return getBooleanPreference(context, "pref_developer_mode_enabled", false); } - public static boolean isNewBroadcastListAvailable(Context context) { + public static boolean isNewBroadcastAvailable(Context context) { return getBooleanPreference(context, "pref_new_broadcast_list", false); } diff --git a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java index a4c670533..89b38b25c 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java @@ -36,7 +36,7 @@ public class SelectedContactsAdapter extends BaseAdapter { @NonNull private final Context context; @Nullable private ItemClickListener itemClickListener; @NonNull private final List contacts = new LinkedList<>(); - private final boolean isBroadcast; + private final boolean isBroadcast; @NonNull private final DcContext dcContext; @NonNull private final GlideRequests glideRequests; diff --git a/src/main/res/layout/group_create_activity.xml b/src/main/res/layout/group_create_activity.xml index 71598439d..bb15011c1 100644 --- a/src/main/res/layout/group_create_activity.xml +++ b/src/main/res/layout/group_create_activity.xml @@ -44,7 +44,7 @@ android:layout_marginEnd="16dp" android:layout_marginTop="16dp" android:textSize="18sp" - android:text="@string/chat_new_broadcast_hint" /> + android:text="@string/chat_new_channel_hint" /> Chat with… Clone Chat - + Broadcast List + Broadcast Lists + New Broadcast List + + Channel + + Channels + + New Channel Add Recipients + Edit Broadcast List + Broadcast List Name + Please enter a name for the broadcast list. + + Channel Name Send Toggle Emoji Keyboard Edit Group @@ -257,6 +270,7 @@ Unarchive Chat Add Attachment Leave Group + Leave Channel Delete Chat Clear Chat @@ -377,7 +391,7 @@ You are invited to a video chat, click %1$s to join. - Are you sure you want to leave this group? + Are you sure you want to leave? Delete %d chat on all your devices? Delete %d chats on all your devices? @@ -403,8 +417,10 @@ Chat with %1$s? Remove %1$s from group? - + Remove %1$s from broadcast list? + + Remove %1$s from channel? Do you want to open this link? @@ -434,7 +450,10 @@ Send a message to %1$s. + In a broadcast list, recipients will receive messages in a read-only chat with you. + + In a channel, recipients don\'t see who else is part of the channel. Others will only see this group after you sent a first message. Slide to cancel Tap and hold to record a voice message, release to send @@ -902,7 +921,7 @@ Member %1$s removed by %2$s. - You left the group. + You left. Group left by %1$s. You deleted the group image. diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml index 69cf8a872..3b310679a 100644 --- a/src/main/res/xml/preferences_advanced.xml +++ b/src/main/res/xml/preferences_advanced.xml @@ -27,7 +27,7 @@ + android:title="@string/channels"/>