2018-03-12 00:05:53 +01:00
|
|
|
/*#######################################################
|
|
|
|
*
|
|
|
|
* Maintained by Gregor Santner, 2017-
|
|
|
|
* https://gsantner.net/
|
|
|
|
*
|
|
|
|
* License: Apache 2.0
|
|
|
|
* https://github.com/gsantner/opoc/#licensing
|
|
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
2017-06-08 02:33:00 +02:00
|
|
|
*
|
2018-03-12 00:05:53 +01:00
|
|
|
#########################################################*/
|
2017-06-08 02:33:00 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Place adblock hosts file in raw: src/main/res/raw/adblock_domains__xyz.txt
|
|
|
|
* Always blocks both, www and non www
|
|
|
|
|
|
|
|
* Load hosts (call e.g. via Application-Object)
|
|
|
|
AdBlock.getInstance().loadHostsFromRawAssetsAsync(context);
|
|
|
|
|
|
|
|
* Override inside a WebViewClient:
|
|
|
|
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
|
|
|
|
return AdBlock.getInstance().isAdHost(url)
|
|
|
|
? AdBlock.createEmptyResponse()
|
|
|
|
: super.shouldInterceptRequest(view, url);
|
|
|
|
}
|
|
|
|
*/
|
2017-09-09 17:09:04 +02:00
|
|
|
package net.gsantner.opoc.util;
|
2017-06-08 02:33:00 +02:00
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.util.Log;
|
|
|
|
import android.webkit.WebResourceResponse;
|
|
|
|
|
2017-06-10 13:01:57 +02:00
|
|
|
import com.github.dfa.diaspora_android.R;
|
|
|
|
|
2017-06-08 02:33:00 +02:00
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import java.net.URI;
|
|
|
|
import java.net.URISyntaxException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Simple Host-Based AdBlocker
|
|
|
|
*/
|
2021-01-12 20:23:10 +01:00
|
|
|
@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused", "TryFinallyCanBeTryWithResources"})
|
2017-06-08 02:33:00 +02:00
|
|
|
public class AdBlock {
|
2021-01-12 20:23:10 +01:00
|
|
|
private static final Object synchronizeObj = new Object();
|
2017-06-08 02:33:00 +02:00
|
|
|
private static final AdBlock instance = new AdBlock();
|
|
|
|
|
|
|
|
public static AdBlock getInstance() {
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
//########################
|
|
|
|
//##
|
|
|
|
//## Members
|
|
|
|
//##
|
|
|
|
//########################
|
2017-09-09 17:09:04 +02:00
|
|
|
private final Set<String> _adblockHostsFromRaw = new HashSet<>();
|
|
|
|
private final Set<String> _adblockHosts = new HashSet<>();
|
2021-01-12 20:23:10 +01:00
|
|
|
private final List<Callback.b3<URI, String, String>> _customBlockCallbacks = new ArrayList<>();
|
|
|
|
private boolean _isLoaded = false;
|
|
|
|
private boolean _isAdblockLogging = false;
|
2017-06-08 02:33:00 +02:00
|
|
|
|
|
|
|
//########################
|
|
|
|
//##
|
|
|
|
//## Methods
|
|
|
|
//##
|
|
|
|
//########################
|
|
|
|
private AdBlock() {
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isAdHost(String urlS) {
|
2021-01-12 20:23:10 +01:00
|
|
|
boolean block = false;
|
2017-06-08 02:33:00 +02:00
|
|
|
if (urlS != null && !urlS.isEmpty() && urlS.startsWith("http")) {
|
|
|
|
try {
|
2021-01-12 20:23:10 +01:00
|
|
|
URI url;
|
|
|
|
try {
|
|
|
|
url = new URI(urlS);
|
|
|
|
} catch (Exception e) {
|
|
|
|
url = new URI(urlS.replaceFirst("[?].*", ""));
|
|
|
|
}
|
2017-06-08 02:33:00 +02:00
|
|
|
String host = url.getHost().trim();
|
|
|
|
if (host.startsWith("www.") && host.length() >= 4) {
|
|
|
|
host = host.substring(4);
|
|
|
|
}
|
2021-01-12 20:23:10 +01:00
|
|
|
block = _adblockHosts.contains(host) || _adblockHosts.contains("www." + host);
|
|
|
|
for (Callback.b3<URI, String, String> cb : _customBlockCallbacks) {
|
|
|
|
if (block) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
block = cb.callback(url, urlS, host);
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
}
|
|
|
|
}
|
2017-06-08 02:33:00 +02:00
|
|
|
} catch (URISyntaxException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2021-01-12 20:23:10 +01:00
|
|
|
|
|
|
|
if (_isAdblockLogging) {
|
|
|
|
Log.d(getClass().getSimpleName(), "UrlAllowed-" + (block ? "N" : "Y") + " " + urlS);
|
|
|
|
}
|
|
|
|
return block;
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public AdBlock reset() {
|
2021-01-12 20:23:10 +01:00
|
|
|
synchronized (synchronizeObj) {
|
|
|
|
_adblockHosts.clear();
|
|
|
|
_adblockHosts.addAll(_adblockHostsFromRaw);
|
|
|
|
_customBlockCallbacks.clear();
|
|
|
|
}
|
2017-06-08 02:33:00 +02:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2017-09-09 17:09:04 +02:00
|
|
|
public boolean isLoaded() {
|
|
|
|
return _isLoaded;
|
|
|
|
}
|
|
|
|
|
2017-06-08 02:33:00 +02:00
|
|
|
public static WebResourceResponse createEmptyResponse() {
|
|
|
|
return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
|
|
|
|
}
|
|
|
|
|
2021-01-12 20:23:10 +01:00
|
|
|
public AdBlock addBlockedHosts(String... hosts) {
|
2017-06-08 02:33:00 +02:00
|
|
|
for (String host : hosts) {
|
|
|
|
if (host != null) {
|
|
|
|
host = host.trim();
|
|
|
|
if (host.startsWith("www.") && host.length() >= 4) {
|
|
|
|
host = host.substring(4);
|
|
|
|
}
|
|
|
|
if (!host.startsWith("#") && !host.startsWith("\"")) {
|
2021-01-12 20:23:10 +01:00
|
|
|
synchronized (synchronizeObj) {
|
|
|
|
_adblockHosts.add(host);
|
|
|
|
}
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-12 20:23:10 +01:00
|
|
|
return this;
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
|
2021-01-12 20:23:10 +01:00
|
|
|
public void loadHostsFromRawAssetsAsync(final Context context, final boolean... debugIgnoreAssets) {
|
|
|
|
if (debugIgnoreAssets != null && debugIgnoreAssets.length > 0 && debugIgnoreAssets[0]) {
|
|
|
|
_isLoaded = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
new Thread(() -> {
|
|
|
|
try {
|
|
|
|
synchronized (synchronizeObj) {
|
2017-06-08 02:33:00 +02:00
|
|
|
loadHostsFromRawAssets(context);
|
2017-09-09 17:09:04 +02:00
|
|
|
_isLoaded = true;
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
2021-01-12 20:23:10 +01:00
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
}).start();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void loadHostsFromRawAssets(Context context) throws IOException {
|
|
|
|
BufferedReader br = null;
|
|
|
|
String host;
|
|
|
|
|
2017-09-09 17:09:04 +02:00
|
|
|
_adblockHosts.clear();
|
2017-06-08 02:33:00 +02:00
|
|
|
for (int rawId : getAdblockIdsInRaw()) {
|
|
|
|
try {
|
|
|
|
br = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(rawId)));
|
|
|
|
while ((host = br.readLine()) != null) {
|
|
|
|
addBlockedHosts(host);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
Log.d(AdBlock.class.getName(), "Error: Cannot read adblock res " + rawId);
|
|
|
|
} finally {
|
|
|
|
if (br != null) {
|
|
|
|
try {
|
|
|
|
br.close();
|
|
|
|
} catch (IOException ignored) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-09 17:09:04 +02:00
|
|
|
_adblockHostsFromRaw.clear();
|
|
|
|
_adblockHostsFromRaw.addAll(_adblockHosts);
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private List<Integer> getAdblockIdsInRaw() {
|
|
|
|
ArrayList<Integer> adblockResIds = new ArrayList<>();
|
|
|
|
Field[] fields = R.raw.class.getFields();
|
|
|
|
for (Field field : fields) {
|
|
|
|
try {
|
|
|
|
int resId = field.getInt(field);
|
|
|
|
String resFilename = field.getName();
|
|
|
|
if (resFilename.startsWith("adblock_domains__")) {
|
|
|
|
adblockResIds.add(resId);
|
|
|
|
}
|
2017-08-04 05:42:43 +02:00
|
|
|
} catch (IllegalAccessException | IllegalArgumentException ignored) {
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return adblockResIds;
|
|
|
|
}
|
2021-01-12 20:23:10 +01:00
|
|
|
|
|
|
|
// URI uri, String url, String host
|
|
|
|
public AdBlock addCustomBlockCallback(Callback.b3<URI, String, String> cb) {
|
|
|
|
synchronized (synchronizeObj) {
|
|
|
|
_customBlockCallbacks.add(cb);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public AdBlock setLogEnabled(boolean isAdblockLogging) {
|
|
|
|
_isAdblockLogging = isAdblockLogging;
|
|
|
|
return this;
|
|
|
|
}
|
2017-06-08 02:33:00 +02:00
|
|
|
}
|