diff --git a/app/src/amazon/AndroidManifest.xml b/app/src/amazon/AndroidManifest.xml index 25f966c814..6f39320274 100644 --- a/app/src/amazon/AndroidManifest.xml +++ b/app/src/amazon/AndroidManifest.xml @@ -352,6 +352,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + Copyright 2018-2022 by Marcel Bokhorst (M66B) +*/ + +import android.Manifest; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.webkit.WebSettings; +import android.webkit.WebView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.Group; +import androidx.preference.PreferenceManager; + +import com.google.android.material.snackbar.Snackbar; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +public class ActivityAMP extends ActivityBase { + private WebView wvAmp; + private ContentLoadingProgressBar pbWait; + private Group grpReady; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getSupportActionBar().setIcon(R.drawable.twotone_bolt_24); + getSupportActionBar().setSubtitle("AMP"); + + View view = LayoutInflater.from(this).inflate(R.layout.activity_amp, null); + setContentView(view); + + wvAmp = findViewById(R.id.wvAmp); + pbWait = findViewById(R.id.pbWait); + grpReady = findViewById(R.id.grpReady); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean safe_browsing = prefs.getBoolean("safe_browsing", false); + + WebSettings settings = wvAmp.getSettings(); + settings.setUserAgentString(WebViewEx.getUserAgent(this, wvAmp)); + settings.setUseWideViewPort(true); + settings.setLoadWithOverviewMode(true); + + settings.setBuiltInZoomControls(true); + settings.setDisplayZoomControls(false); + + settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING); + + settings.setAllowFileAccess(false); + settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + settings.setSafeBrowsingEnabled(safe_browsing); + + settings.setLoadsImagesAutomatically(true); + settings.setBlockNetworkLoads(false); + settings.setBlockNetworkImage(false); + settings.setJavaScriptEnabled(true); + + // Initialize + grpReady.setVisibility(View.GONE); + + load(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + load(); + } + + private void load() { + Uri uri = getIntent().getData(); + Log.i("AMP uri=" + uri); + + Bundle args = new Bundle(); + args.putParcelable("uri", uri); + + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + pbWait.setVisibility(View.VISIBLE); + } + + @Override + protected void onPostExecute(Bundle args) { + pbWait.setVisibility(View.GONE); + } + + @Override + protected String onExecute(Context context, Bundle args) throws Throwable { + Uri uri = args.getParcelable("uri"); + + if (uri == null) + throw new FileNotFoundException(); + + if (!"content".equals(uri.getScheme()) && + !Helper.hasPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)) { + Log.w("AMP uri=" + uri); + throw new IllegalArgumentException(context.getString(R.string.title_no_stream)); + } + + ContentResolver resolver = context.getContentResolver(); + try (InputStream is = resolver.openInputStream(uri)) { + return Helper.readStream(is); + } + } + + @Override + protected void onExecuted(Bundle args, String amp) { + wvAmp.loadDataWithBaseURL(null, amp, "text/html", StandardCharsets.UTF_8.name(), null); + grpReady.setVisibility(View.VISIBLE); + } + + @Override + protected void onException(Bundle args, @NonNull Throwable ex) { + if (ex instanceof IllegalArgumentException) + Snackbar.make(findViewById(android.R.id.content), ex.getMessage(), Snackbar.LENGTH_LONG) + .setGestureInsetBottomIgnored(true).show(); + else + Log.unexpectedError(getSupportFragmentManager(), ex, false); + } + }.execute(this, args, "amp:decode"); + } +} diff --git a/app/src/main/java/eu/faircode/email/AdapterAttachment.java b/app/src/main/java/eu/faircode/email/AdapterAttachment.java index 779ba01df5..ad286b5889 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAttachment.java +++ b/app/src/main/java/eu/faircode/email/AdapterAttachment.java @@ -20,7 +20,6 @@ package eu.faircode.email; */ import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; @@ -35,7 +34,6 @@ import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.core.content.FileProvider; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; @@ -295,66 +293,8 @@ public class AdapterAttachment extends RecyclerView.Adapter() { - @Override - protected String onExecute(Context context, Bundle args) throws Throwable { - long id = args.getLong("id"); - - DB db = DB.getInstance(context); - EntityAttachment attachment = db.attachment().getAttachment(id); - if (attachment == null) - return null; - - File file = attachment.getFile(context); - return Helper.readText(file); - } - - @Override - protected void onExecuted(Bundle args, String html) { - if (html == null) - return; - - Bundle hargs = new Bundle(); - hargs.putString("html", html); - hargs.putBoolean("overview_mode", true); - hargs.putBoolean("safe_browsing", true); - hargs.putBoolean("force_light", true); - hargs.putBoolean("javascript", true); - - FragmentDialogOpenFull dialog = new FragmentDialogOpenFull(); - dialog.setArguments(hargs); - dialog.show(parentFragment.getParentFragmentManager(), "amp"); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(parentFragment.getParentFragmentManager(), ex); - } - }.execute(context, owner, args, "attachment:amp"); + String title = (attachment.name == null ? attachment.cid : attachment.name); + Helper.share(context, attachment.getFile(context), attachment.getMimeType(), title); } private void onDownload(EntityAttachment attachment) { diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogOpenFull.java b/app/src/main/java/eu/faircode/email/FragmentDialogOpenFull.java index 6ea1a2dacd..9edeb2defb 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogOpenFull.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogOpenFull.java @@ -62,7 +62,6 @@ public class FragmentDialogOpenFull extends FragmentDialogBase { boolean overview_mode = args.getBoolean("overview_mode"); boolean safe_browsing = args.getBoolean("safe_browsing"); boolean force_light = args.getBoolean("force_light"); - boolean javascript = args.getBoolean("javascript"); final Context context = getContext(); @@ -90,8 +89,6 @@ public class FragmentDialogOpenFull extends FragmentDialogBase { if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK)) WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF); - settings.setJavaScriptEnabled(javascript); - settings.setLoadsImagesAutomatically(true); settings.setBlockNetworkLoads(false); settings.setBlockNetworkImage(false); diff --git a/app/src/main/res/layout/activity_amp.xml b/app/src/main/res/layout/activity_amp.xml new file mode 100644 index 0000000000..3b587cf336 --- /dev/null +++ b/app/src/main/res/layout/activity_amp.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a5085eee88..f2d0ac6756 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1211,7 +1211,6 @@ Always show images on showing original messages Showing images can leak privacy sensitive information Images recognized as tracking images will not be shown - Show AMP variant of the message? Delete local messages? Messages will remain on the remote server. Help improve FairEmail Send error reports? diff --git a/app/src/play/AndroidManifest.xml b/app/src/play/AndroidManifest.xml index 582c727997..dc46ebc464 100644 --- a/app/src/play/AndroidManifest.xml +++ b/app/src/play/AndroidManifest.xml @@ -352,6 +352,24 @@ + + + + + + + + + + + + + +