package io.github.mthli.Ninja.Browser;
import android.content.Context;
import android.content.res.AssetManager;
import io.github.mthli.Ninja.Database.RecordAction;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
public class AdBlock {
private static final String FILE = "hosts.txt";
private static final Set<String> hosts = new HashSet<>();
private static final List<String> whitelist = new ArrayList<>();
private static final Locale locale = Locale.getDefault();
private static void loadHosts(final Context context) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
AssetManager manager = context.getAssets();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(manager.open(FILE)));
String line;
while ((line = reader.readLine()) != null) {
hosts.add(line.toLowerCase(locale));
}
} catch (IOException i) {}
}
});
thread.start();
}
private synchronized static void loadDomains(Context context) {
RecordAction action = new RecordAction(context);
action.open(false);
whitelist.clear();
for (String domain : action.listDomains()) {
whitelist.add(domain);
}
action.close();
}
private static String getDomain(String url) throws URISyntaxException {
url = url.toLowerCase(locale);
int index = url.indexOf('/', 8); // -> http://(7) and https://(8)
if (index != -1) {
url = url.substring(0, index);
}
URI uri = new URI(url);
String domain = uri.getHost();
if (domain == null) {
return url;
}
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
private Context context;
public AdBlock(Context context) {
this.context = context;
if (hosts.isEmpty()) {
loadHosts(context);
}
loadDomains(context);
}
public boolean isWhite(String url) {
for (String domain : whitelist) {
if (url.contains(domain)) {
return true;
}
}
return false;
}
public boolean isAd(String url) {
String domain;
try {
domain = getDomain(url);
} catch (URISyntaxException u) {
return false;
}
return hosts.contains(domain.toLowerCase(locale));
}
public synchronized void addDomain(String domain) {
RecordAction action = new RecordAction(context);
action.open(true);
action.addDomain(domain);
action.close();
whitelist.add(domain);
}
public synchronized void removeDomain(String domain) {
RecordAction action = new RecordAction(context);
action.open(true);
action.deleteDomain(domain);
action.close();
whitelist.remove(domain);
}
public synchronized void clearDomains() {
RecordAction action = new RecordAction(context);
action.open(true);
action.clearDomains();
action.close();
whitelist.clear();
}
}