From cf23f6288702088874c96926ef0d677e1b8e3bad Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 26 Jul 2023 00:22:28 +0200 Subject: [PATCH 1/7] fix: load updated display name when chat protection breaks --- src/org/thoughtcrime/securesms/ConversationActivity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index f4bab9917..75075dfd8 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -1649,9 +1649,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity if (dcChat.isProtectionBroken()) { messageRequestBottomView.setBlockText(R.string.more_info_desktop); - messageRequestBottomView.setBlockOnClickListener(v -> DcHelper.showVerificationBrokenDialog(this, recipient.getName())); + String name = dcContext.getContact(recipient.getDcContact().getId()).getDisplayName(); + messageRequestBottomView.setBlockOnClickListener(v -> DcHelper.showVerificationBrokenDialog(this, name)); - messageRequestBottomView.setQuestion(getString(R.string.chat_protection_broken, recipient.getName())); + messageRequestBottomView.setQuestion(getString(R.string.chat_protection_broken, name)); messageRequestBottomView.setAcceptText(R.string.ok); } else if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) { From d847eefddf5a6be27450984642e8e0f2604bf58c Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 31 Jul 2023 16:55:52 +0000 Subject: [PATCH 2/7] update deltachat-core-rust to 'refactor: hide DcSecretKey trait from the API' of 'master' --- 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 d76275310..af013559d 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit d762753103bae64241a7edffd8eee5cc389c9a4b +Subproject commit af013559de36dc892e0a8d96c392be2de646551a From a0821a9cf3ec8abd82dab9ba12a78dc8e9597618 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 31 Jul 2023 16:56:32 +0000 Subject: [PATCH 3/7] Update to the new dc_accounts_new() API --- jni/dc_wrapper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 01d01f21d..53d100405 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -227,7 +227,8 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *en { CHAR_REF(osname); CHAR_REF(dir); - jlong accountsCPtr = (jlong)dc_accounts_new(osnamePtr, dirPtr); + int writable = 1; + jlong accountsCPtr = (jlong)dc_accounts_new(dirPtr, writable); CHAR_UNREF(dir); CHAR_UNREF(osname); return accountsCPtr; From 2d7b7c49c3ffeab0d1c3d96341b8fefe76922221 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 31 Jul 2023 17:19:04 +0000 Subject: [PATCH 4/7] Remove unused osName argument from DcAccounts constructor --- jni/dc_wrapper.c | 4 +--- src/com/b44t/messenger/DcAccounts.java | 6 +++--- src/org/thoughtcrime/securesms/ApplicationContext.java | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 53d100405..8414e886d 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -223,14 +223,12 @@ static dc_accounts_t* get_dc_accounts(JNIEnv *env, jobject obj) } -JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring osname, jstring dir) +JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir) { - CHAR_REF(osname); CHAR_REF(dir); int writable = 1; jlong accountsCPtr = (jlong)dc_accounts_new(dirPtr, writable); CHAR_UNREF(dir); - CHAR_UNREF(osname); return accountsCPtr; } diff --git a/src/com/b44t/messenger/DcAccounts.java b/src/com/b44t/messenger/DcAccounts.java index 671bb6caf..c959ff69e 100644 --- a/src/com/b44t/messenger/DcAccounts.java +++ b/src/com/b44t/messenger/DcAccounts.java @@ -2,8 +2,8 @@ package com.b44t.messenger; public class DcAccounts { - public DcAccounts(String osName, String dir) { - accountsCPtr = createAccountsCPtr(osName, dir); + public DcAccounts(String dir) { + accountsCPtr = createAccountsCPtr(dir); } @Override @@ -36,7 +36,7 @@ public class DcAccounts { // working with raw c-data private long accountsCPtr; // CAVE: the name is referenced in the JNI - private native long createAccountsCPtr (String osName, String dir); + private native long createAccountsCPtr (String dir); private native void unrefAccountsCPtr (); private native long getEventEmitterCPtr (); private native long getJsonrpcInstanceCPtr (); diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 98227cc7f..0963c8cda 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -91,7 +91,7 @@ public class ApplicationContext extends MultiDexApplication { System.loadLibrary("native-utils"); - dcAccounts = new DcAccounts("Android "+BuildConfig.VERSION_NAME, new File(getFilesDir(), "accounts").getAbsolutePath()); + dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath()); rpc = new Rpc(dcAccounts.getJsonrpcInstance()); AccountManager.getInstance().migrateToDcAccounts(this); int[] allAccounts = dcAccounts.getAll(); From 51a02c30f938a44275be0d4b059b5f358d309308 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 6 Aug 2023 16:34:46 +0000 Subject: [PATCH 5/7] update deltachat-core-rust to 'api!(deltachat-jsonrpc): use `kind` as a tag for all union types' of 'master' --- 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 af013559d..e12044e6a 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit af013559de36dc892e0a8d96c392be2de646551a +Subproject commit e12044e6af0b0f8285b0b1f7bc51c102072d0404 From 39184f8a09ccd0a51fc4aa4cdeb012bd596be841 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 15 Aug 2023 11:27:37 +0200 Subject: [PATCH 6/7] improve mailto Intent handling in ShareActivity --- .../securesms/NewConversationActivity.java | 62 +++--------------- .../thoughtcrime/securesms/ShareActivity.java | 13 ++++ .../securesms/util/MailtoUtil.java | 64 +++++++++++++++++++ 3 files changed, 85 insertions(+), 54 deletions(-) create mode 100644 src/org/thoughtcrime/securesms/util/MailtoUtil.java diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index 15f657239..81f1c1892 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -17,7 +17,6 @@ package org.thoughtcrime.securesms; import android.content.Intent; -import android.net.MailTo; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -32,11 +31,7 @@ import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; import org.thoughtcrime.securesms.connect.DcHelper; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.HashMap; -import java.util.Map; +import org.thoughtcrime.securesms.util.MailtoUtil; import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA; import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA; @@ -53,11 +48,6 @@ public class NewConversationActivity extends ContactSelectionActivity { @SuppressWarnings("unused") private static final String TAG = NewConversationActivity.class.getSimpleName(); - public static final String MAILTO = "mailto"; - private static final String SUBJECT = "subject"; - private static final String BODY = "body"; - private static final String QUERY_SEPARATOR = "&"; - private static final String KEY_VALUE_SEPARATOR = "="; @Override public void onCreate(Bundle bundle, boolean ready) { @@ -75,19 +65,14 @@ public class NewConversationActivity extends ContactSelectionActivity { Uri uri = intent.getData(); if(uri != null) { String scheme = uri.getScheme(); - if(scheme != null && scheme.equals(MAILTO) ) { - String textToShare = getTextToShare(uri); - MailTo mailto = MailTo.parse(uri.toString()); - String recipientsList = mailto.getTo(); - if(recipientsList != null && !recipientsList.trim().isEmpty()) { - String[] recipientsArray = recipientsList.trim().split(","); - if (recipientsArray.length >= 1) { - String recipient = recipientsArray[0]; - if (textToShare != null && !textToShare.isEmpty()) { - getIntent().putExtra(TEXT_EXTRA, textToShare); - } - onContactSelected(DcContact.DC_CONTACT_ID_NEW_CONTACT, recipient); + if(MailtoUtil.isMailto(uri)) { + String textToShare = MailtoUtil.getText(uri); + String[] recipientsArray = MailtoUtil.getRecipients(uri); + if (recipientsArray.length >= 1) { + if (!textToShare.isEmpty()) { + getIntent().putExtra(TEXT_EXTRA, textToShare); } + onContactSelected(DcContact.DC_CONTACT_ID_NEW_CONTACT, recipientsArray[0]); } else { Intent shareIntent = new Intent(this, ShareActivity.class); shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare); @@ -103,37 +88,6 @@ public class NewConversationActivity extends ContactSelectionActivity { } } - private String getTextToShare(Uri uri) { - Map mailtoQueryMap = getMailtoQueryMap(uri); - String textToShare = mailtoQueryMap.get(SUBJECT); - String body = mailtoQueryMap.get(BODY); - if (body != null && !body.isEmpty()) { - if (textToShare != null && !textToShare.isEmpty()) { - textToShare += "\n" + body; - } else { - textToShare = body; - } - } - return textToShare; - } - - private Map getMailtoQueryMap(Uri uri) { - Map mailtoQueryMap = new HashMap<>(); - String query = uri.getEncodedQuery(); - if (query != null && !query.isEmpty()) { - String[] queryArray = query.split(QUERY_SEPARATOR); - for(String queryEntry : queryArray) { - String[] queryEntryArray = queryEntry.split(KEY_VALUE_SEPARATOR); - try { - mailtoQueryMap.put(queryEntryArray[0], URLDecoder.decode(queryEntryArray[1], "UTF-8")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - } - } - return mailtoQueryMap; - } - @Override public void onContactSelected(int specialId, String addr) { final DcContext dcContext = DcHelper.getContext(this); diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index 3df404a73..04a042b81 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -41,6 +41,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.MailtoUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.RelayUtil; @@ -123,6 +124,18 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement streamExtras.add(uri); } else if (getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM) != null) { streamExtras = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM); + } else { + Uri uri = getIntent().getData(); + if (MailtoUtil.isMailto(uri)) { + String[] extraEmail = getIntent().getStringArrayExtra(Intent.EXTRA_EMAIL); + if (extraEmail == null || extraEmail.length == 0) { + getIntent().putExtra(Intent.EXTRA_EMAIL, MailtoUtil.getRecipients(uri)); + } + String text = getIntent().getStringExtra(Intent.EXTRA_TEXT); + if (text == null || text.isEmpty()) { + getIntent().putExtra(Intent.EXTRA_TEXT, MailtoUtil.getText(uri)); + } + } } if (needsFilePermission(streamExtras)) { diff --git a/src/org/thoughtcrime/securesms/util/MailtoUtil.java b/src/org/thoughtcrime/securesms/util/MailtoUtil.java new file mode 100644 index 000000000..c5d962488 --- /dev/null +++ b/src/org/thoughtcrime/securesms/util/MailtoUtil.java @@ -0,0 +1,64 @@ +package org.thoughtcrime.securesms.util; + +import android.net.MailTo; +import android.net.Uri; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; + +public class MailtoUtil { + private static final String MAILTO = "mailto"; + private static final String SUBJECT = "subject"; + private static final String BODY = "body"; + private static final String QUERY_SEPARATOR = "&"; + private static final String KEY_VALUE_SEPARATOR = "="; + + public static boolean isMailto(Uri uri) { + return uri != null && MAILTO.equals(uri.getScheme()); + } + + public static String[] getRecipients(Uri uri) { + String[] recipientsArray = new String[0]; + if (uri != null) { + MailTo mailto = MailTo.parse(uri.toString()); + String recipientsList = mailto.getTo(); + if(recipientsList != null && !recipientsList.trim().isEmpty()) { + recipientsArray = recipientsList.trim().split(","); + } + } + return recipientsArray; + } + + public static String getText(Uri uri) { + Map mailtoQueryMap = getMailtoQueryMap(uri); + String textToShare = mailtoQueryMap.get(SUBJECT); + String body = mailtoQueryMap.get(BODY); + if (body != null && !body.isEmpty()) { + if (textToShare != null && !textToShare.isEmpty()) { + textToShare += "\n" + body; + } else { + textToShare = body; + } + } + return textToShare != null? textToShare : ""; + } + + private static Map getMailtoQueryMap(Uri uri) { + Map mailtoQueryMap = new HashMap<>(); + String query = uri.getEncodedQuery(); + if (query != null && !query.isEmpty()) { + String[] queryArray = query.split(QUERY_SEPARATOR); + for(String queryEntry : queryArray) { + String[] queryEntryArray = queryEntry.split(KEY_VALUE_SEPARATOR); + try { + mailtoQueryMap.put(queryEntryArray[0], URLDecoder.decode(queryEntryArray[1], "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + } + return mailtoQueryMap; + } +} From 22017fd1626fa3057a92a3a8a5b4d8351fb2ee25 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Tue, 15 Aug 2023 18:27:45 +0200 Subject: [PATCH 7/7] Add regression test --- .../uitests/offline/SharingTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java b/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java index 360bac152..710e78375 100644 --- a/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java +++ b/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java @@ -209,6 +209,25 @@ public class SharingTest { onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("Veeery important draft"))); } + /** + * Regression test: + * + * If you save your contacts's emails in the contacts app of the phone, there are buttons to call + * them and also to write an email to them. + * + * If you click the email button, Delta Chat opened but instead of opening a chat with that contact, + * the chat list was show and "share with" was displayed at the top + */ + @Test + public void testOpenChatFromContacts() { + Intent i = new Intent(Intent.ACTION_SENDTO); + i.setData(Uri.parse("mailto:bob%40example.org")); + i.setPackage(getInstrumentation().getTargetContext().getPackageName()); + activityRule.getScenario().onActivity(a -> a.startActivity(i)); + + onView(withId(R.id.subtitle)).check(matches(withText("bob@example.org"))); + } + @After public void cleanup() { TestUtils.cleanup();