From 3118dbd32b841bced0554bf40a82077aa2cbaed4 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 23 Nov 2024 02:13:52 +0100 Subject: [PATCH 1/4] allow to open deep-link to webxdc --- .../securesms/WebxdcActivity.java | 31 ++++++++++++++----- src/main/res/raw/webxdc_wrapper.html | 28 ++++++++++++++--- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/WebxdcActivity.java b/src/main/java/org/thoughtcrime/securesms/WebxdcActivity.java index da25f9011..b6f62cbea 100644 --- a/src/main/java/org/thoughtcrime/securesms/WebxdcActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WebxdcActivity.java @@ -39,6 +39,7 @@ import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcMsg; import com.b44t.messenger.rpc.Rpc; import com.b44t.messenger.rpc.RpcException; +import com.google.common.base.Charsets; import org.json.JSONObject; import org.thoughtcrime.securesms.connect.AccountManager; @@ -53,6 +54,8 @@ import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -62,6 +65,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE private static final String EXTRA_ACCOUNT_ID = "accountId"; private static final String EXTRA_APP_MSG_ID = "appMessageId"; private static final String EXTRA_HIDE_ACTION_BAR = "hideActionBar"; + private static final String EXTRA_HREF = "href"; private static final int REQUEST_CODE_FILE_PICKER = 51426; private ValueCallback filePathCallback; @@ -91,29 +95,34 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE return; } } - openWebxdcActivity(context, msgId, true); + openWebxdcActivity(context, msgId, true, ""); } public static void openWebxdcActivity(Context context, DcMsg instance) { - openWebxdcActivity(context, instance.getId(), false); + openWebxdcActivity(context, instance, ""); } - public static void openWebxdcActivity(Context context, int msgId, boolean hideActionBar) { + public static void openWebxdcActivity(Context context, DcMsg instance, String href) { + openWebxdcActivity(context, instance.getId(), false, href); + } + + public static void openWebxdcActivity(Context context, int msgId, boolean hideActionBar, String href) { if (!Util.isClickedRecently()) { if (Prefs.isDeveloperModeEnabled(context)) { WebView.setWebContentsDebuggingEnabled(true); } - context.startActivity(getWebxdcIntent(context, msgId, hideActionBar)); + context.startActivity(getWebxdcIntent(context, msgId, hideActionBar, href)); } } - private static Intent getWebxdcIntent(Context context, int msgId, boolean hideActionBar) { + private static Intent getWebxdcIntent(Context context, int msgId, boolean hideActionBar, String href) { DcContext dcContext = DcHelper.getContext(context); Intent intent = new Intent(context, WebxdcActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(EXTRA_ACCOUNT_ID, dcContext.getAccountId()); intent.putExtra(EXTRA_APP_MSG_ID, msgId); intent.putExtra(EXTRA_HIDE_ACTION_BAR, hideActionBar); + intent.putExtra(EXTRA_HREF, href); return intent; } @@ -124,7 +133,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE .putExtra(ConversationActivity.CHAT_ID_EXTRA, dcContext.getMsg(msgId).getChatId()) .setAction(Intent.ACTION_VIEW); - final Intent webxdcIntent = getWebxdcIntent(context, msgId, false); + final Intent webxdcIntent = getWebxdcIntent(context, msgId, false, ""); return TaskStackBuilder.create(context) .addNextIntentWithParentStack(chatIntent) @@ -205,7 +214,15 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE webView.setNetworkAvailable(internetAccess); // this does not block network but sets `window.navigator.isOnline` in js land webView.addJavascriptInterface(new InternalJSApi(), "InternalJSApi"); - webView.loadUrl(this.baseURL + (internetAccess? "/index.html" : "/webxdc_bootstrap324567869.html")); + String href = b.getString(EXTRA_HREF, ""); + String encodedHref = ""; + try { + encodedHref = URLEncoder.encode(href, Charsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + webView.loadUrl(this.baseURL + "/webxdc_bootstrap324567869.html?i=" + (internetAccess? "1" : "0") + "&href=" + encodedHref); Util.runOnAnyBackgroundThread(() -> { final DcChat chat = dcContext.getChat(dcAppMsg.getChatId()); diff --git a/src/main/res/raw/webxdc_wrapper.html b/src/main/res/raw/webxdc_wrapper.html index 9dd7898c6..69a756342 100644 --- a/src/main/res/raw/webxdc_wrapper.html +++ b/src/main/res/raw/webxdc_wrapper.html @@ -42,11 +42,12 @@ style="display: none" > From 1ccbb7177fd2158fb362a3332acc85fa08cf6912 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 23 Nov 2024 02:33:59 +0100 Subject: [PATCH 2/4] add DcMsg.getWebxdcHref() --- jni/dc_wrapper.c | 9 +++++++++ src/main/java/com/b44t/messenger/DcMsg.java | 1 + 2 files changed, 10 insertions(+) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 2b74581de..d279fd175 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -1565,6 +1565,15 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcInfoJson(JNIEnv *env, j } +JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcHref(JNIEnv *env, jobject obj) +{ + char* temp = dc_msg_get_webxdc_href(get_dc_msg(env, obj)); + jstring ret = JSTRING_NEW(temp); + dc_str_unref(temp); + return ret; +} + + JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isForwarded(JNIEnv *env, jobject obj) { return dc_msg_is_forwarded(get_dc_msg(env, obj))!=0; diff --git a/src/main/java/com/b44t/messenger/DcMsg.java b/src/main/java/com/b44t/messenger/DcMsg.java index 52a4c110d..5bdedda35 100644 --- a/src/main/java/com/b44t/messenger/DcMsg.java +++ b/src/main/java/com/b44t/messenger/DcMsg.java @@ -250,4 +250,5 @@ public class DcMsg { private native long getQuotedMsgCPtr (); private native long getParentCPtr (); private native String getWebxdcInfoJson (); + private native String getWebxdcHref (); }; From 814af177d156fabc867ffbb34c968d76774e7cd7 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 23 Nov 2024 03:26:05 +0100 Subject: [PATCH 3/4] fix: make getWebxdcHref public --- src/main/java/com/b44t/messenger/DcMsg.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/b44t/messenger/DcMsg.java b/src/main/java/com/b44t/messenger/DcMsg.java index 5bdedda35..1292e80d1 100644 --- a/src/main/java/com/b44t/messenger/DcMsg.java +++ b/src/main/java/com/b44t/messenger/DcMsg.java @@ -147,6 +147,7 @@ public class DcMsg { return new JSONObject(); } } + public native String getWebxdcHref (); public native boolean isForwarded (); public native boolean isInfo (); public native boolean isSetupMessage (); @@ -250,5 +251,4 @@ public class DcMsg { private native long getQuotedMsgCPtr (); private native long getParentCPtr (); private native String getWebxdcInfoJson (); - private native String getWebxdcHref (); }; From ea89d3746144f1b209c69aa695af6a78078c9af9 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sat, 23 Nov 2024 03:26:31 +0100 Subject: [PATCH 4/4] open webxdc when clicking info-message, pass deeplink/href --- .../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 a804ef477..737967b21 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -795,7 +795,7 @@ public class ConversationFragment extends MessageSelectorFragment DozeReminder.dozeReminderTapped(getContext()); } else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) { - scrollMaybeSmoothToMsgId(messageRecord.getParent().getId()); + WebxdcActivity.openWebxdcActivity(getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref()); } else { String self_mail = dcContext.getConfig("configured_mail_user");