From f7e08577f4dc69ceddf1bebb4d095ddb0881022b Mon Sep 17 00:00:00 2001 From: Kaustubh Patange Date: Sat, 26 Dec 2020 22:35:56 +0530 Subject: [PATCH] [Fixed] #1266, #2926 --- .../provider/markdown/MarkDownProvider.java | 30 +++++++++--- .../prettifier/pretty/PrettifyWebView.java | 48 ++++++++++++++----- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java index b98e6e44a..8f78d3c72 100644 --- a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java +++ b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java @@ -1,13 +1,15 @@ package com.fastaccess.provider.markdown; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import android.net.Uri; import android.text.Html; import android.view.ViewTreeObserver; import android.webkit.MimeTypeMap; import android.widget.EditText; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.annimon.stream.IntStream; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; @@ -45,7 +47,8 @@ public class MarkDownProvider { ".dmg", ".pdf", ".ico", ".docx", ".doc", ".xlsx", ".hwp", ".pptx", ".show", ".mp3", ".ogg", ".ipynb" }; - private MarkDownProvider() {} + private MarkDownProvider() { + } public static void setMdText(@NonNull TextView textView, String markdown) { if (!InputHelper.isEmpty(markdown)) { @@ -54,7 +57,8 @@ public static void setMdText(@NonNull TextView textView, String markdown) { render(textView, markdown, width); } else { textView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override public boolean onPreDraw() { + @Override + public boolean onPreDraw() { textView.getViewTreeObserver().removeOnPreDrawListener(this); render(textView, markdown, textView.getMeasuredWidth()); return true; @@ -103,7 +107,8 @@ public static void stripMdText(@NonNull TextView textView, String markdown) { } } - @NonNull public static String stripMdText(String markdown) { + @NonNull + public static String stripMdText(String markdown) { if (!InputHelper.isEmpty(markdown)) { Parser parser = Parser.builder().build(); Node node = parser.parse(markdown); @@ -292,7 +297,8 @@ public static boolean isImage(@Nullable String name) { name = name.toLowerCase(); for (String value : IMAGE_EXTENSIONS) { String extension = MimeTypeMap.getFileExtensionFromUrl(name); - if ((extension != null && value.replace(".", "").equals(extension)) || name.endsWith(value)) return true; + if ((extension != null && value.replace(".", "").equals(extension)) || name.endsWith(value)) + return true; } return false; } @@ -314,7 +320,8 @@ public static boolean isArchive(@Nullable String name) { name = name.toLowerCase(); for (String value : ARCHIVE_EXTENSIONS) { String extension = MimeTypeMap.getFileExtensionFromUrl(name); - if ((extension != null && value.replace(".", "").equals(extension)) || name.endsWith(value)) return true; + if ((extension != null && value.replace(".", "").equals(extension)) || name.endsWith(value)) + return true; } return false; @@ -336,4 +343,13 @@ public static void insertAtCursor(@NonNull EditText editText, @NonNull String te editText.setSelection(index + text.length()); } } + + public static boolean isGithubBlobImage(@NonNull Uri uri) { + return uri.getAuthority().equals("github.com"); + } + + public static String minifyGithubImageUri(@NonNull Uri uri) { + return uri.buildUpon().authority("raw.githubusercontent.com") + .build().toString().replace("/blob/", "/"); + } } diff --git a/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java b/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java index d7a8451fc..086d3925b 100644 --- a/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java +++ b/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java @@ -5,8 +5,6 @@ import android.content.res.TypedArray; import android.net.Uri; import android.os.Build; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -16,6 +14,9 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.fastaccess.R; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.InputHelper; @@ -56,18 +57,22 @@ public PrettifyWebView(Context context, AttributeSet attrs, int defStyleAttr) { initView(attrs); } - @Override public boolean onInterceptTouchEvent(MotionEvent p) { + @Override + public boolean onInterceptTouchEvent(MotionEvent p) { return true; } - @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { if (getParent() != null) { getParent().requestDisallowInterceptTouchEvent(interceptTouch); } return super.onTouchEvent(event); } - @SuppressLint("SetJavaScriptEnabled") private void initView(@Nullable AttributeSet attrs) { + @SuppressLint("SetJavaScriptEnabled") + private void initView(@Nullable AttributeSet attrs) { if (isInEditMode()) return; if (attrs != null) { TypedArray tp = getContext().obtainStyledAttributes(attrs, R.styleable.PrettifyWebView); @@ -102,14 +107,16 @@ public PrettifyWebView(Context context, AttributeSet attrs, int defStyleAttr) { }); } - @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (onContentChangedListener != null) { onContentChangedListener.onScrollChanged(t == 0, t); } } - @Override protected void onDetachedFromWindow() { + @Override + protected void onDetachedFromWindow() { onContentChangedListener = null; super.onDetachedFromWindow(); } @@ -171,7 +178,8 @@ public static String[] getLineNo(@Nullable String url) { if (lineNumber != null) { lineNo = lineNumber.replaceAll("L", "").split("-"); } - } catch (Exception ignored) {} + } catch (Exception ignored) { + } } return lineNo; } @@ -195,7 +203,8 @@ public void setWikiContent(@NonNull String source, @Nullable String baseUrl) { } public void setGithubContent(@NonNull String source, @Nullable String baseUrl, boolean toggleNestScrolling, boolean enableBridge) { - if (enableBridge) addJavascriptInterface(new MarkDownInterceptorInterface(this, toggleNestScrolling), "Android"); + if (enableBridge) + addJavascriptInterface(new MarkDownInterceptorInterface(this, toggleNestScrolling), "Android"); String page = GithubHelper.generateContent(getContext(), source, baseUrl, AppHelper.isNightMode(getResources()), AppHelper.isNightMode(getResources()), false); post(() -> loadDataWithBaseURL("file:///android_asset/md/", page, "text/html", "utf-8", null)); @@ -233,7 +242,12 @@ public void setEnableNestedScrolling(boolean enableNestedScrolling) { private void startActivity(@Nullable Uri url) { if (url == null) return; if (MarkDownProvider.isImage(url.toString())) { - CodeViewerActivity.startActivity(getContext(), url.toString(), url.toString()); + if (MarkDownProvider.isGithubBlobImage(url)) { + String minifiedUrl = MarkDownProvider.minifyGithubImageUri(url); + launchCodeViewerActivity(minifiedUrl); + } else { + launchCodeViewerActivity(url.toString()); + } } else { String lastSegment = url.getEncodedFragment(); if (lastSegment != null || url.toString().startsWith("#") || url.toString().indexOf('#') != -1) { @@ -243,8 +257,13 @@ private void startActivity(@Nullable Uri url) { } } + private void launchCodeViewerActivity(String url) { + CodeViewerActivity.startActivity(getContext(), url, url); + } + private class ChromeClient extends WebChromeClient { - @Override public void onProgressChanged(WebView view, int progress) { + @Override + public void onProgressChanged(WebView view, int progress) { super.onProgressChanged(view, progress); if (onContentChangedListener != null) { onContentChangedListener.onContentChanged(progress); @@ -253,14 +272,17 @@ private class ChromeClient extends WebChromeClient { } private class WebClient extends WebViewClient { - @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { startActivity(request.getUrl()); return true; } } private class WebClientCompat extends WebViewClient { - @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { + @SuppressWarnings("deprecation") + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { startActivity(Uri.parse(url)); return true; }