From 4d35d4edeb2a52e6eb5c16162ed2b67502288aa7 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Fri, 6 Feb 2026 23:08:53 +0100 Subject: [PATCH 1/7] temporarily select core branch with new chat description api --- jni/deltachat-core-rust | 2 +- src/main/java/chat/delta/rpc/Rpc.java | 31 +++++++++++++++++-- .../delta/rpc/types/SystemMessageType.java | 1 + 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index b72a677f4..a2ba0e437 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit b72a677f4c1b643fa56a4d15aefbf043fc5c9ee2 +Subproject commit a2ba0e437af6d7aaf6b0e57370aa6f8f27a7252a diff --git a/src/main/java/chat/delta/rpc/Rpc.java b/src/main/java/chat/delta/rpc/Rpc.java index ee42f8652..4ba6621fc 100644 --- a/src/main/java/chat/delta/rpc/Rpc.java +++ b/src/main/java/chat/delta/rpc/Rpc.java @@ -682,7 +682,8 @@ public class Rpc { * Set group name. *

* If the group is already _promoted_ (any message was sent to the group), - * all group members are informed by a special status message that is sent automatically by this function. + * or if this is a brodacast channel, + * all members are informed by a special status message that is sent automatically by this function. *

* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent. */ @@ -690,11 +691,37 @@ public class Rpc { transport.call("set_chat_name", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newName)); } + /** + * Set group or broadcast channel description. + *

+ * If the group is already _promoted_ (any message was sent to the group), + * or if this is a brodacast channel, + * all members are informed by a special status message that is sent automatically by this function. + *

+ * Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent. + *

+ * See also [`Self::get_chat_description`] / `getChatDescription()`. + */ + public void setChatDescription(Integer accountId, Integer chatId, String newDescription) throws RpcException { + transport.call("set_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newDescription)); + } + + /** + * Load the chat description from the database. + *

+ * UIs show this in the profile page of the chat, + * it is settable by [`Self::set_chat_description`] / `setChatDescription()`. + */ + public String getChatDescription(Integer accountId, Integer chatId) throws RpcException { + return transport.callForResult(new TypeReference(){}, "get_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId)); + } + /** * Set group profile image. *

* If the group is already _promoted_ (any message was sent to the group), - * all group members are informed by a special status message that is sent automatically by this function. + * or if this is a brodacast channel, + * all members are informed by a special status message that is sent automatically by this function. *

* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent. *

diff --git a/src/main/java/chat/delta/rpc/types/SystemMessageType.java b/src/main/java/chat/delta/rpc/types/SystemMessageType.java index b81ac9cbe..984f7a403 100644 --- a/src/main/java/chat/delta/rpc/types/SystemMessageType.java +++ b/src/main/java/chat/delta/rpc/types/SystemMessageType.java @@ -4,6 +4,7 @@ package chat.delta.rpc.types; public enum SystemMessageType { Unknown, GroupNameChanged, + GroupDescriptionChanged, GroupImageChanged, MemberAddedToGroup, MemberRemovedFromGroup, From aa3d1772437b03f97e4f9bb5638b12d352120b15 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 7 Feb 2026 01:23:26 +0100 Subject: [PATCH 2/7] allow to set chat description --- .../securesms/GroupCreateActivity.java | 56 ++++++++++++++----- src/main/res/layout/group_create_activity.xml | 18 ++++++ src/main/res/values/strings.xml | 1 + 3 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java index 526b2cc8f..0857d8f26 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.Bitmap; 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.io.File; 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 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity 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 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity } 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 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity 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 class GroupCreateActivity extends PassphraseRequiredActionBarActivity } private void createGroup(String groupName) { - if (broadcast) { - try { - groupChatId = DcHelper.getRpc(this).createBroadcast(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 if (unencrypted) { - try { - groupChatId = DcHelper.getRpc(this).createGroupChatUnencrypted(dcContext.getAccountId(), groupName); - } catch (RpcException e) { - e.printStackTrace(); - return; - } - } 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 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity } 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 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity 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/res/layout/group_create_activity.xml b/src/main/res/layout/group_create_activity.xml index 4797bb272..a92aa53ea 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 Outgoing Media Quality From 10694a68096685baa1fbf689ec7a4aafbddb9c20 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 7 Feb 2026 01:49:59 +0100 Subject: [PATCH 3/7] display chat description in chat profile --- .../securesms/ProfileAdapter.java | 27 ++++++++++++++++--- .../securesms/ProfileFragment.java | 4 +-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java b/src/main/java/org/thoughtcrime/securesms/ProfileAdapter.java index c3d956e46..81eef8c10 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.Collections; 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 @@ public class ProfileAdapter extends RecyclerView.Adapter } 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 @@ public class ProfileAdapter extends RecyclerView.Adapter 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 class ProfileAdapter extends RecyclerView.Adapter 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 6c9e38f6b..4a8cc6f5c 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileFragment.java @@ -140,10 +140,10 @@ public class ProfileFragment extends Fragment } @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) }, From a5892330ddc63ac4ce309ed98d28637fd6754e44 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Sat, 7 Feb 2026 11:30:40 +0100 Subject: [PATCH 4/7] Translate stock strings --- src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java | 2 ++ src/main/res/values/strings.xml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index aa8558646..e8d7ef0bf 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 class DcHelper { 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/values/strings.xml b/src/main/res/values/strings.xml index 76a2585ee..8b58ce02f 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -884,6 +884,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. From 910dbf56fdfe67ab8878021284458e9f05674e8d Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 17 Feb 2026 22:34:55 +0100 Subject: [PATCH 5/7] update core --- jni/deltachat-core-rust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index a2ba0e437..9deba0cf2 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit a2ba0e437af6d7aaf6b0e57370aa6f8f27a7252a +Subproject commit 9deba0cf2a2e608fe56ece44ec1840844ca7c840 From b365284743ecac7421b876afbc96559f9ff29d16 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 17 Feb 2026 22:37:56 +0100 Subject: [PATCH 6/7] fix Rpc class --- src/main/java/chat/delta/rpc/Rpc.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/chat/delta/rpc/Rpc.java b/src/main/java/chat/delta/rpc/Rpc.java index 53aafb826..9584d8b3f 100644 --- a/src/main/java/chat/delta/rpc/Rpc.java +++ b/src/main/java/chat/delta/rpc/Rpc.java @@ -702,13 +702,8 @@ public class Rpc { *

* See also [`Self::get_chat_description`] / `getChatDescription()`. */ -<<<<<<< adb/chat-description - public void setChatDescription(Integer accountId, Integer chatId, String newDescription) throws RpcException { - transport.call("set_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newDescription)); -======= public void setChatDescription(Integer accountId, Integer chatId, String description) throws RpcException { transport.call("set_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(description)); ->>>>>>> main } /** From 5550b8b1f543ced2891d7b496df74b49efacd37e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 18 Feb 2026 19:32:00 +0100 Subject: [PATCH 7/7] update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a199b128a..9e93d4b0a 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