diff --git a/app/src/main/java/com/fongmi/bear/ApiConfig.java b/app/src/main/java/com/fongmi/bear/ApiConfig.java index 1bdfdba72..d698528d3 100644 --- a/app/src/main/java/com/fongmi/bear/ApiConfig.java +++ b/app/src/main/java/com/fongmi/bear/ApiConfig.java @@ -34,11 +34,12 @@ import okhttp3.Response; public class ApiConfig { - private final JarLoader jarLoader; + private final List ads; private final List flags; private final List parses; private final List lives; private final List sites; + private final JarLoader loader; private final Handler handler; private Parse parse; private Site home; @@ -52,19 +53,21 @@ public class ApiConfig { } public ApiConfig() { - this.sites = new ArrayList<>(); + this.ads = new ArrayList<>(); this.flags = new ArrayList<>(); this.parses = new ArrayList<>(); this.lives = new ArrayList<>(); - this.jarLoader = new JarLoader(); + this.sites = new ArrayList<>(); + this.loader = new JarLoader(); this.handler = new Handler(Looper.getMainLooper()); } - private void clear() { - this.sites.clear(); + public void clear() { + this.ads.clear(); this.flags.clear(); this.parses.clear(); this.lives.clear(); + this.sites.clear(); this.home = null; } @@ -77,7 +80,6 @@ public class ApiConfig { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { try { - clear(); JsonObject object = new Gson().fromJson(response.body().string(), JsonObject.class); String spider = Json.safeString(object, "spider", ""); parseJson(object); @@ -110,32 +112,31 @@ public class ApiConfig { if (site.getKey().equals(Prefers.getHome())) setHome(site); sites.add(site); } - if (home == null) { - setHome(sites.isEmpty() ? new Site() : sites.get(0)); - } + if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); flags.addAll(Json.safeList(object, "flags")); + ads.addAll(Json.safeList(object, "ads")); } private void loadJar(String spider) throws Exception { Request request = new Request.Builder().url(spider).build(); Response response = OKHttp.get().client().newCall(request).execute(); - jarLoader.load(response.body().bytes()); + loader.load(response.body().bytes()); } public Spider getCSP(Site site) { - return jarLoader.getSpider(site.getKey(), site.getApi(), site.getExt()); + return loader.getSpider(site.getKey(), site.getApi(), site.getExt()); } public Object[] proxyLocal(Map param) { - return jarLoader.proxyInvoke(param); + return loader.proxyInvoke(param); } public JSONObject jsonExt(String key, LinkedHashMap jxs, String url) { - return jarLoader.jsonExt(key, jxs, url); + return loader.jsonExt(key, jxs, url); } public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap> jxs, String url) { - return jarLoader.jsonExtMix(flag, key, name, jxs, url); + return loader.jsonExtMix(flag, key, name, jxs, url); } public Site getSite(String key) { @@ -147,6 +148,10 @@ public class ApiConfig { return sites; } + public String getAds() { + return ads.toString(); + } + public List getFlags() { return flags; } diff --git a/app/src/main/java/com/fongmi/bear/player/Player.java b/app/src/main/java/com/fongmi/bear/player/Player.java index 1a9624bf5..ec24b5e9a 100644 --- a/app/src/main/java/com/fongmi/bear/player/Player.java +++ b/app/src/main/java/com/fongmi/bear/player/Player.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.util.HashMap; +import java.util.Map; public class Player implements com.google.android.exoplayer2.Player.Listener { @@ -26,6 +27,7 @@ public class Player implements com.google.android.exoplayer2.Player.Listener { } public Player() { + webView = new CustomWebView(App.get()); exoPlayer = new ExoPlayer.Builder(App.get()).build(); exoPlayer.addListener(this); } @@ -57,17 +59,16 @@ public class Player implements com.google.android.exoplayer2.Player.Listener { private void loadWebView(String url) { activity.runOnUiThread(() -> { - if (webView != null) webView.destroy(); - webView = new CustomWebView(App.get()).init(); - webView.loadUrl(url); + webView.start(url); }); } - public void setMediaSource(HashMap headers, String url) { + public void setMediaSource(Map headers, String url) { activity.runOnUiThread(() -> { exoPlayer.setMediaSource(ExoUtil.getSource(headers, url)); exoPlayer.prepare(); exoPlayer.play(); + webView.stop(); }); } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java index 73b2686e8..64152b065 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java @@ -56,6 +56,7 @@ public class SettingActivity extends BaseActivity { Prefers.putUrl(bindingDialog.url.getText().toString().trim()); mBinding.url.setText(Prefers.getUrl()); Notify.progress(this); + ApiConfig.get().clear(); loadConfig(); }); bindingDialog.url.setOnEditorActionListener((textView, actionId, event) -> { @@ -75,6 +76,7 @@ public class SettingActivity extends BaseActivity { @Override public void error(int resId) { + mBinding.home.setText(ApiConfig.get().getHome().getName()); Notify.dismiss(); Notify.show(resId); } diff --git a/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java index e7fb794b0..438cef445 100644 --- a/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java @@ -3,8 +3,6 @@ package com.fongmi.bear.ui.custom; import android.annotation.SuppressLint; import android.content.Context; import android.net.http.SslError; -import android.os.Handler; -import android.os.Looper; import android.util.AttributeSet; import android.webkit.SslErrorHandler; import android.webkit.WebResourceRequest; @@ -16,16 +14,20 @@ import android.webkit.WebViewClient; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.fongmi.bear.ApiConfig; import com.fongmi.bear.player.Player; import com.fongmi.bear.utils.Utils; -import java.util.HashMap; -import java.util.Map; +import java.io.ByteArrayInputStream; public class CustomWebView extends WebView { + private WebResourceResponse empty; + private String ads; + public CustomWebView(@NonNull Context context) { super(context); + initSettings(); } public CustomWebView(@NonNull Context context, @Nullable AttributeSet attrs) { @@ -37,7 +39,9 @@ public class CustomWebView extends WebView { } @SuppressLint("SetJavaScriptEnabled") - public CustomWebView init() { + public void initSettings() { + this.ads = ApiConfig.get().getAds(); + this.empty = new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())); getSettings().setUseWideViewPort(true); getSettings().setDatabaseEnabled(true); getSettings().setDomStorageEnabled(true); @@ -45,13 +49,28 @@ public class CustomWebView extends WebView { getSettings().setBlockNetworkImage(true); getSettings().setLoadWithOverviewMode(true); getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); + getSettings().setJavaScriptCanOpenWindowsAutomatically(false); getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); setWebViewClient(webViewClient()); - return this; + } + + public void start(String url) { + stopLoading(); + loadUrl(url); } private WebViewClient webViewClient() { return new WebViewClient() { + @Nullable + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { + String url = request.getUrl().toString(); + String host = request.getUrl().getHost(); + if (ads.contains(host)) return empty; + if (Utils.isVideoFormat(url)) Player.get().setMediaSource(request.getRequestHeaders(), url); + return super.shouldInterceptRequest(view, request); + } + @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); @@ -61,29 +80,11 @@ public class CustomWebView extends WebView { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } - - @Nullable - @Override - public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - String url = request.getUrl().toString(); - HashMap headers = new HashMap<>(); - Map hds = request.getRequestHeaders(); - for (String k : hds.keySet()) { - if (k.equalsIgnoreCase("user-agent") || k.equalsIgnoreCase("referer") || k.equalsIgnoreCase("origin")) { - headers.put(k, hds.get(k)); - } - } - if (Utils.isVideoFormat(url)) { - if (headers.isEmpty()) { - new Handler(Looper.getMainLooper()).post(() -> destroy()); - Player.get().setMediaSource(headers, url); - } else { - new Handler(Looper.getMainLooper()).post(() -> destroy()); - Player.get().setMediaSource(new HashMap<>(), url); - } - } - return super.shouldInterceptRequest(view, request); - } }; } + + public void stop() { + stopLoading(); + loadUrl("about:blank"); + } }