Loading app/ui/src/main/java/com/fsck/k9/view/K9WebViewClient.java +14 −64 Original line number Diff line number Diff line Loading @@ -5,31 +5,28 @@ import java.io.InputStream; import java.util.Collections; import java.util.Map; import android.annotation.TargetApi; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Build.VERSION_CODES; import android.provider.Browser; import androidx.annotation.Nullable; import android.text.TextUtils; import timber.log.Timber; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.Nullable; import com.fsck.k9.mailstore.AttachmentResolver; import com.fsck.k9.view.MessageWebView.OnPageFinishedListener; import timber.log.Timber; /** * {@link WebViewClient} that intercepts requests for {@code cid:} URIs to load the respective body part. */ abstract class K9WebViewClient extends WebViewClient { public class K9WebViewClient extends WebViewClient { private static final String CID_SCHEME = "cid"; private static final WebResourceResponse RESULT_DO_NOT_INTERCEPT = null; private static final WebResourceResponse RESULT_DUMMY_RESPONSE = new WebResourceResponse(null, null, null); Loading @@ -41,11 +38,7 @@ abstract class K9WebViewClient extends WebViewClient { public static K9WebViewClient newInstance(@Nullable AttachmentResolver attachmentResolver) { if (Build.VERSION.SDK_INT < 21) { return new PreLollipopWebViewClient(attachmentResolver); } return new LollipopWebViewClient(attachmentResolver); return new K9WebViewClient(attachmentResolver); } Loading @@ -54,15 +47,14 @@ abstract class K9WebViewClient extends WebViewClient { } @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { Uri uri = Uri.parse(url); public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) { Uri uri = request.getUrl(); if (CID_SCHEME.equals(uri.getScheme())) { return false; } Context context = webView.getContext(); Intent intent = createBrowserViewIntent(uri, context); addActivityFlags(intent); boolean overridingUrlLoading = false; try { Loading @@ -80,14 +72,12 @@ abstract class K9WebViewClient extends WebViewClient { intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); intent.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); return intent; } protected abstract void addActivityFlags(Intent intent); protected abstract void addCacheControlHeader(WebResourceResponse response); protected WebResourceResponse shouldInterceptRequest(WebView webView, Uri uri) { public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest request) { Uri uri = request.getUrl(); if (!CID_SCHEME.equals(uri.getScheme())) { return RESULT_DO_NOT_INTERCEPT; } Loading Loading @@ -121,6 +111,11 @@ abstract class K9WebViewClient extends WebViewClient { } } private void addCacheControlHeader(WebResourceResponse response) { Map<String, String> headers = Collections.singletonMap("Cache-Control", "no-store"); response.setResponseHeaders(headers); } public void setOnPageFinishedListener(OnPageFinishedListener onPageFinishedListener) { this.onPageFinishedListener = onPageFinishedListener; } Loading @@ -132,49 +127,4 @@ abstract class K9WebViewClient extends WebViewClient { onPageFinishedListener.onPageFinished(); } } @SuppressWarnings("deprecation") private static class PreLollipopWebViewClient extends K9WebViewClient { protected PreLollipopWebViewClient(AttachmentResolver attachmentResolver) { super(attachmentResolver); } @Override public WebResourceResponse shouldInterceptRequest(WebView webView, String url) { return shouldInterceptRequest(webView, Uri.parse(url)); } @Override protected void addActivityFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); } @Override protected void addCacheControlHeader(WebResourceResponse response) { // Sadly, adding headers is not supported prior to Lollipop } } @TargetApi(VERSION_CODES.LOLLIPOP) private static class LollipopWebViewClient extends K9WebViewClient { protected LollipopWebViewClient(AttachmentResolver attachmentResolver) { super(attachmentResolver); } @Override public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest request) { return shouldInterceptRequest(webView, request.getUrl()); } @Override protected void addActivityFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); } @Override protected void addCacheControlHeader(WebResourceResponse response) { Map<String, String> headers = Collections.singletonMap("Cache-Control", "no-store"); response.setResponseHeaders(headers); } } } Loading
app/ui/src/main/java/com/fsck/k9/view/K9WebViewClient.java +14 −64 Original line number Diff line number Diff line Loading @@ -5,31 +5,28 @@ import java.io.InputStream; import java.util.Collections; import java.util.Map; import android.annotation.TargetApi; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Build.VERSION_CODES; import android.provider.Browser; import androidx.annotation.Nullable; import android.text.TextUtils; import timber.log.Timber; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.Nullable; import com.fsck.k9.mailstore.AttachmentResolver; import com.fsck.k9.view.MessageWebView.OnPageFinishedListener; import timber.log.Timber; /** * {@link WebViewClient} that intercepts requests for {@code cid:} URIs to load the respective body part. */ abstract class K9WebViewClient extends WebViewClient { public class K9WebViewClient extends WebViewClient { private static final String CID_SCHEME = "cid"; private static final WebResourceResponse RESULT_DO_NOT_INTERCEPT = null; private static final WebResourceResponse RESULT_DUMMY_RESPONSE = new WebResourceResponse(null, null, null); Loading @@ -41,11 +38,7 @@ abstract class K9WebViewClient extends WebViewClient { public static K9WebViewClient newInstance(@Nullable AttachmentResolver attachmentResolver) { if (Build.VERSION.SDK_INT < 21) { return new PreLollipopWebViewClient(attachmentResolver); } return new LollipopWebViewClient(attachmentResolver); return new K9WebViewClient(attachmentResolver); } Loading @@ -54,15 +47,14 @@ abstract class K9WebViewClient extends WebViewClient { } @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { Uri uri = Uri.parse(url); public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) { Uri uri = request.getUrl(); if (CID_SCHEME.equals(uri.getScheme())) { return false; } Context context = webView.getContext(); Intent intent = createBrowserViewIntent(uri, context); addActivityFlags(intent); boolean overridingUrlLoading = false; try { Loading @@ -80,14 +72,12 @@ abstract class K9WebViewClient extends WebViewClient { intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); intent.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); return intent; } protected abstract void addActivityFlags(Intent intent); protected abstract void addCacheControlHeader(WebResourceResponse response); protected WebResourceResponse shouldInterceptRequest(WebView webView, Uri uri) { public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest request) { Uri uri = request.getUrl(); if (!CID_SCHEME.equals(uri.getScheme())) { return RESULT_DO_NOT_INTERCEPT; } Loading Loading @@ -121,6 +111,11 @@ abstract class K9WebViewClient extends WebViewClient { } } private void addCacheControlHeader(WebResourceResponse response) { Map<String, String> headers = Collections.singletonMap("Cache-Control", "no-store"); response.setResponseHeaders(headers); } public void setOnPageFinishedListener(OnPageFinishedListener onPageFinishedListener) { this.onPageFinishedListener = onPageFinishedListener; } Loading @@ -132,49 +127,4 @@ abstract class K9WebViewClient extends WebViewClient { onPageFinishedListener.onPageFinished(); } } @SuppressWarnings("deprecation") private static class PreLollipopWebViewClient extends K9WebViewClient { protected PreLollipopWebViewClient(AttachmentResolver attachmentResolver) { super(attachmentResolver); } @Override public WebResourceResponse shouldInterceptRequest(WebView webView, String url) { return shouldInterceptRequest(webView, Uri.parse(url)); } @Override protected void addActivityFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); } @Override protected void addCacheControlHeader(WebResourceResponse response) { // Sadly, adding headers is not supported prior to Lollipop } } @TargetApi(VERSION_CODES.LOLLIPOP) private static class LollipopWebViewClient extends K9WebViewClient { protected LollipopWebViewClient(AttachmentResolver attachmentResolver) { super(attachmentResolver); } @Override public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest request) { return shouldInterceptRequest(webView, request.getUrl()); } @Override protected void addActivityFlags(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); } @Override protected void addCacheControlHeader(WebResourceResponse response) { Map<String, String> headers = Collections.singletonMap("Cache-Control", "no-store"); response.setResponseHeaders(headers); } } }