diff --git a/CHANGELOG.md b/CHANGELOG.md index a199b128a5..9e93d4b0a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Delta Chat Android Changelog +## Unreleased + +* Allow to set chat description + ## v2.43.0 2026-02 diff --git a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java index 526b2cc8f3..0857d8f264 100644 --- a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -44,12 +45,14 @@ import java.util.ArrayList; import java.util.Objects; +import chat.delta.rpc.Rpc; import chat.delta.rpc.RpcException; public class GroupCreateActivity extends PassphraseRequiredActionBarActivity implements ItemClickListener { + private static final String TAG = GroupCreateActivity.class.getSimpleName(); public static final String EDIT_GROUP_CHAT_ID = "edit_group_chat_id"; public static final String CREATE_BROADCAST = "create_broadcast"; public static final String UNENCRYPTED = "unencrypted"; @@ -63,6 +66,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity private boolean unencrypted; private boolean broadcast; private EditText groupName; + private EditText chatDescription; private ListView lv; private ImageView avatar; private Bitmap avatarBmp; @@ -140,6 +144,7 @@ private void initializeResources() { lv = ViewUtil.findById(this, R.id.selected_contacts_list); avatar = ViewUtil.findById(this, R.id.avatar); groupName = ViewUtil.findById(this, R.id.group_name); + chatDescription = ViewUtil.findById(this, R.id.chat_description); TextView chatHints = ViewUtil.findById(this, R.id.chat_hints); // add padding to avoid content hidden behind system bars @@ -178,6 +183,7 @@ private void initializeResources() { } else if (unencrypted) { avatar.setVisibility(View.GONE); groupName.setHint(R.string.subject); + findViewById(R.id.chat_description_container).setVisibility(View.GONE); chatHints.setVisibility(View.GONE); } else { chatHints.setVisibility(View.GONE); @@ -186,6 +192,14 @@ private void initializeResources() { if(isEdit()) { groupName.setText(dcContext.getChat(groupChatId).getName()); lv.setVisibility(View.GONE); + + Rpc rpc = DcHelper.getRpc(this); + try { + String description = rpc.getChatDescription(rpc.getSelectedAccountId(), groupChatId); + chatDescription.setText(description); + } catch (RpcException e) { + Log.e(TAG, "RPC error", e); + } } } @@ -261,22 +275,22 @@ public void onItemDeleteClick(int contactId) { } private void createGroup(String groupName) { - if (broadcast) { - try { - groupChatId = DcHelper.getRpc(this).createBroadcast(dcContext.getAccountId(), groupName); - } catch (RpcException e) { - e.printStackTrace(); - return; - } - } else if (unencrypted) { - try { - groupChatId = DcHelper.getRpc(this).createGroupChatUnencrypted(dcContext.getAccountId(), groupName); - } catch (RpcException e) { - e.printStackTrace(); - return; + Rpc rpc = DcHelper.getRpc(this); + int accId; + try { + accId = rpc.getSelectedAccountId(); + if (broadcast) { + groupChatId = rpc.createBroadcast(accId, groupName); + } else if (unencrypted) { + groupChatId = rpc.createGroupChatUnencrypted(accId, groupName); + } else { + groupChatId = rpc.createGroupChat(accId, groupName, false); } - } else { - groupChatId = dcContext.createGroupChat(groupName); + + rpc.setChatDescription(accId, groupChatId, getChatDescription()); + } catch (RpcException e) { + Log.e(TAG, "RPC error", e); + return; } for (int contactId : getAdapter().getContacts()) { @@ -307,6 +321,14 @@ private void updateGroup(String groupName) { } dcContext.setChatName(groupChatId, groupName); + Rpc rpc = DcHelper.getRpc(this); + String description = getChatDescription(); + try { + rpc.setChatDescription(rpc.getSelectedAccountId(), groupChatId, description); + } catch (RpcException e) { + Log.e(TAG, "RPC error", e); + } + if (avatarChanged) AvatarHelper.setGroupAvatar(this, groupChatId, avatarBmp); attachmentManager.cleanup(); @@ -331,6 +353,10 @@ private SelectedContactsAdapter getAdapter() { return ret; } + private @Nullable String getChatDescription() { + return chatDescription.getText() != null ? chatDescription.getText().toString().trim() : ""; + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index c3d956e462..81eef8c109 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms; import android.content.Context; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,8 +31,13 @@ import java.util.HashSet; import java.util.Set; +import chat.delta.rpc.Rpc; +import chat.delta.rpc.RpcException; + public class ProfileAdapter extends RecyclerView.Adapter { + private static final String TAG = ProfileAdapter.class.getSimpleName(); + public static final int ITEM_AVATAR = 10; public static final int ITEM_DIVIDER = 20; public static final int ITEM_SIGNATURE = 25; @@ -195,7 +201,7 @@ else if (holder.itemView instanceof ConversationListItem) { } else if(holder.itemView instanceof ProfileStatusItem) { ProfileStatusItem item = (ProfileStatusItem) holder.itemView; - item.setOnLongClickListener(view -> {clickListener.onStatusLongClicked(); return true;}); + item.setOnLongClickListener(view -> {clickListener.onStatusLongClicked(dcContact == null); return true;}); item.set(data.label); } else if(holder.itemView instanceof ProfileAvatarItem) { @@ -230,7 +236,7 @@ else if(holder.itemView instanceof ProfileTextItem) { public interface ItemClickListener { void onSettingsClicked(int settingsId); - void onStatusLongClicked(); + void onStatusLongClicked(boolean isMultiUser); void onSharedChatClicked(int chatId); void onMemberClicked(int contactId); void onMemberLongClicked(int contactId); @@ -278,8 +284,21 @@ public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact itemData.add(new ItemData(ITEM_AVATAR, null, 0)); - if (isSelfTalk || dcContact != null && !dcContact.getStatus().isEmpty()) { - itemDataStatusText = isSelfTalk ? context.getString(R.string.saved_messages_explain) : dcContact.getStatus(); + if (isSelfTalk) { + itemDataStatusText = context.getString(R.string.saved_messages_explain); + } else if (dcContact != null) { + itemDataStatusText = dcContact.getStatus(); + } else if (dcChat != null && dcChat.isEncrypted()) { + // Load group or channel description + try { + Rpc rpc = DcHelper.getRpc(context); + itemDataStatusText = rpc.getChatDescription(rpc.getSelectedAccountId(), dcChat.getId()); + } catch (RpcException e) { + Log.e(TAG, "RPC error", e); + } + } + + if (!itemDataStatusText.isEmpty()) { itemData.add(new ItemData(ITEM_SIGNATURE, itemDataStatusText, 0)); } else { itemData.add(new ItemData(ITEM_DIVIDER, null, 0)); diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java index 6c9e38f6b1..4a8cc6f5c1 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java @@ -140,10 +140,10 @@ public void onSettingsClicked(int settingsId) { } @Override - public void onStatusLongClicked() { + public void onStatusLongClicked(boolean isMultiUser) { Context context = requireContext(); new AlertDialog.Builder(context) - .setTitle(R.string.pref_default_status_label) + .setTitle(isMultiUser? R.string.chat_description : R.string.pref_default_status_label) .setItems(new CharSequence[]{ context.getString(R.string.menu_copy_to_clipboard) }, diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index aa85586467..e8d7ef0bf5 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java @@ -225,6 +225,8 @@ public static void setStockTranslations(Context context) { dcContext.setStockTranslation(233, context.getString(R.string.outgoing_video_call)); dcContext.setStockTranslation(234, context.getString(R.string.incoming_audio_call)); dcContext.setStockTranslation(235, context.getString(R.string.incoming_video_call)); + dcContext.setStockTranslation(240, context.getString(R.string.chat_description_changed_by_you)); + dcContext.setStockTranslation(241, context.getString(R.string.chat_description_changed_by_other)); } public static File getImexDir() { diff --git a/src/main/res/layout/group_create_activity.xml b/src/main/res/layout/group_create_activity.xml index 4797bb2727..a92aa53ea7 100644 --- a/src/main/res/layout/group_create_activity.xml +++ b/src/main/res/layout/group_create_activity.xml @@ -39,6 +39,24 @@ + + + + + Your Name Bio + Description Enter Key Sends Pressing the Enter key will send text messages @@ -889,6 +890,9 @@ You changed the group image. Group image changed by %1$s. + You changed the chat description. + + Chat description changed by %1$s. Member %1$s added.