From ac32344ebb6adfe54e2cbe50d951bec7eaa0a506 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 11 Oct 2019 22:00:40 +0200 Subject: [PATCH] WebView refactoring --- .../eu/faircode/email/AdapterMessage.java | 154 ++++------------ .../java/eu/faircode/email/WebViewEx.java | 170 ++++++++++++++++++ 2 files changed, 206 insertions(+), 118 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/WebViewEx.java diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 301de7aa5c..5f966c6b53 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -79,10 +79,7 @@ import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewStub; import android.view.animation.AccelerateDecelerateInterpolator; -import android.webkit.DownloadListener; -import android.webkit.WebSettings; import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; @@ -1291,12 +1288,11 @@ public class AdapterMessage extends RecyclerView.Adapter position = properties.getPosition(message.id); Log.i("Bind size=" + size + " height=" + height); @@ -1306,30 +1302,11 @@ public class AdapterMessage extends RecyclerView.Adapter dp60) - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); - else - super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Unspecified - - int mh = getMeasuredHeight(); - Log.i("Measured height=" + mh); - if (mh == 0) - setMeasuredDimension(getMeasuredWidth(), height); - } - - @Override - protected void onSizeChanged(int w, int h, int ow, int oh) { - super.onSizeChanged(w, h, ow, oh); - Log.i("Size changed height=" + h); - properties.setHeight(message.id, h); - } - }; + webView = new WebViewEx(context); webView.setId(wvBody.getId()); @@ -1340,115 +1317,58 @@ public class AdapterMessage extends RecyclerView.Adapter. + + Copyright 2018-2019 by Marcel Bokhorst (M66B) +*/ + +import android.content.Context; +import android.net.Uri; +import android.os.Build; +import android.util.Pair; +import android.view.View; +import android.webkit.DownloadListener; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class WebViewEx extends WebView implements DownloadListener, View.OnLongClickListener { + private int height; + private IWebView intf; + + public WebViewEx(Context context) { + super(context); + + setVerticalScrollBarEnabled(false); + setHorizontalScrollBarEnabled(false); + + setDownloadListener(this); + setOnLongClickListener(this); + + setWebViewClient(new WebViewClient() { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.i("Open url=" + url); + return intf.onOpenLink(url); + } + + @Override + public void onScaleChanged(WebView view, float oldScale, float newScale) { + Log.i("Changed scale=" + newScale); + intf.onScaleChanged(newScale); + } + }); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + intf.onScrollChange(scrollX, scrollY); + } + }); + + WebSettings settings = getSettings(); + settings.setUseWideViewPort(true); + settings.setLoadWithOverviewMode(true); + + settings.setBuiltInZoomControls(true); + settings.setDisplayZoomControls(false); + + settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING); + + settings.setAllowFileAccess(false); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } + + void init( + int height, float size, Pair position, + float textSize, boolean monospaced, + boolean show_images, boolean inline, + IWebView intf) { + Log.i("Init height=" + height + " size=" + size); + + this.height = (height == 0 ? getMinimumHeight() : height); + + setInitialScale(size == 0 ? 1 : Math.round(size * 100)); + + if (position != null) { + setScrollX(position.first); + setScrollY(position.second); + } + + WebSettings settings = getSettings(); + if (textSize != 0) { + int dp = Helper.pixels2dp(getContext(), textSize); + settings.setDefaultFontSize(Math.round(dp)); + settings.setDefaultFixedFontSize(Math.round(dp)); + } + if (monospaced) + settings.setStandardFontFamily("monospace"); + + settings.setLoadsImagesAutomatically(show_images || inline); + settings.setBlockNetworkLoads(!show_images); + settings.setBlockNetworkImage(!show_images); + + this.intf = intf; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (height > getMinimumHeight()) + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); + else + super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Unspecified + + int mh = getMeasuredHeight(); + Log.i("Measured height=" + mh + " last=" + height); + if (mh == 0) + setMeasuredDimension(getMeasuredWidth(), height); + } + + @Override + protected void onSizeChanged(int w, int h, int ow, int oh) { + super.onSizeChanged(w, h, ow, oh); + Log.i("Size changed height=" + h); + this.intf.onSizeChanged(w, h, ow, oh); + } + + @Override + public void onDownloadStart( + String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { + Log.i("Download url=" + url + " mime type=" + mimetype); + + Uri uri = Uri.parse(url); + if ("cid".equals(uri.getScheme()) || "data".equals(uri.getScheme())) + return; + + Helper.view(getContext(), uri, true); + } + + @Override + public boolean onLongClick(View view) { + WebView.HitTestResult result = ((WebView) view).getHitTestResult(); + if (result.getType() == WebView.HitTestResult.IMAGE_TYPE || + result.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { + Log.i("Long press url=" + result.getExtra()); + + Uri uri = Uri.parse(result.getExtra()); + if ("cid".equals(uri.getScheme()) || "data".equals(uri.getScheme())) + return false; + + Helper.view(getContext(), uri, true); + + return true; + } + return false; + } + + interface IWebView { + void onSizeChanged(int w, int h, int ow, int oh); + + void onScaleChanged(float newScale); + + void onScrollChange(int scrollX, int scrollY); + + boolean onOpenLink(String url); + } +}