From 8e9950a1111c752b33dffb162dae3080ed4ec06f Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sat, 18 Sep 2021 15:09:41 +0800 Subject: [PATCH] [core] Inject back into shell and use okhttp to load image (#1130) * Use okhttp to intercept webview request * Inject back into shell again * Clean code * Fix mime --- .../manager/ui/fragment/RepoItemFragment.java | 32 +++++++++++++++++++ core/build.gradle.kts | 4 +-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java index 478c8442..d3d311b0 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java @@ -31,6 +31,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -72,6 +73,9 @@ import java.util.List; import java.util.ListIterator; import java.util.stream.IntStream; +import okhttp3.Headers; +import okhttp3.Request; +import okhttp3.Response; import rikka.core.util.ResourceUtils; import rikka.recyclerview.RecyclerViewKt; import rikka.widget.borderview.BorderNestedScrollView; @@ -161,6 +165,34 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene NavUtil.startURL(requireActivity(), request.getUrl()); return true; } + + @Nullable + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { + if (!request.getUrl().getScheme().startsWith("http")) return null; + var client = App.getOkHttpClient(); + var call = client.newCall( + new Request.Builder() + .url(request.getUrl().toString()) + .method(request.getMethod(), null) + .headers(Headers.of(request.getRequestHeaders())) + .build()); + try { + Response reply = call.execute(); + var contentTypes = reply.header("content-type", "image/*;charset=utf-8").split(";\\s*"); + var mimeType = contentTypes.length > 0 ? contentTypes[0] : "image/*"; + var charset = contentTypes.length > 1 ? contentTypes[1].split("=\\s*")[1] : "utf-8"; + Log.e(App.TAG, "type " + mimeType); + Log.e(App.TAG, "charset " + charset); + return new WebResourceResponse( + mimeType, + charset, + reply.body().byteStream() + ); + } catch (Throwable e) { + return null; + } + } }); view.loadDataWithBaseURL("https://github.com", body, "text/html", StandardCharsets.UTF_8.name(), null); diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 8034360c..b30d68fa 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -107,8 +107,8 @@ android { "DEFAULT_MANAGER_PACKAGE_NAME", """"$defaultManagerPackageName"""" ) - buildConfigField("String", "MANAGER_INJECTED_PKG_NAME", """"com.android.settings"""") - buildConfigField("int", "MANAGER_INJECTED_UID", """1000""") + buildConfigField("String", "MANAGER_INJECTED_PKG_NAME", """"com.android.shell"""") + buildConfigField("int", "MANAGER_INJECTED_UID", """2000""") } lint {