From 53f1c73e52dff5b88500d8368b6f9116cbaf069e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 26 Feb 2025 20:17:10 +0100 Subject: [PATCH 01/20] cleanup ContactSelectionListAdapter --- .../contacts/ContactSelectionListAdapter.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index b6d551130..2dd098c71 100644 --- a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -47,7 +47,7 @@ import java.util.Set; * * @author Jake McGinty */ -public class ContactSelectionListAdapter extends RecyclerView.Adapter +public class ContactSelectionListAdapter extends RecyclerView.Adapter { private static final int VIEW_TYPE_CONTACT = 0; private static final int MAX_CACHE_SIZE = 100; @@ -157,7 +157,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter if (!longPressSelect) { return; } - int adapterPosition = getAdapterPosition(); + int adapterPosition = getBindingAdapterPosition(); if (adapterPosition < 0) return; int contactId = getContactId(adapterPosition); boolean enabled = actionModeSelection.indexOfKey(adapterPosition) > -1; @@ -244,8 +244,9 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter this.longPressSelect = longPressSelect; } + @NonNull @Override - public ContactSelectionListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public ContactSelectionListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_CONTACT) { return new ContactViewHolder(li.inflate(R.layout.contact_selection_list_item, parent, false), clickListener); } else { @@ -254,11 +255,10 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter } @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { + public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { int id = dcContactList[i]; DcContact dcContact = null; - String label = null; String name; String addr = null; boolean itemMultiSelect = multiSelect; @@ -278,22 +278,21 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter addr = dcContact.getAddr(); } - ViewHolder holder = (ViewHolder) viewHolder; - holder.unbind(glideRequests); + viewHolder.unbind(glideRequests); boolean enabled = true; if (dcContact == null) { - holder.setSelected(false); - holder.setEnabled(!isActionModeEnabled()); + viewHolder.setSelected(false); + viewHolder.setEnabled(!isActionModeEnabled()); if (isActionModeEnabled()) { enabled = false; } } else { boolean selected = actionModeSelection.indexOfValue(id) > -1; - holder.setSelected(selected); + viewHolder.setSelected(selected); enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect); } - holder.bind(glideRequests, id, dcContact, name, addr, label, itemMultiSelect, enabled); - holder.setChecked(selectedContacts.contains(addr)); + viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled); + viewHolder.setChecked(selectedContacts.contains(addr)); } @Override From 2e2aeed12703cff13e3bd3c198237f2b69c22f17 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 27 Feb 2025 17:24:19 +0100 Subject: [PATCH 02/20] update deltachat-core-rust to 'chore(release): prepare for 1.156.0' of 'v1.156.0' --- 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 302aa5a5f..08be98f69 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 302aa5a5f750d2d24211bff8e61eb2610470fca3 +Subproject commit 08be98f69373f121f0b2c017e81366180f73eaea From c94f9371fed2983143a097268cd1c4925f66c856 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 19 Feb 2025 21:39:04 +0100 Subject: [PATCH 03/20] add C bindings --- jni/dc_wrapper.c | 14 ++++++++++++++ src/main/java/com/b44t/messenger/DcMsg.java | 2 ++ 2 files changed, 16 insertions(+) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index bc2c5c25d..5a976863c 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -1623,6 +1623,20 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setText(JNIEnv *env, jobject obj, j } +JNIEXPORT void Java_com_b44t_messenger_DcMsg_sendEditRequest(JNIEnv *env, jobject obj, jstring text) +{ + CHAR_REF(text); + dc_send_edit_request(get_dc_msg(env, obj), textPtr); + CHAR_UNREF(text); +} + + +JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isEdited(JNIEnv *env, jobject obj) +{ + return dc_msg_is_edited(get_dc_msg(env, obj)); +} + + JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFileAndDeduplicate(JNIEnv *env, jobject obj, jstring file, jstring name, jstring filemime) { CHAR_REF(file); diff --git a/src/main/java/com/b44t/messenger/DcMsg.java b/src/main/java/com/b44t/messenger/DcMsg.java index ed628eea7..6f594ab62 100644 --- a/src/main/java/com/b44t/messenger/DcMsg.java +++ b/src/main/java/com/b44t/messenger/DcMsg.java @@ -164,6 +164,8 @@ public class DcMsg { public native String getQuotedText (); public native String getError (); public native String getOverrideSenderName(); + public native void sendEditRequest (String text); + public native boolean isEdited (); public String getSenderName(DcContact dcContact) { String overrideName = getOverrideSenderName(); From d1737cb69fa253e530b526138d1e1cafbed51df7 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 01:07:23 +0100 Subject: [PATCH 04/20] allow to edit outgoing text messages --- .../securesms/ConversationActivity.java | 55 +++++++++++++++---- .../securesms/ConversationFragment.java | 22 ++++++++ .../securesms/components/InputPanel.java | 3 + src/main/res/menu/conversation.xml | 3 - src/main/res/menu/conversation_context.xml | 4 ++ 5 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 09fd2f180..41c8e86af 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -189,6 +189,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private boolean isDefaultSms = true; private boolean isSecurityInitialized = false; private boolean successfulForwardingAttempt = false; + private boolean isEditing = false; @Override protected void onCreate(Bundle state, boolean ready) { @@ -489,13 +490,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity Log.e(TAG, "cannot set up in-chat-search: ", e); } - if (!dcChat.canSend()) { - MenuItem attachItem = menu.findItem(R.id.menu_add_attachment); - if (attachItem!=null) { - attachItem.setVisible(false); - } - } - super.onPrepareOptionsMenu(menu); return true; } @@ -504,10 +498,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); int itemId = item.getItemId(); - if (itemId == R.id.menu_add_attachment) { - handleAddAttachment(); - return true; - } else if (itemId == R.id.menu_leave) { + if (itemId == R.id.menu_leave) { handleLeaveGroup(); return true; } else if (itemId == R.id.menu_archive_chat) { @@ -731,6 +722,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity * @return */ private ListenableFuture initializeDraft() { + isEditing = false; final SettableFuture future = new SettableFuture<>(); DcMsg draft = dcContext.getDraft(chatId); final String sharedText = RelayUtil.getSharedText(this); @@ -1016,6 +1008,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity DcMsg msg = null; Optional quote = inputPanel.getQuote(); Integer recompress = 0; + boolean editing = isEditing; // for a quick ui feedback, we clear the related controls immediately on sending messages. // for drafts, however, we do not change the controls, the activity may be resumed. @@ -1024,6 +1017,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity inputPanel.clearQuote(); } + if (editing) { + int msgId = quote.get().getQuotedMsg().getId(); + Util.runOnAnyBackgroundThread(() -> { + if (action == ACTION_SEND_OUT) { + dcContext.sendEditRequest(msgId, body); + } else { + dcContext.setDraft(chatId, null); + } + }); + return future; + } + if(slideDeck!=null) { if (action==ACTION_SEND_OUT) { @@ -1162,7 +1167,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity return; } - if (composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) { + if (!isEditing && composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) { buttonToggle.display(attachButton); quickAttachmentToggle.show(); } else { @@ -1280,9 +1285,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } } + @Override + public void onQuoteDismissed() { + isEditing = false; + composeText.setText(""); + } + // media selected by the system keyboard @Override public void onMediaSelected(@NonNull Uri uri, String contentType) { + if (isEditing) return; if (MediaUtil.isImageType(contentType)) { sendSticker(uri, contentType); } else if (MediaUtil.isVideoType(contentType)) { @@ -1433,6 +1445,25 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity inputPanel.clickOnComposeInput(); } + @Override + public void handleEditMessage(DcMsg msg) { + isEditing = true; + Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId())); + + SlideDeck slideDeck = new SlideDeck(); + String text = msg.getSummarytext(500); + + inputPanel.setQuote(GlideApp.with(this), + msg, + msg.getTimestamp(), + author, + text, + slideDeck); + + setDraftText(msg.getText()); + inputPanel.clickOnComposeInput(); + } + @Override public void onAttachmentChanged() { handleSecurityChange(isSecureText, isDefaultSms); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 01409ba96..f00c7aeb6 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -324,6 +324,7 @@ public class ConversationFragment extends MessageSelectorFragment menu.findItem(R.id.menu_context_details).setVisible(false); menu.findItem(R.id.menu_context_share).setVisible(false); menu.findItem(R.id.menu_context_reply).setVisible(false); + menu.findItem(R.id.menu_context_edit).setVisible(false); menu.findItem(R.id.menu_context_reply_privately).setVisible(false); menu.findItem(R.id.menu_add_to_home_screen).setVisible(false); } else { @@ -333,6 +334,8 @@ public class ConversationFragment extends MessageSelectorFragment menu.findItem(R.id.menu_context_share).setVisible(messageRecord.hasFile()); boolean canReply = canReplyToMsg(messageRecord); menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply); + boolean canEdit = canEditMsg(messageRecord); + menu.findItem(R.id.menu_context_edit).setVisible(chat.canSend() && canEdit); boolean showReplyPrivately = chat.isMultiUser() && !messageRecord.isOutgoing() && canReply; menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately); menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC); @@ -361,6 +364,10 @@ public class ConversationFragment extends MessageSelectorFragment return !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION; } + static boolean canEditMsg(DcMsg dcMsg) { + return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() == DcMsg.DC_MSG_TEXT; + } + public void handleClearChat() { handleDeleteMessages((int) chatId, getListAdapter().getMessageIds()); } @@ -461,6 +468,16 @@ public class ConversationFragment extends MessageSelectorFragment listener.handleReplyMessage(message); } + @SuppressLint("RestrictedApi") + private void handleEditMessage(final DcMsg message) { + if (getActivity() != null) { + //noinspection ConstantConditions + ((AppCompatActivity) getActivity()).getSupportActionBar().collapseActionView(); + } + + listener.handleEditMessage(message); + } + private void handleReplyMessagePrivately(final DcMsg msg) { if (getActivity() != null) { @@ -591,6 +608,7 @@ public class ConversationFragment extends MessageSelectorFragment public interface ConversationFragmentListener { void handleReplyMessage(DcMsg messageRecord); + void handleEditMessage(DcMsg messageRecord); } private class ConversationScrollListener extends OnScrollListener { @@ -958,6 +976,10 @@ public class ConversationFragment extends MessageSelectorFragment handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems())); actionMode.finish(); return true; + } else if (itemId == R.id.menu_context_edit) { + handleEditMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems())); + actionMode.finish(); + return true; } else if (itemId == R.id.menu_context_reply_privately) { handleReplyMessagePrivately(getSelectedMessageRecord(getListAdapter().getSelectedItems())); return true; diff --git a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java index c8c0c22b9..c307c55dd 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -141,6 +141,7 @@ public class InputPanel extends ConstraintLayout public void clearQuoteWithoutAnimation() { quoteView.dismiss(); + if (listener != null) listener.onQuoteDismissed(); } public void clearQuote() { @@ -152,6 +153,7 @@ public class InputPanel extends ConstraintLayout @Override public void onAnimationEnd(@NonNull Animator animation) { quoteView.dismiss(); + if (listener != null) listener.onQuoteDismissed(); } }); @@ -329,6 +331,7 @@ public class InputPanel extends ConstraintLayout void onRecorderCanceled(); void onRecorderPermissionRequired(); void onEmojiToggle(); + void onQuoteDismissed(); } private static class SlideToCancel { diff --git a/src/main/res/menu/conversation.xml b/src/main/res/menu/conversation.xml index 46be4a3a6..3a036cf23 100644 --- a/src/main/res/menu/conversation.xml +++ b/src/main/res/menu/conversation.xml @@ -41,9 +41,6 @@ - - diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index 7be2b04a7..4aa6d5ece 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -44,6 +44,10 @@ android:id="@+id/menu_context_reply_privately" app:showAsAction="never" /> + + From fb759e12f09a9330049fe434eab29f41a6d37c21 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 01:09:28 +0100 Subject: [PATCH 05/20] fix bindings --- jni/dc_wrapper.c | 16 ++++++++-------- src/main/java/com/b44t/messenger/DcContext.java | 1 + src/main/java/com/b44t/messenger/DcMsg.java | 1 - 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 5a976863c..6d175246f 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -653,6 +653,14 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgInfo(JNIEnv *env, jobj } +JNIEXPORT void Java_com_b44t_messenger_DcContext_sendEditRequest(JNIEnv *env, jobject obj, jint msg_id, jstring text) +{ + CHAR_REF(text); + dc_send_edit_request(get_dc_context(env, obj), msg_id, textPtr); + CHAR_UNREF(text); +} + + JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgHtml(JNIEnv *env, jobject obj, jint msg_id) { char* temp = dc_get_msg_html(get_dc_context(env, obj), msg_id); @@ -1623,14 +1631,6 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setText(JNIEnv *env, jobject obj, j } -JNIEXPORT void Java_com_b44t_messenger_DcMsg_sendEditRequest(JNIEnv *env, jobject obj, jstring text) -{ - CHAR_REF(text); - dc_send_edit_request(get_dc_msg(env, obj), textPtr); - CHAR_UNREF(text); -} - - JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isEdited(JNIEnv *env, jobject obj) { return dc_msg_is_edited(get_dc_msg(env, obj)); diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index d8d9885d8..22207ea3b 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -186,6 +186,7 @@ public class DcContext { public native void blockChat (int chat_id); public native void acceptChat (int chat_id); public DcMsg getMsg (int msg_id) { return new DcMsg(getMsgCPtr(msg_id)); } + public native void sendEditRequest (int msg_id, String text); public native String getMsgInfo (int id); public native String getMsgHtml (int msg_id); public native void downloadFullMsg (int msg_id); diff --git a/src/main/java/com/b44t/messenger/DcMsg.java b/src/main/java/com/b44t/messenger/DcMsg.java index 6f594ab62..d1828b495 100644 --- a/src/main/java/com/b44t/messenger/DcMsg.java +++ b/src/main/java/com/b44t/messenger/DcMsg.java @@ -164,7 +164,6 @@ public class DcMsg { public native String getQuotedText (); public native String getError (); public native String getOverrideSenderName(); - public native void sendEditRequest (String text); public native boolean isEdited (); public String getSenderName(DcContact dcContact) { From 441f943190044b22f6444c2dce5269e7508189d1 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 01:59:55 +0100 Subject: [PATCH 06/20] add "edited" label --- .../components/ConversationItemFooter.java | 4 ++++ src/main/res/layout/conversation_item_footer.xml | 13 +++++++++++++ src/main/res/values/strings.xml | 1 + 3 files changed, 18 insertions(+) diff --git a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index 30aa9dcd4..9b354fb53 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.util.DateUtils; public class ConversationItemFooter extends LinearLayout { private TextView dateView; + private TextView editedView; private ImageView bookmarkIndicatorView; private ImageView secureIndicatorView; private ImageView locationIndicatorView; @@ -45,6 +46,7 @@ public class ConversationItemFooter extends LinearLayout { inflate(getContext(), R.layout.conversation_item_footer, this); dateView = findViewById(R.id.footer_date); + editedView = findViewById(R.id.footer_edited); bookmarkIndicatorView = findViewById(R.id.footer_bookmark_indicator); secureIndicatorView = findViewById(R.id.footer_secure_indicator); locationIndicatorView = findViewById(R.id.footer_location_indicator); @@ -62,6 +64,7 @@ public class ConversationItemFooter extends LinearLayout { presentDate(messageRecord); boolean bookmark = messageRecord.getOriginalMsgId() != 0 || messageRecord.getSavedMsgId() != 0; bookmarkIndicatorView.setVisibility(bookmark ? View.VISIBLE : View.GONE); + editedView.setVisibility(messageRecord.isEdited() ? View.VISIBLE : View.GONE); secureIndicatorView.setVisibility(messageRecord.isSecure() ? View.VISIBLE : View.GONE); locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE); presentDeliveryStatus(messageRecord); @@ -69,6 +72,7 @@ public class ConversationItemFooter extends LinearLayout { private void setTextColor(int color) { dateView.setTextColor(color); + editedView.setTextColor(color); bookmarkIndicatorView.setColorFilter(color); secureIndicatorView.setColorFilter(color); locationIndicatorView.setColorFilter(color); diff --git a/src/main/res/layout/conversation_item_footer.xml b/src/main/res/layout/conversation_item_footer.xml index 30f2cca35..8584ac2fe 100644 --- a/src/main/res/layout/conversation_item_footer.xml +++ b/src/main/res/layout/conversation_item_footer.xml @@ -28,6 +28,19 @@ android:importantForAccessibility="no" tools:visibility="visible"/> + + File Quit Edit + edited Undo Redo Cut From fce62453d1fd5ae9749f0cf82642f20b16a4db9b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 02:17:52 +0100 Subject: [PATCH 07/20] show "Edit Message" instead of "Me" in edition mode --- .../securesms/ConversationActivity.java | 6 ++++-- .../thoughtcrime/securesms/ConversationItem.java | 3 ++- .../securesms/components/InputPanel.java | 5 +++-- .../securesms/components/QuoteView.java | 16 ++++++++++++++-- src/main/res/values/strings.xml | 1 + 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 41c8e86af..0cd3adaf1 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1440,7 +1440,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity msg.getTimestamp(), author, text, - slideDeck); + slideDeck, + false); inputPanel.clickOnComposeInput(); } @@ -1458,7 +1459,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity msg.getTimestamp(), author, text, - slideDeck); + slideDeck, + true); setDraftText(msg.getText()); inputPanel.clickOnComposeInput(); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index 6d9dcee25..e8835f3e2 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -717,7 +717,8 @@ public class ConversationItem extends BaseConversationItem author, quoteTxt, slideDeck, - current.getType() == DcMsg.DC_MSG_STICKER); + current.getType() == DcMsg.DC_MSG_STICKER, + false); quoteView.setVisibility(View.VISIBLE); quoteView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; diff --git a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java index c307c55dd..afa0c191f 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -120,9 +120,10 @@ public class InputPanel extends ConstraintLayout long id, @NonNull Recipient author, @NonNull CharSequence body, - @NonNull SlideDeck attachments) + @NonNull SlideDeck attachments, + @NonNull boolean isEdit) { - this.quoteView.setQuote(glideRequests, msg, author, body, attachments, false); + this.quoteView.setQuote(glideRequests, msg, author, body, attachments, false, isEdit); int originalHeight = this.quoteView.getVisibility() == VISIBLE ? this.quoteView.getMeasuredHeight() : 0; diff --git a/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java index 7a30e32b9..4c4ac3558 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java +++ b/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java @@ -60,6 +60,7 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { private SlideDeck attachments; private int messageType; private boolean hasSticker; + private boolean isEdit; public QuoteView(Context context) { super(context); @@ -114,13 +115,15 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { @Nullable Recipient author, @Nullable CharSequence body, @NonNull SlideDeck attachments, - boolean hasSticker) + boolean hasSticker, + boolean isEdit) { quotedMsg = msg; this.author = author != null ? author.getDcContact() : null; this.body = body; this.attachments = attachments; this.hasSticker = hasSticker; + this.isEdit = isEdit; if (hasSticker) { this.setBackgroundResource(R.drawable.conversation_item_update_background); @@ -144,7 +147,12 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { } private void setQuoteAuthor(@Nullable Recipient author) { - if (author == null) { + if (isEdit) { + authorView.setVisibility(VISIBLE); + authorView.setTextColor(getEditColor()); + quoteBarView.setBackgroundColor(getEditColor()); + authorView.setText(getContext().getString(R.string.edit_message)); + } else if (author == null) { authorView.setVisibility(GONE); quoteBarView.setBackgroundColor(getForwardedColor()); } else if (quotedMsg.isForwarded()) { @@ -272,4 +280,8 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver { private int getForwardedColor() { return getResources().getColor(hasSticker? R.color.core_dark_05 : R.color.unknown_sender); } + + private int getEditColor() { + return getResources().getColor(R.color.delta_accent); + } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a4effd7eb..9f7732945 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1071,6 +1071,7 @@ File Quit Edit + Edit Message edited Undo Redo From f1fe3e080741fe2c7f5ac20a50bfc49add2e830a Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 02:27:23 +0100 Subject: [PATCH 08/20] allow to edit any normal message with text, not only "text viewtype" --- .../java/org/thoughtcrime/securesms/ConversationFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index f00c7aeb6..8d06073a1 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -365,7 +365,7 @@ public class ConversationFragment extends MessageSelectorFragment } static boolean canEditMsg(DcMsg dcMsg) { - return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() == DcMsg.DC_MSG_TEXT; + return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.getText().isEmpty(); } public void handleClearChat() { From 19cd640dc827b74d45a0c75a13224be3ae9e0ac5 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 18:32:08 +0100 Subject: [PATCH 09/20] tweak code style --- .../java/org/thoughtcrime/securesms/ConversationActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 0cd3adaf1..d522fa883 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -189,7 +189,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private boolean isDefaultSms = true; private boolean isSecurityInitialized = false; private boolean successfulForwardingAttempt = false; - private boolean isEditing = false; + private boolean isEditing = false; @Override protected void onCreate(Bundle state, boolean ready) { From ed23c9352615948252dd7f01910bfcf700a9f26d Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 18:42:18 +0100 Subject: [PATCH 10/20] fix: don't discard draft if not in editing mode --- .../java/org/thoughtcrime/securesms/ConversationActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index d522fa883..63dbd6ab5 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1287,8 +1287,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void onQuoteDismissed() { + if (isEditing) composeText.setText(""); isEditing = false; - composeText.setText(""); } // media selected by the system keyboard From 6621046d6daaf52c7b64faeed617dfc4302ce5fa Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 18:57:22 +0100 Subject: [PATCH 11/20] cancel editing when user swipe-to-reply a message --- .../java/org/thoughtcrime/securesms/ConversationActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 63dbd6ab5..4cdc6e589 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -1425,6 +1425,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity @Override public void handleReplyMessage(DcMsg msg) { + if (isEditing) composeText.setText(""); + isEditing = false; // If you modify these lines you may also want to modify ConversationItem.setQuote(): Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId())); From e3c108c773b6e51c12f7e2beea04192330d45826 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 18:58:02 +0100 Subject: [PATCH 12/20] use new strings --- src/main/res/layout/conversation_item_footer.xml | 2 +- src/main/res/menu/conversation_context.xml | 2 +- src/main/res/values/strings.xml | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/res/layout/conversation_item_footer.xml b/src/main/res/layout/conversation_item_footer.xml index 8584ac2fe..43ed98cb0 100644 --- a/src/main/res/layout/conversation_item_footer.xml +++ b/src/main/res/layout/conversation_item_footer.xml @@ -36,7 +36,7 @@ android:linksClickable="false" style="@style/Signal.Text.Caption.MessageSent" android:textColor="?conversation_item_outgoing_text_secondary_color" - android:text="@string/message_edited" + android:text="@string/edited" android:paddingEnd="5dp" android:visibility="gone" tools:visibility="visible"/> diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index 4aa6d5ece..9055336f3 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -44,7 +44,7 @@ android:id="@+id/menu_context_reply_privately" app:showAsAction="never" /> - diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 9f7732945..3d4ab0197 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1071,8 +1071,6 @@ File Quit Edit - Edit Message - edited Undo Redo Cut From 7b11c5dd798725774fdde64ed10728de752c703f Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 20:19:56 +0100 Subject: [PATCH 13/20] re-organize menu and add pencil icon --- .../ConversationAdaptiveActionsToolbar.java | 25 +++---- src/main/res/menu/conversation_context.xml | 73 ++++++++++--------- 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java b/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java index f61d39bf3..350932b67 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java +++ b/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java @@ -23,11 +23,10 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar { private static final int ACTION_VIEW_WIDTH_DP = 48; private static final int OVERFLOW_VIEW_WIDTH_DP = 36; - private static final int ID_NEVER_SHOW_AS_ACTION_1 = R.id.menu_context_reply_privately; - private static final int ID_NEVER_SHOW_AS_ACTION_2 = R.id.menu_add_to_home_screen; - private static final int ID_NEVER_SHOW_AS_ACTION_3 = R.id.menu_context_save_attachment; - private static final int ID_NEVER_SHOW_AS_ACTION_4 = R.id.menu_resend; - private static final int ID_ALWAYS_SHOW_AS_ACTION = R.id.menu_context_forward; + private static final int ID_ACTION_1 = R.id.menu_context_edit; + private static final int ID_ACTION_2 = R.id.menu_context_copy; + private static final int ID_ACTION_3 = R.id.menu_context_share; + private static final int ID_ACTION_4 = R.id.menu_context_forward; private final int maxShown; @@ -74,21 +73,15 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar { nItemsToShow = Math.min(maxToShow, widthAllowed / ViewUtil.dpToPx(ACTION_VIEW_WIDTH_DP)); - menu.findItem(ID_ALWAYS_SHOW_AS_ACTION).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - nItemsToShow--; - for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); - boolean neverShowAsAction = item.getItemId() == ID_NEVER_SHOW_AS_ACTION_1 - || item.getItemId() == ID_NEVER_SHOW_AS_ACTION_2 - || item.getItemId() == ID_NEVER_SHOW_AS_ACTION_3 - || item.getItemId() == ID_NEVER_SHOW_AS_ACTION_4; - boolean alwaysShowAsAction = item.getItemId() == ID_ALWAYS_SHOW_AS_ACTION; + boolean showAsAction = item.getItemId() == ID_ACTION_1 + || item.getItemId() == ID_ACTION_2 + || item.getItemId() == ID_ACTION_3 + || item.getItemId() == ID_ACTION_4; - if (alwaysShowAsAction) continue; - - if (item.isVisible() && nItemsToShow > 0 && !neverShowAsAction) { + if (showAsAction && item.isVisible() && nItemsToShow > 0) { item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); nItemsToShow--; } else { diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index 9055336f3..b3cd0003b 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -1,58 +1,59 @@ - + - + - - - + app:showAsAction="ifRoom" /> - + + + + + + - - - - - - + + - - - - + From cb3fd74af91893fa9b3ab33f087a62de5e604e64 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 21:45:25 +0100 Subject: [PATCH 14/20] move delete-messages to the end and make it red --- .../thoughtcrime/securesms/ConversationFragment.java | 1 + src/main/res/menu/conversation_context.xml | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 8d06073a1..e0899e137 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -922,6 +922,7 @@ public class ConversationFragment extends MessageSelectorFragment statusBarColor = window.getStatusBarColor(); window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar)); + Util.redMenuItem(menu, R.id.menu_context_delete_message); setCorrectMenuVisibility(menu); ConversationAdaptiveActionsToolbar.adjustMenuActions(menu, 10, requireActivity().getWindow().getDecorView().getMeasuredWidth()); return true; diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index b3cd0003b..d081c676a 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -20,11 +20,6 @@ android:icon="?menu_forward_icon" app:showAsAction="ifRoom" /> - - + + From 9c367496192ab795f843e255dc7265163afa562e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 20 Feb 2025 21:48:08 +0100 Subject: [PATCH 15/20] remove unnecessary icon for reply menu item --- src/main/res/menu/conversation_context.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index d081c676a..ff7ca534a 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -37,7 +37,6 @@ Date: Thu, 20 Feb 2025 21:56:27 +0100 Subject: [PATCH 16/20] tweak menu --- src/main/res/menu/conversation_context.xml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index ff7ca534a..ff88646c6 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -20,11 +20,6 @@ android:icon="?menu_forward_icon" app:showAsAction="ifRoom" /> - - - + + @@ -47,7 +46,7 @@ android:id="@+id/menu_resend" app:showAsAction="never" /> - From c5d7ec09463b5a663cbdd49b1a1f42629ae2d587 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Mon, 24 Feb 2025 17:11:04 +0100 Subject: [PATCH 17/20] don't allow to edit html messages --- .../java/org/thoughtcrime/securesms/ConversationFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index e0899e137..0cc5182fa 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -365,7 +365,7 @@ public class ConversationFragment extends MessageSelectorFragment } static boolean canEditMsg(DcMsg dcMsg) { - return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.getText().isEmpty(); + return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.hasHtml() && !dcMsg.getText().isEmpty(); } public void handleClearChat() { From 120007d87aace5af6a799ac5908de397c7bffaad Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 27 Feb 2025 18:08:01 +0100 Subject: [PATCH 18/20] add a warning when scanning a backup QR code from a too new delta chat version --- src/main/java/com/b44t/messenger/DcContext.java | 2 +- .../java/org/thoughtcrime/securesms/WelcomeActivity.java | 9 ++++++++- .../org/thoughtcrime/securesms/qr/QrCodeHandler.java | 7 ++++++- src/main/res/values/strings.xml | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index 22207ea3b..2fb0ecaae 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -51,8 +51,8 @@ public class DcContext { public final static int DC_QR_FPR_MISMATCH = 220; public final static int DC_QR_FPR_WITHOUT_ADDR = 230; public final static int DC_QR_ACCOUNT = 250; - public final static int DC_QR_BACKUP = 251; public final static int DC_QR_BACKUP2 = 252; + public final static int DC_QR_BACKUP_TOO_NEW = 255; public final static int DC_QR_WEBRTC = 260; public final static int DC_QR_PROXY = 271; public final static int DC_QR_ADDR = 320; diff --git a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java index 879964472..073ebe58b 100644 --- a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java @@ -349,7 +349,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen } DcLot qrParsed = dcContext.checkQr(qrRaw); switch (qrParsed.getState()) { - case DcContext.DC_QR_BACKUP: case DcContext.DC_QR_BACKUP2: final String finalQrRaw = qrRaw; new AlertDialog.Builder(this) @@ -361,6 +360,14 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen .show(); break; + case DcContext.DC_QR_BACKUP_TOO_NEW: + new AlertDialog.Builder(this) + .setTitle(R.string.multidevice_receiver_title) + .setMessage(R.string.multidevice_receiver_needs_update) + .setPositiveButton(R.string.ok, null) + .show(); + break; + default: new AlertDialog.Builder(this) .setMessage(R.string.qraccount_qr_code_cannot_be_used) diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index af8189f08..25e430456 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -74,7 +74,6 @@ public class QrCodeHandler { builder.setCancelable(false); break; - case DcContext.DC_QR_BACKUP: case DcContext.DC_QR_BACKUP2: builder.setTitle(R.string.multidevice_receiver_title); builder.setMessage(activity.getString(R.string.multidevice_receiver_scanning_ask) + "\n\n" + activity.getString(R.string.multidevice_same_network_hint)); @@ -89,6 +88,12 @@ public class QrCodeHandler { BackupTransferActivity.appendSSID(activity, alertDialog.findViewById(android.R.id.message)); return; + case DcContext.DC_QR_BACKUP_TOO_NEW: + builder.setTitle(R.string.multidevice_receiver_title); + builder.setMessage(activity.getString(R.string.multidevice_receiver_needs_update)); + builder.setNegativeButton(R.string.ok, null); + break; + case DcContext.DC_QR_PROXY: builder.setTitle(R.string.proxy_use_proxy); builder.setMessage(activity.getString(R.string.proxy_use_proxy_confirm, qrParsed.getText1())); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 3d4ab0197..655dd3b41 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -550,6 +550,7 @@ Add as Second Device On the first device, go to “Settings / Add Second Device“ and scan the code shown there Copy the profile from the other device to this device? + The profile you want to import is from a newer Delta Chat version.\n\nTo continue setting up second device, please update this device to the latest version of Delta Chat. Abort setting up second device? This will invalidate the QR code copied to clipboard. (experimental, version 1.36 required) From 6a4efb33582358e651d057a434c92386dd37fcea Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 27 Feb 2025 18:36:54 +0100 Subject: [PATCH 19/20] update translations --- src/main/res/values-de/strings.xml | 1 + src/main/res/values-fr/strings.xml | 36 ++++++++++++++++++++++++++ src/main/res/values-it/strings.xml | 9 ++++++- src/main/res/values-nl/strings.xml | 2 +- src/main/res/values-pl/strings.xml | 8 ++++++ src/main/res/values-ru/strings.xml | 10 ++++++- src/main/res/values-sq/strings.xml | 6 +++++ src/main/res/values-tr/strings.xml | 2 +- src/main/res/values-zh-rCN/strings.xml | 5 ++++ 9 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 7747b4740..de953b35a 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -550,6 +550,7 @@ Als Zweitgerät hinzufügen Auf dem ersten Gerät, gehe zu \"Einstellungen / Zweitgerät hinzufügen\" und scanne den dort angezeigten Code Das Profil vom anderen Gerät auf dieses Gerät kopieren? + Das Profil, das Sie importieren möchten, stammt aus einer neueren Delta-Chat-Version.\n\nUm Fortzufahren, aktualisieren Sie dieses Gerät bitte auf die neueste Version von Delta Chat. Einrichtung des Zweitgeräts beenden? Dadurch wird der auf die Zwischenablage kopierte QR-Code ungültig. (experimentell, Version 1.36 erforderlich) diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index af8d261ec..b9dce1235 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -7,6 +7,8 @@ Effacer la recherche Lien + + Scanner Oui Non Sélectionner @@ -26,6 +28,8 @@ Rejoindre Réintégrer Supprimer + Supprimer pour moi + Supprimer pour tout le monde Info Mise à jour Émoji @@ -35,9 +39,12 @@ Fermer la fenêtre Faire suivre Créer + Réinitialiser Plus tard Renvoyer + Modifié + Modifier le message Archiver @@ -193,6 +200,7 @@ Jeux Outils Taille + Publié Ajouter à la discussion Explorer @@ -291,6 +299,8 @@ Sélectionner plus Modifier le nom + Choisir un surnom qui s\'affichera à la place de « %1$s ». Laisser cet espace vide pour utiliser le nom choisi par le contact. + Surnom de \"%1$s\" Paramètres Avancé @@ -308,6 +318,7 @@ Messages de l\'appareil Messages générés localement Les messages dans cette discussion sont générés localement par votre application Delta Chat. Cela vous permet de recevoir des informations concernant les mises à jour et problèmes rencontrés à l\'utilisation. + Gardez contact !\n\n🙌 Cliquez sur « code QR » sur la page d\'accueil des deux appareils. Sélectionnez « Scanner le code QR » sur un des appareils et positionnez les deux appareils l\'un vers l\'autre\n\n🌍 Si vous n\'êtes pas dans la même pièce, vous pouvez scanner le code QR pendant un appel vidéo ou partager un lien d\'invitation à partir de « Scanner le code QR »\n\n Profitez ensuite de votre expérience de messagerie sur le plus grand réseau décentralisé du monde : les emails. Contrairement aux autres applications populaires, tout cela se fait sans contrôle centralisé, suivi ou revente de vos données, celles de vos amis, collègues ou famille à de grandes entreprises. Mettre à jour le contact Épingler la discussion @@ -368,6 +379,11 @@ Voulez-vous vraiment supprimer « %1$s » ? Voulez-vous vraiment supprimer ce message ? + + Effacer %d message ici et sur le serveur ? + Effacer %d messages ici et sur le serveur ? + Effacer %d messages ici et sur le serveur  ? + Supprimer %d message ? @@ -460,6 +476,9 @@ Envoyer \"%1$s\" à Envoyer un message à + Applications temps réel + Activez les connexions temps réel pour les applications partagées dans les discussions. Les interlocuteurs pourront voir votre adresse IP lorsque vous lancerez l\'app. + Afficher les positions pour une période Afficher les traces @@ -636,6 +655,7 @@ Proxy invalide ou non supporté Sauver les proxy Effacer le proxy + Voulez-vous vraiment supprimer « %1$s » ? Vos amis peuvent ajouter ce proxy en scannant le code QR. Partager le lien @@ -658,6 +678,8 @@ Tag privé Travail ou famille par exemple Tag seulement visible par vous pour vous aider à différencier les profils. + + Remonter l\'élément Supprimer le compte Voulez-vous vraiment supprimer les données de votre compte ? Toutes les données de compte de « %s » sur cet appareil seront effacées, y compris votre configuration de chiffrement de bout en bout, vos contacts, discussions, messages et médias. Cette action est irrévocable. @@ -671,6 +693,8 @@ Transférer à … + + Envoyer %1$d fichiers à « %2$s » ? Envoyer %1$d fichier(s) à %2$d discussions ? Envoyer ce texte à %1$d discussions ?\n\n« %2$s » Partage annulé en raison de permissions manquantes. @@ -701,6 +725,7 @@ Pour appliquer les paramètres de sécurité de l\'écran, veuillez redémarrer l\'application. Notifications Mentions + Dans les groupes passés en muet, des notifications vous sont envoyées, comme des réponses ou des réactions Afficher Priorité Activer les notifications système pour les nouveaux messages @@ -718,6 +743,7 @@ Apparence Thème Langue + Utiliser la police système Clavier anonyme Demander que le clavier désactive l\'apprentissage personnalisé @@ -728,6 +754,8 @@ Gérer les clés Utiliser les émojis système Désactiver la prise en charge des émojis intégrés de Delta Chat + Lire le carnet d\'adresses du système + Permet de créer des conversations avec des contacts du carnet d\'adresse. Certains fournisseurs doivent d\'abord mettre en place un chiffrement de bout-en-bout. Accès à l\'application Discussions Sons de messages entrants @@ -816,6 +844,9 @@ Réactions Réagir + + %1$s a réagi %2$s à « %3$s » + Supprimer les anciens messages Supprimer les messages de l\'appareil @@ -826,6 +857,8 @@ Voulez-vous supprimer %1$d messages maintenant ainsi que tous les futurs nouveaux messages reçus « %2$s » ?\n\n⚠️ Cela inclut les courriels, les fichiers multimédia et les « Messages sauvegardés » dans tous les répertoires du serveur\n\n⚠️ N\'utilisez pas cette fonction si vous utilisez d\'autres clients de messagerie électronique en plus de Delta Chat Cela inclus les courriels, médias et les « Messages sauvegardés » dans tous les répertoires du serveur. N\'utilisez pas cette fonction si vous voulez garder les données sur le serveur ou si vous utilisez d\'autres clients de messagerie électronique en plus de Delta Chat. + Activer la suppression immédiate + Si vous activez la suppression immédiate, vous ne pourrez pas utiliser plusieurs appareils sur ce profil. J\'ai compris, supprimer tous ces messages Immédiatement @@ -928,6 +961,7 @@ Il n\'est pas garanti que tous les messages de cette discussion sont chiffrés de bout en bout.\n\nLe chiffrement de bout en bout assure la confidentialité des messages échangés par les membres d\'une discussion. Même votre fournisseur de courriel ne peut pas les lire. %1$s a envoyé un message depuis un nouvel appareil. Appuyez pour en savoir plus. Le chiffrement de bout en bout ne peut plus être garanti, probablement parce que %1$s a réinstallé Delta Chat ou envoyé un message depuis un nouvel appareil.\n\nVous pouvez convenir d\'une rencontre physique afin de scanner à nouveau son code QR pour ré-instaurer la garantie du chiffrement de bout en bout. + ⚠️ %1$s nécessite un chiffrement de bout en bout qui n\'est pas encore configuré sur cette discussion. Appuyez pour en savoir plus. Pour établir un chiffrement de bout en bout vous pouvez rencontrer vos contacts en personne et scanner leur code QR. En savoir plus @@ -1070,6 +1104,8 @@ MMM D Retirer Sauvegardez + + Annuler la sauvegarde Nom Choisir l\'image de groupe Exporter la sauvegarde diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 54e389e98..4ea7cf8dc 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -28,6 +28,8 @@ Partecipa Ripartecipa Elimina + Cancella per Me + Cancella per Tutti Informazioni Aggiorna Emoji @@ -380,6 +382,11 @@ Elimina chat \"%1$s\"? Sei sicuro di voler eliminare questo messaggio? + + Cancella %d messaggio su tutti i tuoi dispositivi? + Cancella %d messaggi su tutti i tuoi dispositivi? + Cancella %d messaggi su tutti i tuoi dispositivi? + Eliminare %d messaggio? @@ -550,7 +557,7 @@ Aggiungi Secondo Dispositivo Assicurati che entrambi i dispositivi siano sulla stessa rete o Wi-Fi. - Questo crea un codice QR che il secondo dispositivo può scansionare per copiare il profilo. + Questo crea un codice QR che il secondo dispositivo può scansionare per copiare il profilo.\n\nAssicurati che nessun osservatore o telecamera indesiderata possa vedere la schermata seguente. Installa Delta Chat sull\'altro tuo dispositivo (https://get.delta.chat) Avvia Delta Chat, tocca \"Ho già un Profilo / Aggiungi come Secondo Dispositivo\" e scansiona il codice mostrato qui diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index f2ef27d4c..ffc68f0b3 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -541,7 +541,7 @@ Secundair apparaat toevoegen Zorg ervoor dat beide apparaten verbonden zijn met hetzelfde (wifi)netwerk - Hiermee wordt een QR-code samengesteld die door het tweede apparaat kan worden gescand om het account te kopiëren. + Hiermee wordt een QR-code samengesteld die door het tweede apparaat kan worden gescand om het account te kopiëren.\n\nZorg dat er geen vreemden meekijken, al dan niet door een camera. Installeer Delta Chat op je andere apparaat (https://get.delta.chat) Start Delta Chat, druk op ‘Ik heb al een profiel → Toevoegen als secundair apparaat’ en scan de hier getoonde code diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index cac41b1b2..187f616e7 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -28,6 +28,8 @@ Dołącz Dołącz ponownie Usuń + Usuń u mnie + Usuń u wszystkich Informacje Aktualizacja Emoji @@ -391,6 +393,12 @@ Usunąć czat „%1$s”? Nie będzie on już wyświetlany na liście czatów. Jego wiadomości pozostaną na serwerze. Czy na pewno chcesz usunąć tę wiadomość? + + Usunąć %d wiadomość ze wszystkich urządzeń? + Usunąć %d wiadomości ze wszystkich urządzeń? + Usunąć %d wiadomości ze wszystkich urządzeń? + Usunąć %d wiadomości ze wszystkich urządzeń? + Usunąć %d wiadomość? diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 0474f5288..85163b26d 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -28,6 +28,8 @@ Присоединиться Присоединиться снова Удалить + Удалить для меня + Удалить для всех Информация Обновить Эмодзи @@ -391,6 +393,12 @@ Удалить чат \"%1$s\"? Вы уверены, что хотите удалить это сообщение? + + Удалить %d сообщение на всех ваших устройствах? + Удалить %d сообщения на всех ваших устройствах? + Удалить %d сообщений на всех ваших устройствах? + Удалить %d сообщений на всех ваших устройствах? + Удалить %d сообщение? @@ -565,7 +573,7 @@ Добавить второе устройство Убедитесь, что оба устройства подключены к одной и той же локальной или Wi-Fi сети. - Это создает QR-код, который можно отсканировать на втором устройстве, чтобы скопировать профиль. + Это позволяет создать QR-код, который можно отсканировать на втором устройстве, чтобы скопировать профиль.\n\nУбедитесь, что посторонние люди или камера не видят следующий экран. Установите Delta Chat на другом устройстве (https://get.delta.chat) Запустите Delta Chat, выберите \"У меня уже есть профиль / Добавить как второе устройство\" и отсканируйте код, показанный здесь diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index e162e8957..adb96a7fe 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -28,6 +28,8 @@ Hyni Rihyni Fshije + Fshije për Mua + Fshije për Gjithkënd Hollësi Përditësoje Emoji @@ -365,6 +367,10 @@ Jeni i sigurt se doni të fshihet “%1$s”? Jeni i sigurt se doni të fshihet ky mesazh? + + Të fshihet %d mesazh në krejt pajisjet tuaja? + Të fshihen %d mesazhe në krejt pajisjet tuaja? + Të fshihet %d mesazh? diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index e7becbfc2..9dd8dbd17 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -541,7 +541,7 @@ İkinci Aygıt Ekle Her iki aygıtın da aynı Wi-Fi\'da ya da ağda olduğundan emin olun - Bu, ikinci aygıtın profili kopyalamak için tarayabileceği bir QR kodu oluşturur. + Bu, ikinci aygıtın profili kopyalamak için tarayabileceği bir QR kodu oluşturur.\n\nİstenmeyen gözlemcinin ya da kameranın aşağıdaki ekranı göremediğinden emin olun. Delta Chat\'i diğer aygıtınıza kurun (https://get.delta.chat) Delta Chat\'i başlatın, “Zaten Bir Profilim Var / İkinci Aygıt Olarak Ekle”ye dokunun ve burada gösterilen kodu tarayın diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 67b4ea205..2c888c44c 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -28,6 +28,8 @@ 加入 重新加入 删除 + 为我删除 + 为所有人删除 信息 更新 Emoji @@ -358,6 +360,9 @@ 删除聊天“%1$s”?它将不再显示在聊天列表中,其消息将保留在服务器上。 您确定要删除这条消息吗? + + 是否删除所有设备上的 %d 条消息? + 删除 %d 条消息吗? From 276c0785fa5f2a33ec02b3adab809d53fe7aa8ec Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 27 Feb 2025 18:37:20 +0100 Subject: [PATCH 20/20] update local help --- src/main/assets/help/cs/help.html | 2 +- src/main/assets/help/de/help.html | 2 +- src/main/assets/help/en/help.html | 2 +- src/main/assets/help/es/help.html | 2 +- src/main/assets/help/fr/help.html | 2 +- src/main/assets/help/id/help.html | 2 +- src/main/assets/help/it/help.html | 30 +++++++++++++-------------- src/main/assets/help/nl/help.html | 2 +- src/main/assets/help/pl/help.html | 29 +++++++++++--------------- src/main/assets/help/pt/help.html | 2 +- src/main/assets/help/ru/help.html | 4 ++-- src/main/assets/help/sk/help.html | 2 +- src/main/assets/help/sq/help.html | 2 +- src/main/assets/help/uk/help.html | 31 +++++++++++++--------------- src/main/assets/help/zh_CN/help.html | 20 +++++++++--------- 15 files changed, 63 insertions(+), 71 deletions(-) diff --git a/src/main/assets/help/cs/help.html b/src/main/assets/help/cs/help.html index eaaa2124b..8e8ed2872 100644 --- a/src/main/assets/help/cs/help.html +++ b/src/main/assets/help/cs/help.html @@ -1,5 +1,5 @@ -