From 0a73877c258c567d9b7ee860a168302e61d56db9 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 3 Dec 2024 18:52:15 +0100 Subject: [PATCH 1/8] add app picker to attachments menu --- src/main/AndroidManifest.xml | 7 + .../securesms/ConversationActivity.java | 19 ++- .../securesms/WebxdcStoreActivity.java | 136 ++++++++++++++++++ .../components/AttachmentTypeSelector.java | 16 +-- .../securesms/mms/AttachmentManager.java | 6 + src/main/res/drawable/ic_webxdc.xml | 39 +++++ .../res/layout/attachment_type_selector.xml | 45 +++--- 7 files changed, 223 insertions(+), 45 deletions(-) create mode 100644 src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java create mode 100644 src/main/res/drawable/ic_webxdc.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 5b49c2e14..40f688290 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -376,6 +376,13 @@ android:exported="true"> + + + diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java index 0a053ab2b..e8ddffd28 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java @@ -158,8 +158,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private static final int GROUP_EDIT = 6; private static final int TAKE_PHOTO = 7; private static final int RECORD_VIDEO = 8; - private static final int PICK_LOCATION = 9; // TODO: i think, this can be deleted - private static final int SMS_DEFAULT = 11; // TODO: i think, this can be deleted + private static final int PICK_WEBXDC = 9; private GlideRequests glideRequests; protected ComposeText composeText; @@ -337,8 +336,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity public void onActivityResult(final int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data); - if ((data == null && reqCode != TAKE_PHOTO && reqCode != RECORD_VIDEO && reqCode != SMS_DEFAULT) || - (resultCode != RESULT_OK && reqCode != SMS_DEFAULT)) + if (resultCode != RESULT_OK || (data == null && reqCode != TAKE_PHOTO && reqCode != RECORD_VIDEO)) { return; } @@ -374,6 +372,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity setMedia(data.getData(), docMediaType); break; + case PICK_WEBXDC: + setMedia(data.getData(), MediaType.DOCUMENT); + break; + case PICK_CONTACT: addAttachmentContactInfo(data.getIntExtra(AttachContactActivity.CONTACT_ID_EXTRA, 0)); break; @@ -401,16 +403,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } break; - case PICK_LOCATION: - break; - case ScribbleActivity.SCRIBBLE_REQUEST_CODE: setMedia(data.getData(), MediaType.IMAGE); break; - - case SMS_DEFAULT: - initializeSecurity(isSecureText, isDefaultSms); - break; } } @@ -942,6 +937,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity case AttachmentTypeSelector.RECORD_VIDEO: attachmentManager.captureVideo(this, RECORD_VIDEO); break; + case AttachmentTypeSelector.ADD_WEBXDC: + AttachmentManager.selectWebxdc(this, PICK_WEBXDC); break; } } diff --git a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java new file mode 100644 index 000000000..0dd6e8edc --- /dev/null +++ b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java @@ -0,0 +1,136 @@ +package org.thoughtcrime.securesms; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.view.MenuItem; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.appcompat.app.ActionBar; + +import com.b44t.messenger.DcContext; +import com.b44t.messenger.rpc.HttpResponse; +import com.b44t.messenger.rpc.Rpc; + +import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.providers.PersistentBlobProvider; +import org.thoughtcrime.securesms.util.MediaUtil; + +import java.io.ByteArrayInputStream; +import java.util.HashMap; + +public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity { + private static final String TAG = WebxdcStoreActivity.class.getSimpleName(); + + private DcContext dcContext; + private Rpc rpc; + + @Override + protected void onCreate(Bundle state, boolean ready) { + setContentView(R.layout.web_view_activity); + rpc = DcHelper.getRpc(this); + dcContext = DcHelper.getContext(this); + WebView webView = findViewById(R.id.webview); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setTitle(R.string.webxdc_apps); + } + + webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + + @TargetApi(Build.VERSION_CODES.N) + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + view.loadUrl(request.getUrl().toString()); + return true; + } + + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { + WebResourceResponse res = interceptRequest(request.getUrl().toString()); + if (res == null) { + res = super.shouldInterceptRequest(view, request); + } + return res; + } + }); + + WebSettings webSettings = webView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setAllowFileAccess(false); + webSettings.setAllowContentAccess(false); + webSettings.setGeolocationEnabled(false); + webSettings.setAllowFileAccessFromFileURLs(false); + webSettings.setAllowUniversalAccessFromFileURLs(false); + webSettings.setDatabaseEnabled(true); + webSettings.setDomStorageEnabled(true); + webView.setNetworkAvailable(true); // this does not block network but sets `window.navigator.isOnline` in js land + + // TODO: use setting + String storeURL = "https://webxdc.org/apps/"; + webView.loadUrl(storeURL); + } + + private WebResourceResponse interceptRequest(String url) { + WebResourceResponse res = null; + try { + if (url == null) { + throw new Exception("no url specified"); + } + HttpResponse httpResponse = rpc.getHttpResponse(dcContext.getAccountId(), url); + String mimeType = httpResponse.getMimetype(); + if (mimeType == null) { + mimeType = "application/octet-stream"; + } + + String ext = MediaUtil.getFileExtensionFromUrl(Uri.parse(url).getPath()); + if ("xdc".equals(ext)) { + Intent intent = new Intent(); + Uri uri = PersistentBlobProvider.getInstance().create(this, httpResponse.getBlob(), mimeType, "app.xdc"); + intent.setType(mimeType); + intent.setData(uri); + setResult(Activity.RESULT_OK, intent); + finish(); + } else { + ByteArrayInputStream data = new ByteArrayInputStream(httpResponse.getBlob()); + res = new WebResourceResponse(mimeType, httpResponse.getEncoding(), data); + } + } catch (Exception e) { + e.printStackTrace(); + ByteArrayInputStream data = new ByteArrayInputStream(("Error: " + e.getMessage()).getBytes()); + res = new WebResourceResponse("text/plain", "UTF-8", data); + } + if (res != null) { + HashMap headers = new HashMap<>(); + headers.put("access-control-allow-origin", "*"); + res.setResponseHeaders(headers); + } + return res; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + super.onOptionsItemSelected(item); + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + } + return false; + } + +} diff --git a/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java b/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java index dc8a6f948..d2214ccbd 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java +++ b/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java @@ -41,6 +41,7 @@ public class AttachmentTypeSelector extends PopupWindow { public static final int TAKE_PHOTO = 5; public static final int ADD_LOCATION = 6; public static final int RECORD_VIDEO = 7; + public static final int ADD_WEBXDC = 8; private static final int ANIMATION_DURATION = 300; @@ -53,7 +54,7 @@ public class AttachmentTypeSelector extends PopupWindow { private final @NonNull ImageView cameraButton; private final @NonNull ImageView videoButton; private final @NonNull ImageView locationButton; - private final @NonNull ImageView closeButton; + private final @NonNull ImageView webxdcButton; private @Nullable View currentAnchor; private @Nullable AttachmentClickedListener listener; @@ -76,7 +77,7 @@ public class AttachmentTypeSelector extends PopupWindow { this.cameraButton = ViewUtil.findById(layout, R.id.camera_button); this.videoButton = ViewUtil.findById(layout, R.id.record_video_button); this.locationButton = ViewUtil.findById(layout, R.id.location_button); - this.closeButton = ViewUtil.findById(layout, R.id.close_button); + this.webxdcButton = ViewUtil.findById(layout, R.id.webxdc_button); this.imageButton.setOnClickListener(new PropagatingClickListener(ADD_GALLERY)); this.videoChatButton.setOnClickListener(new PropagatingClickListener(INVITE_VIDEO_CHAT)); @@ -85,7 +86,7 @@ public class AttachmentTypeSelector extends PopupWindow { this.cameraButton.setOnClickListener(new PropagatingClickListener(TAKE_PHOTO)); this.videoButton.setOnClickListener(new PropagatingClickListener(RECORD_VIDEO)); this.locationButton.setOnClickListener(new PropagatingClickListener(ADD_LOCATION)); - this.closeButton.setOnClickListener(new CloseClickListener()); + this.webxdcButton.setOnClickListener(new PropagatingClickListener(ADD_WEBXDC)); this.recentRail.setListener(new RecentPhotoSelectedListener()); if (!Prefs.isLocationStreamingEnabled(context)) { @@ -140,8 +141,8 @@ public class AttachmentTypeSelector extends PopupWindow { animateButtonIn(contactButton, ANIMATION_DURATION / 3); animateButtonIn(locationButton, ANIMATION_DURATION / 4); animateButtonIn(documentButton, ANIMATION_DURATION / 4); + animateButtonIn(webxdcButton, 0); animateButtonIn(videoChatButton, 0); - animateButtonIn(closeButton, 0); } @Override @@ -289,13 +290,6 @@ public class AttachmentTypeSelector extends PopupWindow { } - private class CloseClickListener implements View.OnClickListener { - @Override - public void onClick(View v) { - dismiss(); - } - } - public interface AttachmentClickedListener { public void onClick(int type); public void onQuickAttachment(Uri uri); diff --git a/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java index 179037d8b..867b2a4d4 100644 --- a/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -51,6 +51,7 @@ import org.thoughtcrime.securesms.MediaPreviewActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.ShareLocationDialog; import org.thoughtcrime.securesms.WebxdcActivity; +import org.thoughtcrime.securesms.WebxdcStoreActivity; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.UriAttachment; import org.thoughtcrime.securesms.audio.AudioSlidePlayer; @@ -452,6 +453,11 @@ public class AttachmentManager { selectMediaType(activity, "*/*", null, requestCode); } + public static void selectWebxdc(Activity activity, int requestCode) { + Intent intent = new Intent(activity, WebxdcStoreActivity.class); + activity.startActivityForResult(intent, requestCode); + } + public static void selectGallery(Activity activity, int requestCode) { // to enable camera roll, // we're asking for "gallery permissions" also on newer systems that do not strictly require that. diff --git a/src/main/res/drawable/ic_webxdc.xml b/src/main/res/drawable/ic_webxdc.xml new file mode 100644 index 000000000..b296f3477 --- /dev/null +++ b/src/main/res/drawable/ic_webxdc.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/src/main/res/layout/attachment_type_selector.xml b/src/main/res/layout/attachment_type_selector.xml index 8f6b3e2bb..71369c7c2 100644 --- a/src/main/res/layout/attachment_type_selector.xml +++ b/src/main/res/layout/attachment_type_selector.xml @@ -188,6 +188,28 @@ + + + + + + + + - - - - - - - - From f7963a56e9e3e18f5ffb7833e20759fae1ddc3a0 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 3 Dec 2024 19:32:36 +0100 Subject: [PATCH 2/8] add App Picker URL setting --- .../securesms/WebxdcStoreActivity.java | 5 ++- .../AdvancedPreferenceFragment.java | 34 +++++++++++++++++++ .../thoughtcrime/securesms/util/Prefs.java | 11 ++++++ src/main/res/values/strings.xml | 2 ++ src/main/res/xml/preferences_advanced.xml | 4 +++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java index 0dd6e8edc..c15174531 100644 --- a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java @@ -22,6 +22,7 @@ import com.b44t.messenger.rpc.Rpc; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.providers.PersistentBlobProvider; import org.thoughtcrime.securesms.util.MediaUtil; +import org.thoughtcrime.securesms.util.Prefs; import java.io.ByteArrayInputStream; import java.util.HashMap; @@ -80,9 +81,7 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity { webSettings.setDomStorageEnabled(true); webView.setNetworkAvailable(true); // this does not block network but sets `window.navigator.isOnline` in js land - // TODO: use setting - String storeURL = "https://webxdc.org/apps/"; - webView.loadUrl(storeURL); + webView.loadUrl(Prefs.getWebxdcStoreUrl(this)); } private WebResourceResponse interceptRequest(String url) { diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index d01254d89..f259acb53 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -156,6 +156,10 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment webrtcInstance.setOnPreferenceClickListener(new WebrtcInstanceListener()); updateWebrtcSummary(); + Preference webxdcStore = this.findPreference(Prefs.WEBXDC_STORE_URL_PREF); + webxdcStore.setOnPreferenceClickListener(new WebxdcStoreUrlListener()); + updateWebxdcStoreSummary(); + Preference newBroadcastList = this.findPreference("pref_new_broadcast_list"); newBroadcastList.setOnPreferenceChangeListener((preference, newValue) -> { if ((Boolean)newValue) { @@ -345,6 +349,29 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment } } + private class WebxdcStoreUrlListener implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + View gl = View.inflate(getActivity(), R.layout.single_line_input, null); + EditText inputField = gl.findViewById(R.id.input_field); + inputField.setHint(Prefs.DEFAULT_WEBXDC_STORE_URL); + inputField.setText(Prefs.getWebxdcStoreUrl(getActivity())); + inputField.setSelection(inputField.getText().length()); + inputField.setInputType(TYPE_TEXT_VARIATION_URI); + new AlertDialog.Builder(getActivity()) + .setTitle(R.string.webxdc_store_url) + .setMessage(R.string.webxdc_store_url_explain) + .setView(gl) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok, (dlg, btn) -> { + Prefs.setWebxdcStoreUrl(getActivity(), inputField.getText().toString()); + updateWebxdcStoreSummary(); + }) + .show(); + return true; + } + } + private void updateWebrtcSummary() { Preference webrtcInstance = this.findPreference("pref_webrtc_instance"); if (webrtcInstance != null) { @@ -353,6 +380,13 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment } } + private void updateWebxdcStoreSummary() { + Preference preference = this.findPreference(Prefs.WEBXDC_STORE_URL_PREF); + if (preference != null) { + preference.setSummary(Prefs.getWebxdcStoreUrl(getActivity())); + } + } + private void openRegistrationActivity() { Intent intent = new Intent(getActivity(), RegistrationActivity.class); startActivity(intent); diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java index face741e6..667f64499 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java +++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java @@ -62,6 +62,8 @@ public class Prefs { public static final boolean ALWAYS_LOAD_REMOTE_CONTENT_DEFAULT = false; public static final String LAST_DEVICE_MSG_LABEL = "pref_last_device_msg_id"; + public static final String WEBXDC_STORE_URL_PREF = "pref_webxdc_store_url"; + public static final String DEFAULT_WEBXDC_STORE_URL = "https://webxdc.org/apps/"; public enum VibrateState { DEFAULT(0), ENABLED(1), DISABLED(2); @@ -144,6 +146,15 @@ public class Prefs { return getStringPreference(context, THEME_PREF, DynamicTheme.systemThemeAvailable() ? DynamicTheme.SYSTEM : DynamicTheme.LIGHT); } + public static String getWebxdcStoreUrl(Context context) { + return getStringPreference(context, WEBXDC_STORE_URL_PREF, DEFAULT_WEBXDC_STORE_URL); + } + + public static void setWebxdcStoreUrl(Context context, String url) { + if (url == null || url.trim().isEmpty() || DEFAULT_WEBXDC_STORE_URL.equals(url)) url = null; + setStringPreference(context, WEBXDC_STORE_URL_PREF, url); + } + public static void setPromptedDozeMsgId(Context context, int msg_id) { setIntegerPreference(context, PROMPTED_DOZE_MSG_ID_PREF, msg_id); } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a7e06b4bc..1736796fc 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -184,6 +184,8 @@ App Apps + Apps Picker URL + If set, it will be used as the apps picker URL instead of the default one Unknown Green diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml index ce7c72500..b678b762b 100644 --- a/src/main/res/xml/preferences_advanced.xml +++ b/src/main/res/xml/preferences_advanced.xml @@ -26,6 +26,10 @@ android:title="@string/videochat_instance" android:summary="@string/none"/> + + Date: Wed, 4 Dec 2024 14:57:12 +0100 Subject: [PATCH 3/8] don't export WebxdcStoreActivity --- src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 40f688290..6060eea8b 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -379,8 +379,7 @@ + android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"> Date: Wed, 4 Dec 2024 14:59:10 +0100 Subject: [PATCH 4/8] remove label --- src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 6060eea8b..d52740056 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -377,7 +377,6 @@ From d48ab128a06494ff688287ec26a5b0a8f4ca93c8 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 4 Dec 2024 16:01:49 +0100 Subject: [PATCH 5/8] open clicked non-xdc URLs in external browsers instead of internally --- .../securesms/WebxdcStoreActivity.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java index c15174531..a606724d9 100644 --- a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java @@ -12,12 +12,14 @@ import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.widget.Toast; import androidx.appcompat.app.ActionBar; import com.b44t.messenger.DcContext; import com.b44t.messenger.rpc.HttpResponse; import com.b44t.messenger.rpc.Rpc; +import com.b44t.messenger.rpc.RpcException; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.providers.PersistentBlobProvider; @@ -49,24 +51,34 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity { webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); + String ext = MediaUtil.getFileExtensionFromUrl(Uri.parse(url).getPath()); + if ("xdc".equals(ext)) { + try { + HttpResponse httpResponse = rpc.getHttpResponse(dcContext.getAccountId(), url); + Uri uri = PersistentBlobProvider.getInstance().create(WebxdcStoreActivity.this, httpResponse.getBlob(), "application/octet-stream", "app.xdc"); + Intent intent = new Intent(); + intent.setData(uri); + setResult(Activity.RESULT_OK, intent); + finish(); + } catch (RpcException e) { + e.printStackTrace(); + Toast.makeText(WebxdcStoreActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } else { + WebViewActivity.openUrlInBrowser(WebxdcStoreActivity.this, url); + } return true; } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { - view.loadUrl(request.getUrl().toString()); - return true; + return shouldOverrideUrlLoading(view, request.getUrl().toString()); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - WebResourceResponse res = interceptRequest(request.getUrl().toString()); - if (res == null) { - res = super.shouldInterceptRequest(view, request); - } - return res; + return interceptRequest(request.getUrl().toString()); } }); @@ -96,28 +108,17 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity { mimeType = "application/octet-stream"; } - String ext = MediaUtil.getFileExtensionFromUrl(Uri.parse(url).getPath()); - if ("xdc".equals(ext)) { - Intent intent = new Intent(); - Uri uri = PersistentBlobProvider.getInstance().create(this, httpResponse.getBlob(), mimeType, "app.xdc"); - intent.setType(mimeType); - intent.setData(uri); - setResult(Activity.RESULT_OK, intent); - finish(); - } else { - ByteArrayInputStream data = new ByteArrayInputStream(httpResponse.getBlob()); - res = new WebResourceResponse(mimeType, httpResponse.getEncoding(), data); - } + ByteArrayInputStream data = new ByteArrayInputStream(httpResponse.getBlob()); + res = new WebResourceResponse(mimeType, httpResponse.getEncoding(), data); } catch (Exception e) { e.printStackTrace(); ByteArrayInputStream data = new ByteArrayInputStream(("Error: " + e.getMessage()).getBytes()); res = new WebResourceResponse("text/plain", "UTF-8", data); } - if (res != null) { - HashMap headers = new HashMap<>(); - headers.put("access-control-allow-origin", "*"); - res.setResponseHeaders(headers); - } + + HashMap headers = new HashMap<>(); + headers.put("access-control-allow-origin", "*"); + res.setResponseHeaders(headers); return res; } From 0351a1e97459b9370c14bb3bc00730cac0dd89b9 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 4 Dec 2024 16:06:32 +0100 Subject: [PATCH 6/8] Update src/main/res/values/strings.xml Co-authored-by: bjoern --- src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 1736796fc..ce72d3d6d 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -184,8 +184,8 @@ App Apps - Apps Picker URL - If set, it will be used as the apps picker URL instead of the default one + App Picker URL + If set, the URL will be used as the App Picker instead of the default one Unknown Green From 2a6aba110b562ea8999bc7d8572ab2de2f841a16 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 4 Dec 2024 16:40:02 +0100 Subject: [PATCH 7/8] Update src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java Co-authored-by: Hocuri --- .../java/org/thoughtcrime/securesms/WebxdcStoreActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java index a606724d9..5c3ae66e1 100644 --- a/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java @@ -112,7 +112,7 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity { res = new WebResourceResponse(mimeType, httpResponse.getEncoding(), data); } catch (Exception e) { e.printStackTrace(); - ByteArrayInputStream data = new ByteArrayInputStream(("Error: " + e.getMessage()).getBytes()); + ByteArrayInputStream data = new ByteArrayInputStream(("Could not load apps. Are you online?\n\n" + e.getMessage()).getBytes()); res = new WebResourceResponse("text/plain", "UTF-8", data); } From fbab156d22e9284630da57a519efc0b9468c3025 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 5 Dec 2024 15:50:14 +0100 Subject: [PATCH 8/8] tweak apps icon --- src/main/res/drawable/baseline_apps_24.xml | 3 ++ src/main/res/drawable/ic_webxdc.xml | 39 ------------------- .../res/layout/attachment_type_selector.xml | 8 ++-- src/main/res/values/core_colors.xml | 1 + 4 files changed, 9 insertions(+), 42 deletions(-) create mode 100644 src/main/res/drawable/baseline_apps_24.xml delete mode 100644 src/main/res/drawable/ic_webxdc.xml diff --git a/src/main/res/drawable/baseline_apps_24.xml b/src/main/res/drawable/baseline_apps_24.xml new file mode 100644 index 000000000..18dae5c30 --- /dev/null +++ b/src/main/res/drawable/baseline_apps_24.xml @@ -0,0 +1,3 @@ + + + diff --git a/src/main/res/drawable/ic_webxdc.xml b/src/main/res/drawable/ic_webxdc.xml deleted file mode 100644 index b296f3477..000000000 --- a/src/main/res/drawable/ic_webxdc.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - diff --git a/src/main/res/layout/attachment_type_selector.xml b/src/main/res/layout/attachment_type_selector.xml index 71369c7c2..34a5f0975 100644 --- a/src/main/res/layout/attachment_type_selector.xml +++ b/src/main/res/layout/attachment_type_selector.xml @@ -198,9 +198,11 @@ android:id="@+id/webxdc_button" android:layout_width="53dp" android:layout_height="53dp" - android:src="@drawable/ic_webxdc" - android:scaleType="centerInside" - android:contentDescription="@string/webxdc_apps"/> + android:src="@drawable/baseline_apps_24" + android:scaleType="center" + android:contentDescription="@string/webxdc_apps" + app:circleColor="@color/apps_icon" + /> #608496 #a47ad9 #66BB6A + #77bdc4 #ffffff #F9FAFA