+ Log.i("BlockLists", "Begin populating block lists.");
+
+ // Initialize the block lists.
+ List<String> mainWhiteList = new LinkedList<>();
+ List<String[]> multiEntryWhiteList = new LinkedList<>();
+ List<String> mainBlockList = new LinkedList<>();
+ List<String> initialBlockList = new LinkedList<>();
+ List<String> finalBlockList = new LinkedList<>();
+ List<String[]> multiEntryBlockList = new LinkedList<>();
+ List<String[]> multiEntryInitialBlockList = new LinkedList<>();
+ List<String[]> multiEntryFinalBlockList = new LinkedList<>();
+ List<String[]> domainBlockList = new LinkedList<>();
+ List<String[]> domainInitialBlockList = new LinkedList<>();
+ List<String[]> domainFinalBlockList = new LinkedList<>();
+ List<String[]> domainMultiEntryBlockList = new LinkedList<>();
+ List<String[]> domainRegularExpressionBlockList = new LinkedList<>();
+ List<String> regularExpressionBlockList = new LinkedList<>();
+
+ // Populate the block lists.
+ try {
+ // Load `easylist.txt` into a `BufferedReader`.
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getAssets().open("easylist.txt")));
+
+ // Create a string for storing the block list entries.
+ String blockListEntry;
+
+ // Parse EasyList.
+ while ((blockListEntry = bufferedReader.readLine()) != null) {
+ //noinspection StatementWithEmptyBody
+ if (blockListEntry.contains("##") || blockListEntry.contains("#?#") || blockListEntry.contains("#@#") || blockListEntry.startsWith("[")) {
+ // Entries that contain `##`, `#?#`, and `#@#` are for hiding elements in the main page's HTML. Entries that start with `[` describe the AdBlock compatibility level.
+
+ // Do nothing. Privacy Browser does not currently use these entries.
+
+ //Log.i("BlackLists", "Not added: " + adBlockerEntry);
+ } else if (blockListEntry.startsWith("!")){ // Entries that begin with `!` are comments.
+ if (blockListEntry.startsWith("! Version:")) {
+ // Store the EasyList version number.
+ easyListVersion = blockListEntry.substring(11);
+ }
+
+ //Log.i("BlackLists", "Not added: " + adBlockerEntry);
+ } else if (blockListEntry.startsWith("@@")) { // Entries that begin with `@@` are excludes (whitelists).
+ // mainWhiteList.add(blockListEntry.substring(2));
+
+ //Log.i("BlockLists", "Main white list added: " + blockListEntry.substring(2, blockListEntry.length()));
+ } else if (blockListEntry.endsWith("|")){ // Entries that end with `|` match against the end of the URL.
+ // Strip out the final "|"
+ blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+
+ // Strip out any initial `||`. They are redundant in this case because the block list entry is being matched against the end of the URL.
+ if (blockListEntry.startsWith("||")) {
+ blockListEntry = blockListEntry.substring(2);
+ }
+
+ if (blockListEntry.contains("*")) {
+ int wildcardIndex = blockListEntry.indexOf("*");
+
+ String firstEntry = blockListEntry.substring(0, wildcardIndex);
+ String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+ if (firstEntry.endsWith("^")) {
+ String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+ String firstEntry1 = firstEntryBase + ":";
+ String firstEntry2 = firstEntryBase + "/";
+ String firstEntry3 = firstEntryBase + "?";
+ String firstEntry4 = firstEntryBase + "=";
+ String firstEntry5 = firstEntryBase + "&";
+
+ String[] doubleEntry1 = {firstEntry1, secondEntry};
+ String[] doubleEntry2 = {firstEntry2, secondEntry};
+ String[] doubleEntry3 = {firstEntry3, secondEntry};
+ String[] doubleEntry4 = {firstEntry4, secondEntry};
+ String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+ multiEntryFinalBlockList.add(doubleEntry1);
+ multiEntryFinalBlockList.add(doubleEntry2);
+ multiEntryFinalBlockList.add(doubleEntry3);
+ multiEntryFinalBlockList.add(doubleEntry4);
+ multiEntryFinalBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry5 + " , " + secondEntry);
+ } else {
+ String[] doubleEntry = {firstEntry, secondEntry};
+
+ multiEntryFinalBlockList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntry);
+ }
+ } else {
+ finalBlockList.add(blockListEntry);
+
+ //Log.i("BlockLists", "Final block list added: " + blockListEntry);
+ }
+ } else if (blockListEntry.contains("$")) { // Entries that contain `$` use filter options.
+ // Strip out any initial `||`. These will be treated like any other entry.
+ if (blockListEntry.startsWith("||")) {
+ blockListEntry = blockListEntry.substring(2);
+ }
+
+ if (blockListEntry.contains("third-party")) {
+ // Log.i("BlockLists", "Not added: " + blockListEntry);
+ } else if (blockListEntry.substring(blockListEntry.indexOf("$")).contains("domain")) {
+ if (blockListEntry.contains("~")) { // Whitelist.
+
+ } else {
+ // Separate the filters.
+ String entry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+ String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1);
+ String domains = filters.substring(filters.indexOf("domain=") + 7);
+
+ // Only process the block list item if the entry is not null. Some lines in EasyList begin with `$websocket`, which create a null entry.
+ if (!entry.equals("")) {
+ do {
+ String domain;
+
+ if (domains.contains("|")) {
+ // Get the first domain.
+ domain = domains.substring(0, domains.indexOf("|"));
+
+ // Remove the first domain from the list.
+ domains = domains.substring(domains.indexOf("|") + 1);
+ } else {
+ domain = domains;
+ }
+
+ if (entry.contains("*")) {
+ int wildcardIndex = entry.indexOf("*");
+
+ String firstEntry = entry.substring(0, wildcardIndex);
+ String secondEntry = entry.substring(wildcardIndex + 1);
+
+ if (firstEntry.endsWith("^")) {
+ String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+ String firstEntry1 = firstEntryBase + ":";
+ String firstEntry2 = firstEntryBase + "/";
+ String firstEntry3 = firstEntryBase + "?";
+ String firstEntry4 = firstEntryBase + "=";
+ String firstEntry5 = firstEntryBase + "&";
+
+ String[] domainDoubleEntry1 = {domain, firstEntry1, secondEntry};
+ String[] domainDoubleEntry2 = {domain, firstEntry2, secondEntry};
+ String[] domainDoubleEntry3 = {domain, firstEntry3, secondEntry};
+ String[] domainDoubleEntry4 = {domain, firstEntry4, secondEntry};
+ String[] domainDoubleEntry5 = {domain, firstEntry5, secondEntry};
+
+ domainMultiEntryBlockList.add(domainDoubleEntry1);
+ domainMultiEntryBlockList.add(domainDoubleEntry2);
+ domainMultiEntryBlockList.add(domainDoubleEntry3);
+ domainMultiEntryBlockList.add(domainDoubleEntry4);
+ domainMultiEntryBlockList.add(domainDoubleEntry5);
+
+ //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Domain ^ double entry block list added: " + domain + " , " + firstEntry5 + " , " + secondEntry);
+ } else {
+ String[] domainDoubleEntry = {domain, firstEntry, secondEntry};
+
+ domainMultiEntryBlockList.add(domainDoubleEntry);
+
+ //Log.i("BlockLists", "Domain double entry block list added: " + domain + " , " + firstEntry + " , " + secondEntry);
+ }
+ } else if (entry.endsWith("^")) {
+ String entryBase = entry.substring(0, entry.length() - 1);
+
+ String entry1 = entryBase + ":";
+ String entry2 = entryBase + "/";
+ String entry3 = entryBase + "?";
+ String entry4 = entryBase + "=";
+ String entry5 = entryBase + "&";
+
+ String[] domainEntry1 = {domain, entry1};
+ String[] domainEntry2 = {domain, entry2};
+ String[] domainEntry3 = {domain, entry3};
+ String[] domainEntry4 = {domain, entry4};
+ String[] domainEntry5 = {domain, entry5};
+
+ domainBlockList.add(domainEntry1);
+ domainBlockList.add(domainEntry2);
+ domainBlockList.add(domainEntry3);
+ domainBlockList.add(domainEntry4);
+ domainBlockList.add(domainEntry5);
+
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry1);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry2);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry3);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry4);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry5);
+ } else if (entry.startsWith("^")) {
+ String entryBase = entry.substring(1);
+
+ String entry1 = ":" + entryBase;
+ String entry2 = ":" + entryBase;
+ String entry3 = ":" + entryBase;
+ String entry4 = ":" + entryBase;
+ String entry5 = ":" + entryBase;
+
+ String[] domainEntry1 = {domain, entry1};
+ String[] domainEntry2 = {domain, entry2};
+ String[] domainEntry3 = {domain, entry3};
+ String[] domainEntry4 = {domain, entry4};
+ String[] domainEntry5 = {domain, entry5};
+
+ domainBlockList.add(domainEntry1);
+ domainBlockList.add(domainEntry2);
+ domainBlockList.add(domainEntry3);
+ domainBlockList.add(domainEntry4);
+ domainBlockList.add(domainEntry5);
+
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry1);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry2);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry3);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry4);
+ //Log.i("BlockLists", "Domain ^ block list added: " + domain + " , " + entry5);
+ } else if (entry.startsWith("|")) {
+ // Remove the initial `|`;
+ String entryBase = entry.substring(1);
+
+ //noinspection StatementWithEmptyBody
+ if (entryBase.equals("http://") || entryBase.equals("https://")) {
+ // Do nothing. These entries will entirely block the website.
+ // Often the original entry blocks `$script` but Privacy Browser does not currently differentiate between scripts and other entries.
+ } else {
+ String[] domainEntry = {domain, entryBase};
+
+ domainInitialBlockList.add(domainEntry);
+
+ //Log.i("BlockLists", "Domain initial block list added: " + domain + " , " + entryBase);
+ }
+ } else if (entry.endsWith("|")) {
+ // Remove the final `|`.
+ String entryBase = entry.substring(0, entry.length() - 1);
+
+ String[] domainEntry = {domain, entryBase};
+
+ domainFinalBlockList.add(domainEntry);
+
+ Log.i("BlockLists", "Domain final block list added: " + domain + " , " + entryBase);
+ } else if (entry.contains("\\")) {
+ String[] domainEntry = {domain, entry};
+
+ domainRegularExpressionBlockList.add(domainEntry);
+
+ // Log.i("BlockLists", "Domain regular expression block list added: " + domain + " , " + entry);
+ } else {
+ String[] domainEntry = {domain, entry};
+
+ domainBlockList.add(domainEntry);
+
+ //Log.i("BlockLists", "Domain block list added: " + domain + " , " + entry);
+ }
+ } while (domains.contains("|"));
+ }
+ }
+ } else if (blockListEntry.contains("~")) { // Whitelist entries.
+ // Remove the filter options.
+ blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+ // Strip any trailing `*`.
+ if (blockListEntry.endsWith("*")) {
+ blockListEntry = blockListEntry.substring(0, blockListEntry.length() -1);
+ }
+
+ if (blockListEntry.contains("*")) {
+ int wildcardIndex = blockListEntry.indexOf("*");
+
+ String firstEntry = blockListEntry.substring(0, wildcardIndex);
+ String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+ if (firstEntry.endsWith("^")) {
+ String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+ String firstEntry1 = firstEntryBase + ":";
+ String firstEntry2 = firstEntryBase + "/";
+ String firstEntry3 = firstEntryBase + "?";
+ String firstEntry4 = firstEntryBase + "=";
+ String firstEntry5 = firstEntryBase + "&";
+
+ String[] doubleEntry1 = {firstEntry1, secondEntry};
+ String[] doubleEntry2 = {firstEntry2, secondEntry};
+ String[] doubleEntry3 = {firstEntry3, secondEntry};
+ String[] doubleEntry4 = {firstEntry4, secondEntry};
+ String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+ multiEntryWhiteList.add(doubleEntry1);
+ multiEntryWhiteList.add(doubleEntry2);
+ multiEntryWhiteList.add(doubleEntry3);
+ multiEntryWhiteList.add(doubleEntry4);
+ multiEntryWhiteList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry5 + " , " + secondEntry);
+ } else {
+ String[] doubleEntry = {firstEntry, secondEntry};
+
+ multiEntryWhiteList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry white list added: " + firstEntry + " , " + secondEntry);
+ }
+ } else {
+ if (blockListEntry.endsWith("^")) {
+ String blockListEntryBase = blockListEntry.substring(0, blockListEntry.length() - 1);
+
+ String blockListEntry1 = blockListEntryBase + ":";
+ String blockListEntry2 = blockListEntryBase + "/";
+ String blockListEntry3 = blockListEntryBase + "?";
+ String blockListEntry4 = blockListEntryBase + "=";
+ String blockListEntry5 = blockListEntryBase + "&";
+
+ mainWhiteList.add(blockListEntry1);
+ mainWhiteList.add(blockListEntry2);
+ mainWhiteList.add(blockListEntry3);
+ mainWhiteList.add(blockListEntry4);
+ mainWhiteList.add(blockListEntry5);
+
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry1);
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry2);
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry3);
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry4);
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry5);
+ } else {
+ mainWhiteList.add(blockListEntry);
+
+ // Log.i("BlockLists", "Main white list added: " + blockListEntry);
+ }
+ }
+ } else if (blockListEntry.contains("\\")) { // Regular expressions.
+ // Remove the filter options.
+ blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+ regularExpressionBlockList.add(blockListEntry);
+
+ //Log.i("BlockLists", "Regular expression list added: " + blockListEntry);
+ } else {
+ // Remove the filter options.
+ blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$"));
+
+ // Strip any trailing `*` or `^`. Many of these entries have `^$`, which seem redundant for the purposes of Privacy Browser.
+ if (blockListEntry.endsWith("*") || blockListEntry.endsWith("^")) {
+ blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+ }
+
+ if (blockListEntry.contains("*")) { // Use a multi entry list.
+ int wildcardIndex = blockListEntry.indexOf("*");
+
+ String firstEntry = blockListEntry.substring(0, wildcardIndex);
+ String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+ // Remove `.*` if it appears at the beginning of the second entry.
+ if (secondEntry.startsWith(".*")) {
+ secondEntry = secondEntry.substring(2);
+ }
+
+ // Create a third entry if required.
+ if (secondEntry.contains("*")) {
+ wildcardIndex = secondEntry.indexOf("*");
+
+ String thirdEntry = secondEntry.substring(wildcardIndex + 1);
+ secondEntry = secondEntry.substring(0, wildcardIndex);
+
+ if (firstEntry.endsWith("^")) {
+ String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+ String firstEntry1 = firstEntryBase + ":";
+ String firstEntry2 = firstEntryBase + "/";
+ String firstEntry3 = firstEntryBase + "?";
+ String firstEntry4 = firstEntryBase + "=";
+ String firstEntry5 = firstEntryBase + "&";
+
+ if (thirdEntry.endsWith("|")) {
+ thirdEntry = thirdEntry.substring(0, thirdEntry.length() - 1);
+
+ String[] tripleEntry1 = {firstEntry1, secondEntry, thirdEntry};
+ String[] tripleEntry2 = {firstEntry2, secondEntry, thirdEntry};
+ String[] tripleEntry3 = {firstEntry3, secondEntry, thirdEntry};
+ String[] tripleEntry4 = {firstEntry4, secondEntry, thirdEntry};
+ String[] tripleEntry5 = {firstEntry5, secondEntry, thirdEntry};
+
+ multiEntryFinalBlockList.add(tripleEntry1);
+ multiEntryFinalBlockList.add(tripleEntry2);
+ multiEntryFinalBlockList.add(tripleEntry3);
+ multiEntryFinalBlockList.add(tripleEntry4);
+ multiEntryFinalBlockList.add(tripleEntry5);
+
+ //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry1 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry2 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry3 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry4 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry final tripple block list added: " + firstEntry5 + " , " + secondEntry + " , " + thirdEntry);
+ } else {
+ String[] tripleEntry1 = {firstEntry1, secondEntry, thirdEntry};
+ String[] tripleEntry2 = {firstEntry2, secondEntry, thirdEntry};
+ String[] tripleEntry3 = {firstEntry3, secondEntry, thirdEntry};
+ String[] tripleEntry4 = {firstEntry4, secondEntry, thirdEntry};
+ String[] tripleEntry5 = {firstEntry5, secondEntry, thirdEntry};
+
+ multiEntryBlockList.add(tripleEntry1);
+ multiEntryBlockList.add(tripleEntry2);
+ multiEntryBlockList.add(tripleEntry3);
+ multiEntryBlockList.add(tripleEntry4);
+ multiEntryBlockList.add(tripleEntry5);
+
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry1 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry2 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry3 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry4 + " , " + secondEntry + " , " + thirdEntry);
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry5 + " , " + secondEntry + " , " + thirdEntry);
+ }
+ } else {
+ String[] tripleEntry = {firstEntry, secondEntry, thirdEntry};
+
+ multiEntryBlockList.add(tripleEntry);
+
+ // Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry + " , " + secondEntry + " , " + thirdEntry);
+ }
+ } else { // This is a double entry.
+ if (firstEntry.startsWith("|")) {
+ String[] doubleEntry = {firstEntry.substring(1), secondEntry};
+
+ multiEntryInitialBlockList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry initial block list added: " + firstEntry.substring(1) + " , " + secondEntry);
+ } else if (firstEntry.startsWith("^")) {
+ String firstEntryBase = firstEntry.substring(1);
+
+ String firstEntry1 = ":" + firstEntryBase;
+ String firstEntry2 = "/" + firstEntryBase;
+ String firstEntry3 = "?" + firstEntryBase;
+ String firstEntry4 = "=" + firstEntryBase;
+ String firstEntry5 = "&" + firstEntryBase;
+
+ String[] doubleEntry1 = {firstEntry1, secondEntry};
+ String[] doubleEntry2 = {firstEntry2, secondEntry};
+ String[] doubleEntry3 = {firstEntry3, secondEntry};
+ String[] doubleEntry4 = {firstEntry4, secondEntry};
+ String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+ } else if (firstEntry.endsWith("^")) {
+ String firstEntryBase = firstEntry.substring(0, firstEntry.length() - 1);
+
+ String firstEntry1 = firstEntryBase + ":";
+ String firstEntry2 = firstEntryBase + "/";
+ String firstEntry3 = firstEntryBase + "?";
+ String firstEntry4 = firstEntryBase + "=";
+ String firstEntry5 = firstEntryBase + "&";
+
+ String[] doubleEntry1 = {firstEntry1, secondEntry};
+ String[] doubleEntry2 = {firstEntry2, secondEntry};
+ String[] doubleEntry3 = {firstEntry3, secondEntry};
+ String[] doubleEntry4 = {firstEntry4, secondEntry};
+ String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+ } else if (secondEntry.startsWith("^")) {
+ String secondEntryBase = secondEntry.substring(1);
+
+ String secondEntry1 = ":" + secondEntryBase;
+ String secondEntry2 = "/" + secondEntryBase;
+ String secondEntry3 = "?" + secondEntryBase;
+ String secondEntry4 = "=" + secondEntryBase;
+ String secondEntry5 = "&" + secondEntryBase;
+
+ String[] doubleEntry1 = {firstEntry, secondEntry1};
+ String[] doubleEntry2 = {firstEntry, secondEntry2};
+ String[] doubleEntry3 = {firstEntry, secondEntry3};
+ String[] doubleEntry4 = {firstEntry, secondEntry4};
+ String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+ } else if (secondEntry.endsWith("^")) {
+ String secondEntryBase = secondEntry.substring(0, secondEntry.length() - 1);
+
+ String secondEntry1 = secondEntryBase + ":";
+ String secondEntry2 = secondEntryBase + "/";
+ String secondEntry3 = secondEntryBase + "?";
+ String secondEntry4 = secondEntryBase + "=";
+ String secondEntry5 = secondEntryBase + "&";
+
+ String[] doubleEntry1 = {firstEntry, secondEntry1};
+ String[] doubleEntry2 = {firstEntry, secondEntry2};
+ String[] doubleEntry3 = {firstEntry, secondEntry3};
+ String[] doubleEntry4 = {firstEntry, secondEntry4};
+ String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+ String[] doubleEntryFinal = {firstEntry, secondEntryBase};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ multiEntryFinalBlockList.add(doubleEntryFinal);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntryBase);
+ } else {
+ String[] doubleEntry = {firstEntry, secondEntry};
+
+ multiEntryBlockList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry block list added: " + firstEntry + " , " + secondEntry);
+ }
+ }
+ } else if (blockListEntry.startsWith("|")) { // Populate the initial block list.
+ // Strip the initial `|`.
+ blockListEntry = blockListEntry.substring(1);
+
+ // Populate the initial block list.
+ initialBlockList.add(blockListEntry);
+
+ //Log.i("BlockLists", "Initial block list added: " + blockListEntry);
+ } else { // Populate the main block list.
+ mainBlockList.add(blockListEntry);
+
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry);
+ }
+ }
+ } else { // Populate the standard lists.
+ // Strip out any initial `||`. These will be treated like any other entry.
+ if (blockListEntry.startsWith("||")) {
+ blockListEntry = blockListEntry.substring(2);
+ }
+
+ // Strip out any initial `*`.
+ if (blockListEntry.startsWith("*")) {
+ blockListEntry = blockListEntry.substring(1);
+ }
+
+ // Strip out any trailing `*`.
+ if (blockListEntry.endsWith("*")) {
+ blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1);
+ }
+
+ if (blockListEntry.contains("*")) { // Entries that contain a `*` in the middle have to be treated specially.
+ int wildcardIndex = blockListEntry.indexOf("*");
+
+ String firstEntry = blockListEntry.substring(0, wildcardIndex);
+ String secondEntry = blockListEntry.substring(wildcardIndex + 1);
+
+ // Remove `.*` if it appears at the beginning of the second entry.
+ if (secondEntry.startsWith(".*")) {
+ secondEntry = secondEntry.substring(2);
+ }
+
+ // Create a third entry if required.
+ if (secondEntry.contains("*")) {
+ wildcardIndex = secondEntry.indexOf("*");
+
+ String thirdEntry = secondEntry.substring(wildcardIndex + 1);
+ secondEntry = secondEntry.substring(0, wildcardIndex);
+
+ String[] tripleEntry = {firstEntry, secondEntry, thirdEntry};
+
+ multiEntryBlockList.add(tripleEntry);
+
+ //Log.i("BlockLists", "Multi entry tripple block list added: " + firstEntry + " , " + secondEntry + " , " + thirdEntry);
+ } else {
+ if (firstEntry.startsWith("|")) {
+ String[] doubleEntry = {firstEntry.substring(1), secondEntry};
+
+ multiEntryInitialBlockList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry initial block list added: " + firstEntry.substring(1) + " , " + secondEntry);
+ } else if (firstEntry.startsWith("^")) {
+ String firstEntryBase = firstEntry.substring(1);
+
+ String firstEntry1 = ":" + firstEntryBase;
+ String firstEntry2 = "/" + firstEntryBase;
+ String firstEntry3 = "?" + firstEntryBase;
+ String firstEntry4 = "=" + firstEntryBase;
+ String firstEntry5 = "&" + firstEntryBase;
+
+ String[] doubleEntry1 = {firstEntry1, secondEntry};
+ String[] doubleEntry2 = {firstEntry2, secondEntry};
+ String[] doubleEntry3 = {firstEntry3, secondEntry};
+ String[] doubleEntry4 = {firstEntry4, secondEntry};
+ String[] doubleEntry5 = {firstEntry5, secondEntry};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry1 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry2 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry3 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry4 + " , " + secondEntry);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry5 + " , " + secondEntry);
+ } else if (secondEntry.startsWith("^")) {
+ String secondEntryBase = secondEntry.substring(1);
+
+ String secondEntry1 = ":" + secondEntryBase;
+ String secondEntry2 = "/" + secondEntryBase;
+ String secondEntry3 = "?" + secondEntryBase;
+ String secondEntry4 = "=" + secondEntryBase;
+ String secondEntry5 = "&" + secondEntryBase;
+
+ String[] doubleEntry1 = {firstEntry, secondEntry1};
+ String[] doubleEntry2 = {firstEntry, secondEntry2};
+ String[] doubleEntry3 = {firstEntry, secondEntry3};
+ String[] doubleEntry4 = {firstEntry, secondEntry4};
+ String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+ } else if (secondEntry.endsWith("^")) {
+ String secondEntryBase = secondEntry.substring(0, secondEntry.length() - 1);
+
+ String secondEntry1 = secondEntryBase + ":";
+ String secondEntry2 = secondEntryBase + "/";
+ String secondEntry3 = secondEntryBase + "?";
+ String secondEntry4 = secondEntryBase + "=";
+ String secondEntry5 = secondEntryBase + "&";
+
+ String[] doubleEntry1 = {firstEntry, secondEntry1};
+ String[] doubleEntry2 = {firstEntry, secondEntry2};
+ String[] doubleEntry3 = {firstEntry, secondEntry3};
+ String[] doubleEntry4 = {firstEntry, secondEntry4};
+ String[] doubleEntry5 = {firstEntry, secondEntry5};
+
+ String[] doubleEntryFinal = {firstEntry, secondEntryBase};
+
+ multiEntryBlockList.add(doubleEntry1);
+ multiEntryBlockList.add(doubleEntry2);
+ multiEntryBlockList.add(doubleEntry3);
+ multiEntryBlockList.add(doubleEntry4);
+ multiEntryBlockList.add(doubleEntry5);
+
+ multiEntryFinalBlockList.add(doubleEntryFinal);
+
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry1);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry2);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry3);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry4);
+ //Log.i("BlockLists", "Multi entry ^ block list added: " + firstEntry + " , " + secondEntry5);
+
+ //Log.i("BlockLists", "Multi entry final block list added: " + firstEntry + " , " + secondEntryBase);
+ } else {
+ String[] doubleEntry = {firstEntry, secondEntry};
+
+ multiEntryBlockList.add(doubleEntry);
+
+ //Log.i("BlockLists", "Multi entry block list added: " + firstEntry + " , " + secondEntry);
+ }
+ }
+ } else {
+ if (blockListEntry.endsWith("^")) { // `^` matches against `:`, `/`, `?`, `=`, `&`, and the end of the URL.
+ // Add all the variations to the main block list.
+ mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + ":");
+ mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "/");
+ mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "?");
+ mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "=");
+ mainBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1) + "&");
+
+ // Add the base block entry to the final block list.
+ finalBlockList.add(blockListEntry.substring(0, blockListEntry.length() - 1));
+
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + ":");
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "/");
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "?");
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "=");
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1) + "&");
+ //Log.i("BlockLists", "Final block list added: " + blockListEntry.substring(0, blockListEntry.length() - 1));
+ } else { // This is a basic entry.
+ // Add the modified block list entry to the main block list.
+ mainBlockList.add(blockListEntry);
+
+ //Log.i("BlockLists", "Main block list added: " + blockListEntry);
+ }
+ }
+ }
+ }
+
+ // Close `bufferedReader`.
+ bufferedReader.close();
+ } catch (IOException e) {
+ // The asset exists, so the `IOException` will never be thrown.
+ }
+
+ Log.i("BlockLists", "Finish populating block lists");
+