|
6 | 6 | import android.app.AlertDialog; |
7 | 7 | import android.app.DownloadManager; |
8 | 8 | import android.content.Context; |
| 9 | +import android.content.Intent; |
9 | 10 | import android.content.pm.ActivityInfo; |
| 11 | +import android.content.pm.PackageManager; |
10 | 12 | import android.net.Uri; |
| 13 | +import android.net.http.SslError; |
11 | 14 | import android.os.Build; |
12 | 15 | import android.os.Bundle; |
13 | 16 | import android.os.Environment; |
14 | 17 | import android.view.View; |
15 | 18 | import android.webkit.CookieManager; |
| 19 | +import android.webkit.SslErrorHandler; |
16 | 20 | import android.webkit.URLUtil; |
| 21 | +import android.webkit.ValueCallback; |
17 | 22 | import android.webkit.WebChromeClient; |
18 | 23 | import android.webkit.WebChromeClient.CustomViewCallback; |
| 24 | +import android.webkit.WebResourceResponse; |
19 | 25 | import android.webkit.WebSettings; |
| 26 | +import android.webkit.WebSettings.PluginState; |
20 | 27 | import android.webkit.WebView; |
21 | 28 | import android.webkit.WebViewClient; |
22 | 29 | import android.widget.FrameLayout; |
23 | 30 | import android.widget.ProgressBar; |
24 | 31 | import android.widget.Toast; |
25 | | -import android.content.pm.PackageManager; |
26 | | -import androidx.core.content.ContextCompat; |
27 | 32 |
|
28 | 33 | import androidx.annotation.RequiresApi; |
29 | 34 | import androidx.core.app.ActivityCompat; |
30 | | -import android.webkit.SslErrorHandler; |
31 | | -import android.net.http.SslError; |
32 | | -import android.webkit.WebSettings.PluginState; |
33 | | -import java.util.Objects; |
| 35 | +import androidx.core.content.ContextCompat; |
| 36 | + |
| 37 | +import java.io.BufferedReader; |
| 38 | +import java.io.ByteArrayInputStream; |
| 39 | +import java.io.IOException; |
| 40 | +import java.io.InputStream; |
| 41 | +import java.io.InputStreamReader; |
34 | 42 | import java.util.Arrays; |
35 | | -import android.content.Intent; |
36 | | -import android.webkit.ValueCallback; |
| 43 | +import java.util.HashSet; |
| 44 | +import java.util.Objects; |
| 45 | + |
| 46 | +class AdBlockerUtil { |
| 47 | + private final HashSet<String> adHosts = new HashSet<>(); |
| 48 | + |
| 49 | + private static AdBlockerUtil mInstance; |
| 50 | + |
| 51 | + public static AdBlockerUtil getInstance() { |
| 52 | + if (mInstance == null) { |
| 53 | + mInstance = new AdBlockerUtil(); |
| 54 | + } |
| 55 | + return mInstance; |
| 56 | + } |
| 57 | + |
| 58 | + public void initialize(Context context) { |
| 59 | + try { |
| 60 | + InputStream inputStream = context.getAssets().open("adblock.txt"); |
| 61 | + loadHostsFromInputStream(inputStream); |
| 62 | + } catch (IOException e) { |
| 63 | + e.printStackTrace(); |
| 64 | + } |
| 65 | + } |
| 66 | + |
| 67 | + public boolean isAd(String url) { |
| 68 | + if (url == null) { |
| 69 | + return false; |
| 70 | + } |
| 71 | + |
| 72 | + String requestHost = Uri.parse(url).getHost(); |
| 73 | + |
| 74 | + if (requestHost == null) { |
| 75 | + return false; |
| 76 | + } |
| 77 | + |
| 78 | + if (adHosts.contains(requestHost)) { |
| 79 | + return true; |
| 80 | + } |
| 81 | + |
| 82 | + String[] subDomains = requestHost.split("\\."); |
| 83 | + |
| 84 | + for (int i = subDomains.length - 1; i >= 0; i--) { |
| 85 | + String domain = String.join(".", Arrays.copyOfRange(subDomains, i, subDomains.length)); |
| 86 | + |
| 87 | + if (adHosts.contains(domain)) { |
| 88 | + return true; |
| 89 | + } |
| 90 | + } |
| 91 | + |
| 92 | + return false; |
| 93 | + } |
| 94 | + |
| 95 | + private void loadHostsFromInputStream(InputStream inputStream) { |
| 96 | + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { |
| 97 | + String line; |
| 98 | + while ((line = reader.readLine()) != null) { |
| 99 | + adHosts.add(line); |
| 100 | + } |
| 101 | + } catch (Exception e) { |
| 102 | + e.printStackTrace(); |
| 103 | + } |
| 104 | + } |
| 105 | +} |
37 | 106 |
|
38 | 107 | public class MainActivity extends Activity { |
39 | 108 | private final int STORAGE_PERMISSION_CODE = 1; |
40 | | - private static final String[] ALLOWED_DOMAINS = BuildConfig.ALLOWED_DOMAINS.split("\\,"); |
| 109 | + private static final String[] ALLOWED_DOMAINS = BuildConfig.ALLOWED_DOMAINS.split(","); |
41 | 110 | private static final String STARTUP_URL = BuildConfig.STARTUP_URL; |
42 | 111 | private static final boolean BLOCK_MEDIA = BuildConfig.BLOCK_MEDIA; |
| 112 | + private static final boolean BLOCK_ADS = BuildConfig.BLOCK_ADS; |
43 | 113 | private static final String VIEW_MODE = BuildConfig.VIEW_MODE; |
44 | 114 | private WebView mWebView; |
45 | 115 | private View mCustomView; |
@@ -85,7 +155,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent) |
85 | 155 | @SuppressLint("SetJavaScriptEnabled") |
86 | 156 | protected void onCreate(Bundle savedInstanceState) { |
87 | 157 | super.onCreate(savedInstanceState); |
88 | | - |
| 158 | + AdBlockerUtil adBlockerUtil = AdBlockerUtil.getInstance(); |
| 159 | + adBlockerUtil.initialize(this); |
89 | 160 | if (VIEW_MODE == "PORTRAIT") { |
90 | 161 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); |
91 | 162 | } else if (VIEW_MODE == "LANDSCAPE") { |
@@ -225,6 +296,16 @@ public boolean shouldOverrideUrlLoading(final WebView view, final String url) { |
225 | 296 | } |
226 | 297 | } |
227 | 298 |
|
| 299 | + @Override |
| 300 | + public WebResourceResponse shouldInterceptRequest(WebView view, String url) { |
| 301 | + if (BLOCK_ADS && AdBlockerUtil.getInstance().isAd(url)) { |
| 302 | + WebResourceResponse emptyResponse = new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())); |
| 303 | + return emptyResponse; |
| 304 | + } else { |
| 305 | + return super.shouldInterceptRequest(view, url); |
| 306 | + } |
| 307 | + } |
| 308 | + |
228 | 309 | @Override |
229 | 310 | public void onPageFinished(WebView view, String url) { |
230 | 311 | super.onPageFinished(view, url); |
|
0 commit comments