From: Soren Stoutner Date: Thu, 23 May 2019 03:48:49 +0000 (-0700) Subject: Create a blocklists loading splash screen. https://redmine.stoutner.com/issues/285 X-Git-Tag: v3.1~2 X-Git-Url: https://gitweb.stoutner.com/?a=commitdiff_plain;h=bb6f81978d4fdf732b3becc0dd2c055bad5f85d5;p=PrivacyBrowserAndroid.git Create a blocklists loading splash screen. https://redmine.stoutner.com/issues/285 --- diff --git a/app/src/free/assets/tr/about_permissions_dark.html b/app/src/free/assets/tr/about_permissions_dark.html index 8fdc87a7..daf42d8e 100644 --- a/app/src/free/assets/tr/about_permissions_dark.html +++ b/app/src/free/assets/tr/about_permissions_dark.html @@ -47,29 +47,29 @@

-

In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend. - For the free flavor, Firebase adds the following permissions even though they are not listed in the source code - manifest file.

+

Ek olarak, Privacy Browser Ücretsiz, Firebase backend kullanarak Google'ın AdMob ağından reklamlar görüntüler. + Ücretsiz sürüm için Firebase, kaynak kod bildirim dosyasında + listelenmemiş olsalar bile aşağıdaki izinleri ilave eder.

-

View network connections

+

Ağ bağlantılarını görüntüle

android.permission.ACCESS_NETWORK_STATE

-

Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected). - They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.

+

Reklamların, internet erişimine ne zaman sahip olup olmadığınızı bilmesine izin verir (internet erişiminiz yoksa muhtemelen reklamı tekrar yüklemeyi denemezler). + Ayrıca internete Wi-Fi, 2g, 3g, 4g vs. bağlantı şekillerinden hangisiyle bağlandığınızı da anlayabilirler.

-

Prevent phone from sleeping

+

Telefonun uyku moduna geçmesini engelleme

android.permission.WAKE_LOCK

-

Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don’t think the ads actually do this.

+

Reklamların, işlemcinin uyku moduna geçmesini ve ekranın kararmasını engellemesine izin verir. Kişisel deneyimime göre reklamların bunu yapabileceğini sanmıyorum.

Play Install Referrer API

com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE

-

Allows other apps to tell if their installation was launched from an ad in Privacy Browser Free.

+

Diğer uygulamaların, kurulumlarının Privacy Browser Ücretsizde görüntülenen bir reklamdan başlatılıp başlatılmadığını anlamasına izin verir.

-

Receive data from Internet

+

Ä°nternetten veri alma

com.google.android.c2dm.permission.RECEIVE

-

Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).

+

Google'ın, öncesinde bir istek almasına gerek duymadan, AdView'e doğrudan bilgi göndermesine izin verir (buluttan cihaza iletişim).

-

Receive data from Internet

+

Ä°nternetten veri alma

com.stoutner.privacybrowser.free.permission.C2D_MESSAGE

-

Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.

+

Buluttan cihaza iletişimi güvence altına alır, böylece sadece Privacy Browser Ücretsiz onları alabilir.

\ No newline at end of file diff --git a/app/src/free/assets/tr/about_permissions_light.html b/app/src/free/assets/tr/about_permissions_light.html index e7b1b5a2..b67075a8 100644 --- a/app/src/free/assets/tr/about_permissions_light.html +++ b/app/src/free/assets/tr/about_permissions_light.html @@ -47,29 +47,29 @@

-

In addition, Privacy Browser Free displays ads from Google’s AdMob network using the Firebase backend. - For the free flavor, Firebase adds the following permissions even though they are not listed in the source code - manifest file.

+

Ek olarak, Privacy Browser Ücretsiz, Firebase backend kullanarak Google'ın AdMob ağından reklamlar görüntüler. + Ücretsiz sürüm için Firebase, kaynak kod bildirim dosyasında + listelenmemiş olsalar bile aşağıdaki izinleri ilave eder.

-

View network connections

+

Ağ bağlantılarını görüntüle

android.permission.ACCESS_NETWORK_STATE

-

Allows the ads to tell when you are connected to the internet and when you aren’t (presumably so they don’t try to reload an ad when you are disconnected). - They can also tell if you are connected via Wi-Fi, 2G, 3G, 4G, etc.

+

Reklamların, internet erişimine ne zaman sahip olup olmadığınızı bilmesine izin verir (internet erişiminiz yoksa muhtemelen reklamı tekrar yüklemeyi denemezler). + Ayrıca internete Wi-Fi, 2g, 3g, 4g vs. bağlantı şekillerinden hangisiyle bağlandığınızı da anlayabilirler.

-

Prevent phone from sleeping

+

Telefonun uyku moduna geçmesini engelleme

android.permission.WAKE_LOCK

-

Allows the ads to keep the processor from sleeping and the screen from dimming, although in my testing I don’t think the ads actually do this.

+

Reklamların, işlemcinin uyku moduna geçmesini ve ekranın kararmasını engellemesine izin verir. Kişisel deneyimime göre reklamların bunu yapabileceğini sanmıyorum.

Play Install Referrer API

com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE

-

Allows other apps to tell if their installation was launched from an ad in Privacy Browser Free.

+

Diğer uygulamaların, kurulumlarının Privacy Browser Ücretsizde görüntülenen bir reklamdan başlatılıp başlatılmadığını anlamasına izin verir.

-

Receive data from Internet

+

Ä°nternetten veri alma

com.google.android.c2dm.permission.RECEIVE

-

Allows Google to send information directly to the AdView without having to receive a request first (cloud-to-device messaging).

+

Google'ın, öncesinde bir istek almasına gerek duymadan, AdView'e doğrudan bilgi göndermesine izin verir (buluttan cihaza iletişim).

-

Receive data from Internet

+

Ä°nternetten veri alma

com.stoutner.privacybrowser.free.permission.C2D_MESSAGE

-

Secures the cloud-to-device messages so that only Privacy Browser Free can receive them.

+

Buluttan cihaza iletişimi güvence altına alır, böylece sadece Privacy Browser Ücretsiz onları alabilir.

\ No newline at end of file diff --git a/app/src/free/assets/tr/about_privacy_policy_dark.html b/app/src/free/assets/tr/about_privacy_policy_dark.html index 0f11ef9f..3cdc3ae5 100644 --- a/app/src/free/assets/tr/about_privacy_policy_dark.html +++ b/app/src/free/assets/tr/about_privacy_policy_dark.html @@ -76,16 +76,16 @@ -

Advertisements

-

Privacy Browser Free displays a banner ad across the bottom of the screen using Google's AdMob network, - which has its own privacy policy. - These ads are set to be non-personalized. - AdMob reports anonymized summaries of the following information to developers.

+ <

Reklamlar

+

Privacy Browser Ücretsiz, Google'ın, kendisine özgü gizlilik politikası olan + AdMob ağını kullanarak ekranın alt kısmında bir banner reklam gösterir. + Bu reklamlar kişiselleştirilmemiş olarak ayarlanmıştır. + AdMob, geliştiricilere aşağıdaki bilgilerin anonimleştirilmiş özetlerini rapor eder.

diff --git a/app/src/free/assets/tr/about_privacy_policy_light.html b/app/src/free/assets/tr/about_privacy_policy_light.html index 4dd34ce6..afcd8a65 100644 --- a/app/src/free/assets/tr/about_privacy_policy_light.html +++ b/app/src/free/assets/tr/about_privacy_policy_light.html @@ -76,16 +76,16 @@ -

Advertisements

-

Privacy Browser Free displays a banner ad across the bottom of the screen using Google's AdMob network, - which has its own privacy policy. - These ads are set to be non-personalized. - AdMob reports anonymized summaries of the following information to developers.

+

Reklamlar

+

Privacy Browser Ücretsiz, Google'ın, kendisine özgü gizlilik politikası olan + AdMob ağını kullanarak ekranın alt kısmında bir banner reklam gösterir. + Bu reklamlar kişiselleştirilmemiş olarak ayarlanmıştır. + AdMob, geliştiricilere aşağıdaki bilgilerin anonimleştirilmiş özetlerini rapor eder.

diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java index 33687f9a..a90f85c7 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java @@ -131,7 +131,7 @@ import com.stoutner.privacybrowser.dialogs.UrlHistoryDialog; import com.stoutner.privacybrowser.dialogs.ViewSslCertificateDialog; import com.stoutner.privacybrowser.fragments.WebViewTabFragment; import com.stoutner.privacybrowser.helpers.AdHelper; -import com.stoutner.privacybrowser.helpers.BlockListHelper; +import com.stoutner.privacybrowser.helpers.BlocklistHelper; import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper; import com.stoutner.privacybrowser.helpers.CheckPinnedMismatchHelper; import com.stoutner.privacybrowser.helpers.DomainsDatabaseHelper; @@ -456,6 +456,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook FloatingActionButton createBookmarkFab = findViewById(R.id.create_bookmark_fab); EditText findOnPageEditText = findViewById(R.id.find_on_page_edittext); + // Initially disable the sliding drawers. They will be enabled once the blocklists are loaded. + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + // Listen for touches on the navigation menu. navigationView.setNavigationItemSelectedListener(this); @@ -757,14 +760,16 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook bookmarksHeaderTextView.setPadding(drawerHeaderPaddingLeftAndRight, drawerHeaderPaddingTop, drawerHeaderPaddingLeftAndRight, drawerHeaderPaddingBottom); } - // Update the navigation menu items. - navigationBackMenuItem.setEnabled(currentWebView.canGoBack()); - navigationForwardMenuItem.setEnabled(currentWebView.canGoForward()); - navigationHistoryMenuItem.setEnabled((currentWebView.canGoBack() || currentWebView.canGoForward())); - navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + currentWebView.getRequestsCount(NestedScrollWebView.BLOCKED_REQUESTS)); + // Update the navigation menu items if the WebView is not null. + if (currentWebView != null) { + navigationBackMenuItem.setEnabled(currentWebView.canGoBack()); + navigationForwardMenuItem.setEnabled(currentWebView.canGoForward()); + navigationHistoryMenuItem.setEnabled((currentWebView.canGoBack() || currentWebView.canGoForward())); + navigationRequestsMenuItem.setTitle(getString(R.string.requests) + " - " + currentWebView.getRequestsCount(NestedScrollWebView.BLOCKED_REQUESTS)); - // Hide the keyboard (if displayed). - inputMethodManager.hideSoftInputFromWindow(currentWebView.getWindowToken(), 0); + // Hide the keyboard (if displayed). + inputMethodManager.hideSoftInputFromWindow(currentWebView.getWindowToken(), 0); + } // Clear the focus from from the URL text box and the WebView. This removes any text selection markers and context menus, which otherwise draw above the open drawers. urlEditText.clearFocus(); @@ -4399,7 +4404,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // Instantiate the blocklist helper. - BlockListHelper blockListHelper = new BlockListHelper(); + BlocklistHelper blocklistHelper = new BlocklistHelper(); // Remove the lint warning below that the input method manager might be null. assert inputMethodManager != null; @@ -4986,7 +4991,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Block third-party requests if enabled. if (isThirdPartyRequest && nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.THIRD_PARTY_REQUESTS)) { // Add the result to the resource requests. - nestedScrollWebView.addResourceRequest(new String[]{BlockListHelper.REQUEST_THIRD_PARTY, url}); + nestedScrollWebView.addResourceRequest(new String[]{BlocklistHelper.REQUEST_THIRD_PARTY, url}); // Increment the blocked requests counters. nestedScrollWebView.incrementRequestsCount(NestedScrollWebView.BLOCKED_REQUESTS); @@ -5015,10 +5020,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Check UltraPrivacy if it is enabled. if (nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.ULTRA_PRIVACY)) { // Check the URL against UltraPrivacy. - String[] ultraPrivacyResults = blockListHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, ultraPrivacy); + String[] ultraPrivacyResults = blocklistHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, ultraPrivacy); // Process the UltraPrivacy results. - if (ultraPrivacyResults[0].equals(BlockListHelper.REQUEST_BLOCKED)) { // The resource request matched UltraPrivacy's blacklist. + if (ultraPrivacyResults[0].equals(BlocklistHelper.REQUEST_BLOCKED)) { // The resource request matched UltraPrivacy's blacklist. // Add the result to the resource requests. nestedScrollWebView.addResourceRequest(new String[] {ultraPrivacyResults[0], ultraPrivacyResults[1], ultraPrivacyResults[2], ultraPrivacyResults[3], ultraPrivacyResults[4], ultraPrivacyResults[5]}); @@ -5044,7 +5049,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The resource request was blocked. Return an empty web resource response. return emptyWebResourceResponse; - } else if (ultraPrivacyResults[0].equals(BlockListHelper.REQUEST_ALLOWED)) { // The resource request matched UltraPrivacy's whitelist. + } else if (ultraPrivacyResults[0].equals(BlocklistHelper.REQUEST_ALLOWED)) { // The resource request matched UltraPrivacy's whitelist. // Add a whitelist entry to the resource requests array. nestedScrollWebView.addResourceRequest(new String[] {ultraPrivacyResults[0], ultraPrivacyResults[1], ultraPrivacyResults[2], ultraPrivacyResults[3], ultraPrivacyResults[4], ultraPrivacyResults[5]}); @@ -5057,10 +5062,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Check EasyList if it is enabled. if (nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.EASY_LIST)) { // Check the URL against EasyList. - String[] easyListResults = blockListHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, easyList); + String[] easyListResults = blocklistHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, easyList); // Process the EasyList results. - if (easyListResults[0].equals(BlockListHelper.REQUEST_BLOCKED)) { // The resource request matched EasyList's blacklist. + if (easyListResults[0].equals(BlocklistHelper.REQUEST_BLOCKED)) { // The resource request matched EasyList's blacklist. // Add the result to the resource requests. nestedScrollWebView.addResourceRequest(new String[] {easyListResults[0], easyListResults[1], easyListResults[2], easyListResults[3], easyListResults[4], easyListResults[5]}); @@ -5085,7 +5090,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The resource request was blocked. Return an empty web resource response. return emptyWebResourceResponse; - } else if (easyListResults[0].equals(BlockListHelper.REQUEST_ALLOWED)) { // The resource request matched EasyList's whitelist. + } else if (easyListResults[0].equals(BlocklistHelper.REQUEST_ALLOWED)) { // The resource request matched EasyList's whitelist. // Update the whitelist result string array tracker. whitelistResultStringArray = new String[] {easyListResults[0], easyListResults[1], easyListResults[2], easyListResults[3], easyListResults[4], easyListResults[5]}; } @@ -5094,10 +5099,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Check EasyPrivacy if it is enabled. if (nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.EASY_PRIVACY)) { // Check the URL against EasyPrivacy. - String[] easyPrivacyResults = blockListHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, easyPrivacy); + String[] easyPrivacyResults = blocklistHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, easyPrivacy); // Process the EasyPrivacy results. - if (easyPrivacyResults[0].equals(BlockListHelper.REQUEST_BLOCKED)) { // The resource request matched EasyPrivacy's blacklist. + if (easyPrivacyResults[0].equals(BlocklistHelper.REQUEST_BLOCKED)) { // The resource request matched EasyPrivacy's blacklist. // Add the result to the resource requests. nestedScrollWebView.addResourceRequest(new String[] {easyPrivacyResults[0], easyPrivacyResults[1], easyPrivacyResults[2], easyPrivacyResults[3], easyPrivacyResults[4], easyPrivacyResults[5]}); @@ -5123,7 +5128,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The resource request was blocked. Return an empty web resource response. return emptyWebResourceResponse; - } else if (easyPrivacyResults[0].equals(BlockListHelper.REQUEST_ALLOWED)) { // The resource request matched EasyPrivacy's whitelist. + } else if (easyPrivacyResults[0].equals(BlocklistHelper.REQUEST_ALLOWED)) { // The resource request matched EasyPrivacy's whitelist. // Update the whitelist result string array tracker. whitelistResultStringArray = new String[] {easyPrivacyResults[0], easyPrivacyResults[1], easyPrivacyResults[2], easyPrivacyResults[3], easyPrivacyResults[4], easyPrivacyResults[5]}; } @@ -5132,10 +5137,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Check Fanboy’s Annoyance List if it is enabled. if (nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.FANBOYS_ANNOYANCE_LIST)) { // Check the URL against Fanboy's Annoyance List. - String[] fanboysAnnoyanceListResults = blockListHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, fanboysAnnoyanceList); + String[] fanboysAnnoyanceListResults = blocklistHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, fanboysAnnoyanceList); // Process the Fanboy's Annoyance List results. - if (fanboysAnnoyanceListResults[0].equals(BlockListHelper.REQUEST_BLOCKED)) { // The resource request matched Fanboy's Annoyance List's blacklist. + if (fanboysAnnoyanceListResults[0].equals(BlocklistHelper.REQUEST_BLOCKED)) { // The resource request matched Fanboy's Annoyance List's blacklist. // Add the result to the resource requests. nestedScrollWebView.addResourceRequest(new String[] {fanboysAnnoyanceListResults[0], fanboysAnnoyanceListResults[1], fanboysAnnoyanceListResults[2], fanboysAnnoyanceListResults[3], fanboysAnnoyanceListResults[4], fanboysAnnoyanceListResults[5]}); @@ -5162,17 +5167,17 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The resource request was blocked. Return an empty web resource response. return emptyWebResourceResponse; - } else if (fanboysAnnoyanceListResults[0].equals(BlockListHelper.REQUEST_ALLOWED)){ // The resource request matched Fanboy's Annoyance List's whitelist. + } else if (fanboysAnnoyanceListResults[0].equals(BlocklistHelper.REQUEST_ALLOWED)){ // The resource request matched Fanboy's Annoyance List's whitelist. // Update the whitelist result string array tracker. whitelistResultStringArray = new String[] {fanboysAnnoyanceListResults[0], fanboysAnnoyanceListResults[1], fanboysAnnoyanceListResults[2], fanboysAnnoyanceListResults[3], fanboysAnnoyanceListResults[4], fanboysAnnoyanceListResults[5]}; } } else if (nestedScrollWebView.isBlocklistEnabled(NestedScrollWebView.FANBOYS_SOCIAL_BLOCKING_LIST)) { // Only check Fanboy’s Social Blocking List if Fanboy’s Annoyance List is disabled. // Check the URL against Fanboy's Annoyance List. - String[] fanboysSocialListResults = blockListHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, fanboysSocialList); + String[] fanboysSocialListResults = blocklistHelper.checkBlocklist(currentDomain, url, isThirdPartyRequest, fanboysSocialList); // Process the Fanboy's Social Blocking List results. - if (fanboysSocialListResults[0].equals(BlockListHelper.REQUEST_BLOCKED)) { // The resource request matched Fanboy's Social Blocking List's blacklist. + if (fanboysSocialListResults[0].equals(BlocklistHelper.REQUEST_BLOCKED)) { // The resource request matched Fanboy's Social Blocking List's blacklist. // Add the result to the resource requests. nestedScrollWebView.addResourceRequest(new String[] {fanboysSocialListResults[0], fanboysSocialListResults[1], fanboysSocialListResults[2], fanboysSocialListResults[3], fanboysSocialListResults[4], fanboysSocialListResults[5]}); @@ -5199,7 +5204,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The resource request was blocked. Return an empty web resource response. return emptyWebResourceResponse; - } else if (fanboysSocialListResults[0].equals(BlockListHelper.REQUEST_ALLOWED)) { // The resource request matched Fanboy's Social Blocking List's whitelist. + } else if (fanboysSocialListResults[0].equals(BlocklistHelper.REQUEST_ALLOWED)) { // The resource request matched Fanboy's Social Blocking List's whitelist. // Update the whitelist result string array tracker. whitelistResultStringArray = new String[] {fanboysSocialListResults[0], fanboysSocialListResults[1], fanboysSocialListResults[2], fanboysSocialListResults[3], fanboysSocialListResults[4], fanboysSocialListResults[5]}; @@ -5210,7 +5215,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook if (whitelistResultStringArray != null) { // The request was processed by a whitelist. nestedScrollWebView.addResourceRequest(whitelistResultStringArray); } else { // The request didn't match any blocklist entry. Log it as a default request. - nestedScrollWebView.addResourceRequest(new String[]{BlockListHelper.REQUEST_DEFAULT, url}); + nestedScrollWebView.addResourceRequest(new String[]{BlocklistHelper.REQUEST_DEFAULT, url}); } // The resource request has not been blocked. `return null` loads the requested resource. diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java index 8a97e525..f69b75f6 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/RequestsActivity.java @@ -43,7 +43,7 @@ import androidx.fragment.app.DialogFragment; import com.stoutner.privacybrowser.R; import com.stoutner.privacybrowser.adapters.RequestsArrayAdapter; import com.stoutner.privacybrowser.dialogs.ViewRequestDialog; -import com.stoutner.privacybrowser.helpers.BlockListHelper; +import com.stoutner.privacybrowser.helpers.BlocklistHelper; import java.util.ArrayList; import java.util.List; @@ -112,8 +112,8 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi // Populate the resource array lists. for (String[] request : resourceRequests) { - switch (request[BlockListHelper.REQUEST_DISPOSITION]) { - case BlockListHelper.REQUEST_DEFAULT: + switch (request[BlocklistHelper.REQUEST_DISPOSITION]) { + case BlocklistHelper.REQUEST_DEFAULT: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -121,7 +121,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi defaultResourceRequests.add(request); break; - case BlockListHelper.REQUEST_ALLOWED: + case BlocklistHelper.REQUEST_ALLOWED: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -129,7 +129,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi allowedResourceRequests.add(request); break; - case BlockListHelper.REQUEST_THIRD_PARTY: + case BlocklistHelper.REQUEST_THIRD_PARTY: // Add the request to the list of all requests. allResourceRequests.add(request); @@ -137,7 +137,7 @@ public class RequestsActivity extends AppCompatActivity implements ViewRequestDi thirdPartyResourceRequests.add(request); break; - case BlockListHelper.REQUEST_BLOCKED: + case BlocklistHelper.REQUEST_BLOCKED: // Add the request to the list of all requests. allResourceRequests.add(request); diff --git a/app/src/main/java/com/stoutner/privacybrowser/adapters/RequestsArrayAdapter.java b/app/src/main/java/com/stoutner/privacybrowser/adapters/RequestsArrayAdapter.java index 5bb6b0a4..edc64f81 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/adapters/RequestsArrayAdapter.java +++ b/app/src/main/java/com/stoutner/privacybrowser/adapters/RequestsArrayAdapter.java @@ -32,7 +32,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import com.stoutner.privacybrowser.R; -import com.stoutner.privacybrowser.helpers.BlockListHelper; +import com.stoutner.privacybrowser.helpers.BlocklistHelper; import java.util.List; @@ -75,7 +75,7 @@ public class RequestsArrayAdapter extends ArrayAdapter { // Set the action text and the background color. switch (entryStringArray[0]) { - case BlockListHelper.REQUEST_DEFAULT: + case BlocklistHelper.REQUEST_DEFAULT: // Create the disposition string. String requestDefault = id + ". " + context.getResources().getString(R.string.allowed); @@ -86,7 +86,7 @@ public class RequestsArrayAdapter extends ArrayAdapter { linearLayout.setBackgroundColor(context.getResources().getColor(R.color.transparent)); break; - case BlockListHelper.REQUEST_ALLOWED: + case BlocklistHelper.REQUEST_ALLOWED: // Create the disposition string. String requestAllowed = id + ". " + context.getResources().getString(R.string.allowed); @@ -101,7 +101,7 @@ public class RequestsArrayAdapter extends ArrayAdapter { } break; - case BlockListHelper.REQUEST_THIRD_PARTY: + case BlocklistHelper.REQUEST_THIRD_PARTY: // Create the disposition string. String requestThirdParty = id + ". " + context.getResources().getString(R.string.blocked); @@ -117,7 +117,7 @@ public class RequestsArrayAdapter extends ArrayAdapter { break; - case BlockListHelper.REQUEST_BLOCKED: + case BlocklistHelper.REQUEST_BLOCKED: // Create the disposition string. String requestBlocked = id + ". " + context.getResources().getString(R.string.blocked); diff --git a/app/src/main/java/com/stoutner/privacybrowser/asynctasks/PopulateBlocklists.java b/app/src/main/java/com/stoutner/privacybrowser/asynctasks/PopulateBlocklists.java index f732f475..f7fa5088 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/asynctasks/PopulateBlocklists.java +++ b/app/src/main/java/com/stoutner/privacybrowser/asynctasks/PopulateBlocklists.java @@ -27,15 +27,16 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.appcompat.widget.Toolbar; +import androidx.drawerlayout.widget.DrawerLayout; + import com.stoutner.privacybrowser.R; -import com.stoutner.privacybrowser.helpers.BlockListHelper; +import com.stoutner.privacybrowser.helpers.BlocklistHelper; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -import androidx.appcompat.widget.Toolbar; - public class PopulateBlocklists extends AsyncTask>>> { // The public interface is used to send information back to the parent activity. public interface PopulateBlocklistsListener { @@ -66,7 +67,7 @@ public class PopulateBlocklists extends AsyncTask>> combinedBlocklists = new ArrayList<>(); @@ -77,35 +78,35 @@ public class PopulateBlocklists extends AsyncTask> easyList = blockListHelper.parseBlockList(context.getAssets(), "blocklists/easylist.txt"); + ArrayList> easyList = blocklistHelper.parseBlocklist(context.getAssets(), "blocklists/easylist.txt"); // Update the progress. publishProgress(context.getString(R.string.loading_easyprivacy)); // Populate EasyPrivacy. - ArrayList> easyPrivacy = blockListHelper.parseBlockList(context.getAssets(), "blocklists/easyprivacy.txt"); + ArrayList> easyPrivacy = blocklistHelper.parseBlocklist(context.getAssets(), "blocklists/easyprivacy.txt"); // Update the progress. publishProgress(context.getString(R.string.loading_fanboys_annoyance_list)); // Populate Fanboy's Annoyance List. - ArrayList> fanboysAnnoyanceList = blockListHelper.parseBlockList(context.getAssets(), "blocklists/fanboy-annoyance.txt"); + ArrayList> fanboysAnnoyanceList = blocklistHelper.parseBlocklist(context.getAssets(), "blocklists/fanboy-annoyance.txt"); // Update the progress. publishProgress(context.getString(R.string.loading_fanboys_social_blocking_list)); // Populate Fanboy's Social Blocking List. - ArrayList> fanboysSocialList = blockListHelper.parseBlockList(context.getAssets(), "blocklists/fanboy-social.txt"); + ArrayList> fanboysSocialList = blocklistHelper.parseBlocklist(context.getAssets(), "blocklists/fanboy-social.txt"); // Update the progress. publishProgress(context.getString(R.string.loading_ultraprivacy)); // Populate UltraPrivacy. - ArrayList> ultraPrivacy = blockListHelper.parseBlockList(context.getAssets(), "blocklists/ultraprivacy.txt"); + ArrayList> ultraPrivacy = blocklistHelper.parseBlocklist(context.getAssets(), "blocklists/ultraprivacy.txt"); // Populate the combined array list. @@ -149,6 +150,7 @@ public class PopulateBlocklists extends AsyncTask. - * - * This file is part of Privacy Browser . - * - * Privacy Browser is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Privacy Browser is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Privacy Browser. If not, see . - */ - -package com.stoutner.privacybrowser.helpers; - -import android.content.res.AssetManager; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -public class BlockListHelper { - // Describe the schema of the string array in each entry of the resource requests array list. - public final static int REQUEST_DISPOSITION = 0; - public final static int REQUEST_URL = 1; - public final static int REQUEST_BLOCKLIST = 2; - public final static int REQUEST_SUBLIST = 3; - public final static int REQUEST_BLOCKLIST_ENTRIES = 4; - public final static int REQUEST_BLOCKLIST_ORIGINAL_ENTRY = 5; - - // The request disposition options. - public final static String REQUEST_DEFAULT = "0"; - public final static String REQUEST_ALLOWED = "1"; - public final static String REQUEST_THIRD_PARTY = "2"; - public final static String REQUEST_BLOCKED = "3"; - - // The whitelists. - public final static String MAIN_WHITELIST = "1"; - public final static String FINAL_WHITELIST = "2"; - public final static String DOMAIN_WHITELIST = "3"; - public final static String DOMAIN_INITIAL_WHITELIST = "4"; - public final static String DOMAIN_FINAL_WHITELIST = "5"; - public final static String THIRD_PARTY_WHITELIST = "6"; - public final static String THIRD_PARTY_DOMAIN_WHITELIST = "7"; - public final static String THIRD_PARTY_DOMAIN_INITIAL_WHITELIST = "8"; - - // The blacklists. - public final static String MAIN_BLACKLIST = "9"; - public final static String INITIAL_BLACKLIST = "10"; - public final static String FINAL_BLACKLIST = "11"; - public final static String DOMAIN_BLACKLIST = "12"; - public final static String DOMAIN_INITIAL_BLACKLIST = "13"; - public final static String DOMAIN_FINAL_BLACKLIST = "14"; - public final static String DOMAIN_REGULAR_EXPRESSION_BLACKLIST = "15"; - public final static String THIRD_PARTY_BLACKLIST = "16"; - public final static String THIRD_PARTY_INITIAL_BLACKLIST = "17"; - public final static String THIRD_PARTY_DOMAIN_BLACKLIST = "18"; - public final static String THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST = "19"; - public final static String THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST = "20"; - public final static String THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST = "21"; - public final static String REGULAR_EXPRESSION_BLACKLIST = "22"; - - public ArrayList> parseBlockList(AssetManager assets, String blockListName) { - // Initialize the header list. - List headers = new ArrayList<>(); // 0. - - // Initialize the whitelists. - List mainWhiteList = new ArrayList<>(); // 1. - List finalWhiteList = new ArrayList<>(); // 2. - List domainWhiteList = new ArrayList<>(); // 3. - List domainInitialWhiteList = new ArrayList<>(); // 4. - List domainFinalWhiteList = new ArrayList<>(); // 5. - List thirdPartyWhiteList = new ArrayList<>(); // 6. - List thirdPartyDomainWhiteList = new ArrayList<>(); // 7. - List thirdPartyDomainInitialWhiteList = new ArrayList<>(); // 8. - - // Initialize the blacklists - List mainBlackList = new ArrayList<>(); // 9. - List initialBlackList = new ArrayList<>(); // 10. - List finalBlackList = new ArrayList<>(); // 11. - List domainBlackList = new ArrayList<>(); // 12. - List domainInitialBlackList = new ArrayList<>(); // 13. - List domainFinalBlackList = new ArrayList<>(); // 14. - List domainRegularExpressionBlackList = new ArrayList<>(); // 15. - List thirdPartyBlackList = new ArrayList<>(); // 16. - List thirdPartyInitialBlackList = new ArrayList<>(); // 17. - List thirdPartyDomainBlackList = new ArrayList<>(); // 18. - List thirdPartyDomainInitialBlackList = new ArrayList<>(); // 19. - List regularExpressionBlackList = new ArrayList<>(); // 20. - List thirdPartyRegularExpressionBlackList = new ArrayList<>(); // 21. - List thirdPartyDomainRegularExpressionBlackList = new ArrayList<>(); // 22. - - - // Populate the block lists. The `try` is required by `InputStreamReader`. - try { - // Load the block list into a `BufferedReader`. - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(assets.open(blockListName))); - - // Create a string for storing the block list entries. - String blockListEntry; - - // Parse the block list. - while ((blockListEntry = bufferedReader.readLine()) != null) { - // Store the original block list entry. - String originalBlockListEntry = blockListEntry; - - // Remove any `^` from the block list entry. Privacy Browser does not process them in the interest of efficiency. - blockListEntry = blockListEntry.replace("^", ""); - - //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("BlockLists", "Not added: " + blockListEntry); - } else //noinspection StatementWithEmptyBody - if (blockListEntry.contains("$csp=script-src")) { // Ignore entries that contain `$csp=script-src`. - // Do nothing. It is uncertain what this directive is even supposed to mean, and it is blocking entire websites like androidcentral.com. https://redmine.stoutner.com/issues/306. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else //noinspection StatementWithEmptyBody - if (blockListEntry.contains("$websocket") || blockListEntry.contains("$third-party,websocket") || blockListEntry.contains("$script,websocket")) { // Ignore entries with `websocket`. - // Do nothing. Privacy Browser does not differentiate between websocket requests and other requests and these entries cause a lot of false positives. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else if (blockListEntry.startsWith("!")) { // Comment entries. - if (blockListEntry.startsWith("! Version:")) { - // Get the list version number. - String[] listVersion = {blockListEntry.substring(11)}; - - // Store the list version in the headers list. - headers.add(listVersion); - } - - if (blockListEntry.startsWith("! Title:")) { - // Get the list title. - String[] listTitle = {blockListEntry.substring(9)}; - - // Store the list title in the headers list. - headers.add(listTitle); - } - - //Log.i("BlockLists", "Not added: " + blockListEntry); - } else if (blockListEntry.startsWith("@@")) { // Entries that begin with `@@` are whitelists. - // Remove the `@@` - blockListEntry = blockListEntry.substring(2); - - // Strip out any initial `||`. Privacy Browser doesn't differentiate items that only match against the end of the domain name. - if (blockListEntry.startsWith("||")) { - blockListEntry = blockListEntry.substring(2); - } - - if (blockListEntry.contains("$")) { // Filter entries. - //noinspection StatementWithEmptyBody - if (blockListEntry.contains("~third-party")) { // Ignore entries that contain `~third-party`. - // Do nothing. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else if (blockListEntry.contains("third-party")) { // Third-party white list entries. - if (blockListEntry.contains("domain=")) { // Third-party domain white list entries. - // Parse the entry. - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1); - String domains = filters.substring(filters.indexOf("domain=") + 7); - - //noinspection StatementWithEmptyBody - if (domains.contains("~")) { // It is uncertain what a `~` domain means inside an `@@` entry. - // Do Nothing - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else if (blockListEntry.startsWith("|")) { // Third-party domain initial white list entries. - // Strip out the initial `|`. - entry = entry.substring(1); - - //noinspection StatementWithEmptyBody - if (entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. - // Do nothing. These entries are designed for filter options that Privacy Browser does not use. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else { // Process third-party domain initial white list entries. - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.contains("*")) { // Process a third-party domain initial white list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyDomainInitialWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain initial white list added: " + domain + " , " + firstEntry + " , " + secondEntry + - // " - " + originalBlockListEntry); - } else { // Process a third-party domain initial white list single entry. - // Create a domain entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the third party domain initial white list. - thirdPartyDomainInitialWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain initial white list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } else { // Third-party domain entries. - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // three is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - // Remove any trailing `*` from the entry. - if (entry.endsWith("*")) { - entry = entry.substring(0, entry.length() - 1); - } - - if (entry.contains("*")) { // Process a third-party domain double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyDomainWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } else { // Process a third-party domain single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyDomainWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } else { // Process third-party white list entries. - // Parse the entry - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // There are three or more entries. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - if (thirdEntry.contains("*")) { // There are four or more entries. - // Get the index of the wildcard. - int thirdWildcardIndex = thirdEntry.indexOf("*"); - - // Split the entry into components. - String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); - String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); - - if (fourthEntry.contains("*")) { // Process a third-party white list quintuple entry. - // Get the index of the wildcard. - int fourthWildcardIndex = fourthEntry.indexOf("*"); - - // Split the entry into components. - String realFourthEntry = fourthEntry.substring(0, fourthWildcardIndex); - String fifthEntry = fourthEntry.substring(fourthWildcardIndex + 1); - - // Create an entry string array. - String[] quintupleEntry = {firstEntry, realSecondEntry, realThirdEntry, realFourthEntry, fifthEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyWhiteList.add(quintupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + - // realFourthEntry + " , " + fifthEntry + " - " + originalBlockListEntry); - } else { // Process a third-party white list quadruple entry. - // Create an entry string array. - String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyWhiteList.add(quadrupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + - // fourthEntry + " - " + originalBlockListEntry); - } - } else { // Process a third-party white list triple entry. - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyWhiteList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + - // originalBlockListEntry); - } - } else { // Process a third-party white list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyWhiteList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a third-party white list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyWhiteList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain white list added: " + entry + " - " + originalBlockListEntry); - } - } - } else if (blockListEntry.contains("domain=")) { // Process domain white list entries. - // Parse the entry - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1); - String domains = filters.substring(filters.indexOf("domain=") + 7); - - if (entry.startsWith("|")) { // Initial domain white list entries. - // Strip the initial `|`. - entry = entry.substring(1); - - //noinspection StatementWithEmptyBody - if (entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. - // Do nothing. These entries are designed for filter options that Privacy Browser does not use. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else { // Initial domain white list entry. - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a domain initial triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainInitialWhiteList.add(domainTripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + - // thirdEntry + " - " + originalBlockListEntry); - } else { // Process a domain initial double entry. - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainInitialWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } - } else { // Process a domain initial single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - domainInitialWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } else if (entry.endsWith("|")) { // Final domain white list entries. - // Strip the `|` from the end of the entry. - entry = entry.substring(0, entry.length() - 1); - - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.contains("*")) { // Process a domain final white list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainFinalWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain final white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } else { // Process a domain final white list single entry. - // create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - domainFinalWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain final white list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - - } else { // Standard domain white list entries with filters. - //noinspection StatementWithEmptyBody - if (domains.contains("~")) { // It is uncertain what a `~` domain means inside an `@@` entry. - // Do Nothing - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else { - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // There are three or more entries. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - if (thirdEntry.contains("*")) { // Process a domain white list quadruple entry. - // Get the index of the wildcard. - int thirdWildcardIndex = thirdEntry.indexOf("*"); - - // Split the entry into components. - String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); - String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); - - // Create an entry string array. - String[] domainQuadrupleEntry = {domain, firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainQuadrupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + - // realThirdEntry + " , " + fourthEntry + " - " + originalBlockListEntry); - } else { // Process a domain white list triple entry. - // Create an entry string array. - String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainTripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + - // thirdEntry + " - " + originalBlockListEntry); - } - } else { // Process a domain white list double entry. - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } - } else { // Process a domain white list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added : " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } - } // Ignore all other filter entries. - } else if (blockListEntry.endsWith("|")) { // Final white list entries. - // Remove the final `|` from the entry. - String entry = blockListEntry.substring(0, blockListEntry.length() - 1); - - if (entry.contains("*")) { // Process a final white list double entry - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - finalWhiteList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process a final white list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the white list. - finalWhiteList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final white list added: " + entry + " - " + originalBlockListEntry); - } - } else { // Main white list entries. - if (blockListEntry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = blockListEntry.indexOf("*"); - - // Split the entry into components. - String firstEntry = blockListEntry.substring(0, wildcardIndex); - String secondEntry = blockListEntry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a main white list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the white list. - mainWhiteList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlockListEntry); - } else { // Process a main white list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - mainWhiteList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a main white list single entry. - // Create an entry string array. - String[] singleEntry = {blockListEntry, originalBlockListEntry}; - - // Add the entry to the white list. - mainWhiteList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main white list added: " + blockListEntry + " - " + originalBlockListEntry); - } - } - } else if (blockListEntry.endsWith("|")) { // Final black list entries. - // Strip out the final "|" - String entry = 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 (entry.startsWith("||")) { - entry = entry.substring(2); - } - - if (entry.contains("*")) { // Process a final black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process a final black list single entry. - // create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlockListEntry); - } - } else if (blockListEntry.contains("$")) { // Entries with 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")) { // Third-party entries. - //noinspection StatementWithEmptyBody - if (blockListEntry.contains("~third-party")) { // Third-party filter white list entries. - // Do not process these white list entries. They are designed to combine with block filters that Privacy Browser doesn't use, like `subdocument` and `xmlhttprequest`. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else if (blockListEntry.contains("domain=")) { // Third-party domain entries. - if (blockListEntry.startsWith("|")) { // Third-party domain initial entries. - // Strip the initial `|`. - blockListEntry = blockListEntry.substring(1); - - // Parse the entry - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1); - String domains = filters.substring(filters.indexOf("domain=") + 7); - - //noinspection StatementWithEmptyBody - if (entry.equals("http:") || entry.equals("https:") || entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. - // Do nothing. These entries will almost entirely disable the website. - // Often the original entry blocks filter options like `$script`, which Privacy Browser does not differentiate. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else { // Third-party domain initial entries. - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.contains("*")) { // Three are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a third-party domain initial black list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] tripleDomainEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyDomainInitialBlackList.add(tripleDomainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + - // " , " + thirdEntry + " - " + originalBlockListEntry); - } else { // Process a third-party domain initial black list double entry. - // Create an entry string array. - String[] doubleDomainEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyDomainInitialBlackList.add(doubleDomainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + firstEntry + " , " + secondEntry + - // " - " + originalBlockListEntry); - } - } else { // Process a third-party domain initial black list single entry. - // Create an entry string array. - String[] singleEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyDomainInitialBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } else if (blockListEntry.contains("\\")) { // Process a third-party domain black list regular expression. - // Parse the entry. At least one regular expression in this entry contains `$`, so the parser uses `/$`. - String entry = blockListEntry.substring(0, blockListEntry.indexOf("/$") + 1); - String filters = blockListEntry.substring(blockListEntry.indexOf("/$") + 2); - String domains = filters.substring(filters.indexOf("domain=") + 7); - - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyDomainRegularExpressionBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain regular expression black list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } while (domains.contains("|")); - } else { // Third-party domain entries. - // Parse the entry - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - String filters = blockListEntry.substring(blockListEntry.indexOf("$") + 1); - String domains = filters.substring(filters.indexOf("domain=") + 7); - - // Strip any trailing "*" from the entry. - if (entry.endsWith("*")) { - entry = entry.substring(0, entry.length() - 1); - } - - // Track if any third-party white list filters are applied. - boolean whiteListDomain = false; - - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // The is only one domain in the list. - domain = domains; - } - - // Differentiate between block list domains and white list domains. - if (domain.startsWith("~")) { // White list third-party domain entry. - // Strip the initial `~`. - domain = domain.substring(1); - - // Set the white list domain flag. - whiteListDomain = true; - - if (entry.contains("*")) { // Process a third-party domain white list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyDomainWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } else { // Process a third-party domain white list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - thirdPartyDomainWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } else { // Third-party domain black list entries. - if (entry.contains("*")) { // Process a third-party domain black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list - thirdPartyDomainBlackList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } else { // Process a third-party domain black list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyDomainBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party domain block list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } - } while (domains.contains("|")); - - // Add a third-party black list entry if a white list domain was processed. - if (whiteListDomain) { - if (entry.contains("*")) { // Process a third-party black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process a third-party black list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add an entry to the black list. - thirdPartyBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party black list added: " + entry + " - " + originalBlockListEntry); - } - } - } - } else if (blockListEntry.startsWith("|")) { // Third-party initial black list entries. - // Strip the initial `|`. - blockListEntry = blockListEntry.substring(1); - - // Get the entry. - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - - if (entry.contains("*")) { // Process a third-party initial black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] thirdPartyDoubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyInitialBlackList.add(thirdPartyDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process a third-party initial black list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyInitialBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party initial black list added: " + entry + " - " + originalBlockListEntry); - } - } else if (blockListEntry.contains("\\")) { // Process a regular expression black list entry. - // Prepare a string to hold the entry. - String entry; - - // Get the entry. - if (blockListEntry.contains("$/$")) { // The first `$` is part of the regular expression. - entry = blockListEntry.substring(0, blockListEntry.indexOf("$/$") + 2); - } else { // The only `$` indicates the filter options. - entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - } - - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyRegularExpressionBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party regular expression black list added: " + entry + " - " + originalBlockListEntry); - } else if (blockListEntry.contains("*")) { // Third-party and regular expression black list entries. - // Get the entry. - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - - if (entry.endsWith("*")) { // Process a third-party black list single entry. - // Strip the final `*`. - entry = entry.substring(0, entry.length() - 1); - - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third party black list added: " + entry + " - " + originalBlockListEntry); - } else { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // There are three or more entries. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - if (thirdEntry.contains("*")) { // Process a third-party black list quadruple entry. - // Get the index of the wildcard. - int thirdWildcardIndex = thirdEntry.indexOf("*"); - - // Split the entry into components. - String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); - String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); - - // Create an entry string array. - String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(quadrupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + - // fourthEntry + " - " + originalBlockListEntry); - } else { // Process a third-party black list triple entry. - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + - // originalBlockListEntry); - } - } else { // Process a third-party black list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } - } else { // Process a third party black list single entry. - // Get the entry. - String entry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - thirdPartyBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " third party black list added: " + entry + " - " + originalBlockListEntry); - } - } else if (blockListEntry.substring(blockListEntry.indexOf("$")).contains("domain=")) { // Domain entries. - if (blockListEntry.contains("~")) { // Domain white list entries. - // 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); - - // Strip any final `*` from the entry. They are redundant. - if (entry.endsWith("*")) { - entry = entry.substring(0, entry.length() - 1); - } - - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - // Strip the initial `~`. - domain = domain.substring(1); - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a domain white list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring((secondWildcardIndex + 1)); - - // Create an entry string array. - String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainTripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + - // " - " + originalBlockListEntry); - } else { // Process a domain white list double entry. - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a domain white list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the white list. - domainWhiteList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain white list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } else { // Domain black list entries. - // 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 item if the entry is not null. For example, some lines begin with `$websocket`, which create a null entry. - if (!entry.equals("")) { - // Process each domain. - do { - // Create a string to keep track of the current domain. - String domain; - - if (domains.contains("|")) { // There is more than one domain in the list. - // Get the first domain from the list. - domain = domains.substring(0, domains.indexOf("|")); - - // Remove the first domain from the list. - domains = domains.substring(domains.indexOf("|") + 1); - } else { // There is only one domain in the list. - domain = domains; - } - - if (entry.startsWith("|")) { // Domain initial black list entries. - // 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. - - //Log.i("BlockLists", headers.get(1)[0] + " not added: " + originalBlockListEntry); - } else { // Process a domain initial black list entry - // Create an entry string array. - String[] domainEntry = {domain, entryBase, originalBlockListEntry}; - - // Add the entry to the black list. - domainInitialBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain initial black list added: " + domain + " , " + entryBase + " - " + originalBlockListEntry); - } - } else if (entry.endsWith("|")) { // Domain final black list entries. - // Remove the final `|`. - String entryBase = entry.substring(0, entry.length() - 1); - - if (entryBase.contains("*")) { // Process a domain final black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entryBase.substring(0, wildcardIndex); - String secondEntry = entryBase.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - domainFinalBlackList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain final black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } else { // Process a domain final black list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entryBase, originalBlockListEntry}; - - // Add the entry to the black list. - domainFinalBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain final black list added: " + domain + " , " + entryBase + " - " + originalBlockListEntry); - } - } else if (entry.contains("\\")) { // Process a domain regular expression black list entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the black list. - domainRegularExpressionBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain regular expression black list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } else if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a domain black list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - domainBlackList.add(domainTripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain black list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + - // " - " + originalBlockListEntry); - } else { // Process a domain black list double entry. - // Create an entry string array. - String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - domainBlackList.add(domainDoubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + - // originalBlockListEntry); - } - } else { // Process a domain black list single entry. - // Create an entry string array. - String[] domainEntry = {domain, entry, originalBlockListEntry}; - - // Add the entry to the black list. - domainBlackList.add(domainEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " domain black list added: " + domain + " , " + entry + " - " + originalBlockListEntry); - } - } while (domains.contains("|")); - } - } - } else if (blockListEntry.contains("~")) { // White list entries. Privacy Browser does not differentiate against these filter options, so they are just generally white listed. - // 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("*")) { // Process a white list double entry. - // Get the index of the wildcard. - int wildcardIndex = blockListEntry.indexOf("*"); - - // Split the entry into components. - String firstEntry = blockListEntry.substring(0, wildcardIndex); - String secondEntry = blockListEntry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the white list. - mainWhiteList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process a white list single entry. - // Create an entry string array. - String[] singleEntry = {blockListEntry, originalBlockListEntry}; - - // Add the entry to the white list. - mainWhiteList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main white list added: " + blockListEntry + " - + " + originalBlockListEntry); - } - } else if (blockListEntry.contains("\\")) { // Process a regular expression black list entry. - // Remove the filter options. - blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - - // Create an entry string array. - String[] singleEntry = {blockListEntry, originalBlockListEntry}; - - // Add the entry to the black list. - regularExpressionBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " regular expression black list added: " + blockListEntry + " - " + originalBlockListEntry); - } else { // Black list entries. - // Remove the filter options. - if (!blockListEntry.contains("$file")) { // EasyPrivacy contains an entry with `$file` that does not have filter options. - blockListEntry = blockListEntry.substring(0, blockListEntry.indexOf("$")); - } - - // Strip any trailing `*`. These are redundant. - if (blockListEntry.endsWith("*")) { - blockListEntry = blockListEntry.substring(0, blockListEntry.length() - 1); - } - - if (blockListEntry.startsWith("|")) { // Initial black list entries. - // Strip the initial `|`. - String entry = blockListEntry.substring(1); - - if (entry.contains("*")) { // Process an initial black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - initialBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process an initial black list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - initialBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " initial black list added: " + entry + " - " + originalBlockListEntry); - } - } else if (blockListEntry.endsWith("|")) { // Final black list entries. - // Ignore entries with `object` filters. They can block entire websites and don't have any meaning in the context of Privacy Browser. - if (!originalBlockListEntry.contains("$object")) { - // Strip the final `|`. - String entry = blockListEntry.substring(0, blockListEntry.length() - 1); - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a final black list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + - // originalBlockListEntry); - } else { // Process a final black list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a final black list single entry. - // Create an entry sting array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlockListEntry); - } - } - } else if (blockListEntry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = blockListEntry.indexOf("*"); - - // Split the entry into components. - String firstEntry = blockListEntry.substring(0, wildcardIndex); - String secondEntry = blockListEntry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a main black list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlockListEntry); - } else { // Process a main black list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a main black list single entry. - // Create an entry string array. - String[] singleEntry = {blockListEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + blockListEntry + " - " + originalBlockListEntry); - } - } - } else { // Main black list entries - // 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.startsWith("|")) { // Initial black list entries. - // Strip the initial `|`. - String entry = blockListEntry.substring(1); - - if (entry.contains("*")) { // Process an initial black list double entry. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - initialBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } else { // Process an initial black list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - initialBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " initial black list added: " + entry + " - " + originalBlockListEntry); - } - } else if (blockListEntry.endsWith("|")) { // Final black list entries. - // Strip the final `|`. - String entry = blockListEntry.substring(0, blockListEntry.length() - 1); - - if (entry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = entry.indexOf("*"); - - // Split the entry into components. - String firstEntry = entry.substring(0, wildcardIndex); - String secondEntry = entry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // Process a final black list triple entry. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + - // originalBlockListEntry); - } else { // Process a final black list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a final black list single entry. - // Create an entry string array. - String[] singleEntry = {entry, originalBlockListEntry}; - - // Add the entry to the black list. - finalBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlockListEntry); - } - } else { // Main black list entries. - if (blockListEntry.contains("*")) { // There are two or more entries. - // Get the index of the wildcard. - int wildcardIndex = blockListEntry.indexOf("*"); - - // Split the entry into components. - String firstEntry = blockListEntry.substring(0, wildcardIndex); - String secondEntry = blockListEntry.substring(wildcardIndex + 1); - - if (secondEntry.contains("*")) { // There are three or more entries. - // Get the index of the wildcard. - int secondWildcardIndex = secondEntry.indexOf("*"); - - // Split the entry into components. - String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); - String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); - - if (thirdEntry.contains("*")) { // There are four or more entries. - // Get the index of the wildcard. - int thirdWildcardIndex = thirdEntry.indexOf("*"); - - // Split the entry into components. - String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); - String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); - - if (fourthEntry.contains("*")) { // Process a main black list quintuple entry. - // Get the index of the wildcard. - int fourthWildcardIndex = fourthEntry.indexOf("*"); - - // Split the entry into components. - String realFourthEntry = fourthEntry.substring(0, fourthWildcardIndex); - String fifthEntry = fourthEntry.substring(fourthWildcardIndex + 1); - - // Create an entry string array. - String[] quintupleEntry = {firstEntry, realSecondEntry, realThirdEntry, realFourthEntry, fifthEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(quintupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + - // realFourthEntry + " , " + fifthEntry + " - " + originalBlockListEntry); - } else { // Process a main black list quadruple entry. - // Create an entry string array. - String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(quadrupleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + - // fourthEntry + " - " + originalBlockListEntry); - } - } else { // Process a main black list triple entry. - // Create an entry string array. - String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(tripleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlockListEntry); - } - } else { // Process a main black list double entry. - // Create an entry string array. - String[] doubleEntry = {firstEntry, secondEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(doubleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlockListEntry); - } - } else { // Process a main black list single entry. - // Create an entry string array. - String[] singleEntry = {blockListEntry, originalBlockListEntry}; - - // Add the entry to the black list. - mainBlackList.add(singleEntry); - - //Log.i("BlockLists", headers.get(1)[0] + " main black list added: " + blockListEntry + " - " + originalBlockListEntry); - } - } - } - } - // Close `bufferedReader`. - bufferedReader.close(); - } catch (IOException e) { - // The asset exists, so the `IOException` will never be thrown. - } - - // Initialize the combined list. - ArrayList> combinedLists = new ArrayList<>(); - - // Add the headers (0). - combinedLists.add(headers); // 0. - - // Add the white lists (1-8). - combinedLists.add(mainWhiteList); // 1. - combinedLists.add(finalWhiteList); // 2. - combinedLists.add(domainWhiteList); // 3. - combinedLists.add(domainInitialWhiteList); // 4. - combinedLists.add(domainFinalWhiteList); // 5. - combinedLists.add(thirdPartyWhiteList); // 6. - combinedLists.add(thirdPartyDomainWhiteList); // 7. - combinedLists.add(thirdPartyDomainInitialWhiteList); // 8. - - // Add the black lists (9-22). - combinedLists.add(mainBlackList); // 9. - combinedLists.add(initialBlackList); // 10. - combinedLists.add(finalBlackList); // 11. - combinedLists.add(domainBlackList); // 12. - combinedLists.add(domainInitialBlackList); // 13. - combinedLists.add(domainFinalBlackList); // 14. - combinedLists.add(domainRegularExpressionBlackList); // 15. - combinedLists.add(thirdPartyBlackList); // 16. - combinedLists.add(thirdPartyInitialBlackList); // 17. - combinedLists.add(thirdPartyDomainBlackList); // 18. - combinedLists.add(thirdPartyDomainInitialBlackList); // 19. - combinedLists.add(thirdPartyRegularExpressionBlackList); // 20. - combinedLists.add(thirdPartyDomainRegularExpressionBlackList); // 21. - combinedLists.add(regularExpressionBlackList); // 22. - - return combinedLists; - } - - public String[] checkBlocklist(String currentDomain, String resourceUrl, boolean isThirdPartyRequest, ArrayList> blockList) { - // Get the blocklist name. - String BLOCK_LIST_NAME_STRING = blockList.get(0).get(1)[0]; - - // Assert that currentDomain != null only if this is a third party request. Apparently, lint can't tell that this isn't redundant. - //noinspection RedundantIfStatement - if (isThirdPartyRequest) { - assert currentDomain != null; - } - - // Process the white lists. - // Main white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(MAIN_WHITELIST))) { - switch (whiteListEntry.length) { - case 2: // There is one entry. - if (resourceUrl.contains(whiteListEntry[0])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whiteListEntry[0], whiteListEntry[1]}; - } - break; - - case 3: // There are two entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - break; - - case 4: // There are three entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], whiteListEntry[3]}; - } - break; - } - } - - // Final white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(FINAL_WHITELIST))) { - if (whiteListEntry.length == 2) { // There is one entry. - if (resourceUrl.contains(whiteListEntry[0])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_WHITELIST, whiteListEntry[0], whiteListEntry[1]}; - } - } else { // There are two entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - } - } - - // Only check the domain lists if the current domain is not null (like `about:blank`). - if (currentDomain != null) { - // Domain white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(DOMAIN_WHITELIST))) { - switch (whiteListEntry.length) { - case 3: // There is one entry. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - break; - - case 4: // There are two entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - break; - - case 5: // There are three entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2]) && resourceUrl.contains(whiteListEntry[3])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2] + "\n" + - whiteListEntry[3], whiteListEntry[4]}; - } - break; - - case 6: // There are four entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2]) && resourceUrl.contains(whiteListEntry[3]) && - resourceUrl.contains(whiteListEntry[4])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2] + "\n" + - whiteListEntry[3] + "\n" + whiteListEntry[4], whiteListEntry[5]}; - } - break; - } - } - - // Domain initial white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(DOMAIN_INITIAL_WHITELIST))) { - switch (whiteListEntry.length) { - case 3: // There is one entry. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.startsWith(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - break; - - case 4: // There are two entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.startsWith(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - break; - - case 5: // There are three entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.startsWith(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2]) && resourceUrl.startsWith(whiteListEntry[3])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2] + "\n" + - whiteListEntry[3], whiteListEntry[4]}; - } - break; - } - } - - // Domain final white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(DOMAIN_FINAL_WHITELIST))) { - switch (whiteListEntry.length) { - case 3: // There is one entry; - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.endsWith(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - break; - - case 4: // There are two entries; - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.endsWith(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - break; - } - } - } - - // Only check the third-party white lists if this is a third-party request. - if (isThirdPartyRequest) { - // Third-party white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_WHITELIST))) { - switch (whiteListEntry.length) { - case 2: // There is one entry - if (resourceUrl.contains(whiteListEntry[0])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whiteListEntry[0], whiteListEntry[1]}; - } - break; - - case 3: // There are two entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - break; - - case 4: // There are three entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - break; - - case 5: // There are four entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2]) && resourceUrl.contains(whiteListEntry[3])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2] + "\n" + - whiteListEntry[3], whiteListEntry[4]}; - } - break; - - case 6: // There are five entries. - if (resourceUrl.contains(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2]) && resourceUrl.contains(whiteListEntry[3]) && - resourceUrl.contains(whiteListEntry[4])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2] + "\n" + - whiteListEntry[3] + "\n" + whiteListEntry[4], whiteListEntry[5]}; - } - break; - } - } - - // Third-party domain white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_DOMAIN_WHITELIST))) { - if (whiteListEntry.length == 3) { // There is one entry. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - } else { // There are two entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.contains(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - } - } - - // Third-party domain initial white list. - for (String[] whiteListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_DOMAIN_INITIAL_WHITELIST))) { - if (whiteListEntry.length == 3) { // There is one entry. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.startsWith(whiteListEntry[1])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1], whiteListEntry[2]}; - } - } else { // There are two entries. - if (currentDomain.endsWith(whiteListEntry[0]) && resourceUrl.startsWith(whiteListEntry[1]) && resourceUrl.contains(whiteListEntry[2])) { - // Return a whitelist match request allowed. - return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whiteListEntry[0] + "\n" + whiteListEntry[1] + "\n" + whiteListEntry[2], - whiteListEntry[3]}; - } - } - } - } - - // Process the black lists. - // Main black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(MAIN_BLACKLIST))) { - switch (blackListEntry.length) { - case 2: // There is one entry. - if (resourceUrl.contains(blackListEntry[0])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - break; - - case 3: // There are two entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are three entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], blackListEntry[3]}; - } - break; - - case 5: // There are four entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2]) && resourceUrl.contains(blackListEntry[3])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2] + "\n" + - blackListEntry[3], blackListEntry[4]}; - } - break; - - case 6: // There are five entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2]) && resourceUrl.contains(blackListEntry[3]) && - resourceUrl.contains(blackListEntry[4])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2] + "\n" + - blackListEntry[3] + "\n" + blackListEntry[4], blackListEntry[5]}; - } - break; - } - } - - // Initial black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(INITIAL_BLACKLIST))) { - if (blackListEntry.length == 2) { // There is one entry. - if (resourceUrl.startsWith(blackListEntry[0])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, INITIAL_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - } else { // There are two entries - if (resourceUrl.startsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } - } - - // Final black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(FINAL_BLACKLIST))) { - switch (blackListEntry.length) { - case 2: // There is one entry. - if (resourceUrl.endsWith(blackListEntry[0])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - break; - - case 3: // There are two entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.endsWith(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are three entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.endsWith(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], blackListEntry[3]}; - } - break; - } - } - - // Only check the domain lists if the current domain is not null (like `about:blank`). - if (currentDomain != null) { - // Domain black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(DOMAIN_BLACKLIST))) { - switch (blackListEntry.length) { - case 3: // There is one entry. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are two entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], - blackListEntry[3]}; - } - break; - - case 5: // There are three entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2]) && resourceUrl.contains(blackListEntry[3])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2] + "\n" + - blackListEntry[3], blackListEntry[4]}; - } - break; - } - } - - // Domain initial black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(DOMAIN_INITIAL_BLACKLIST))) { - // Store the entry in the resource request log. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.startsWith(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } - - // Domain final black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(DOMAIN_FINAL_BLACKLIST))) { - switch (blackListEntry.length) { - case 3: // There is one entry. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.endsWith(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are two entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.endsWith(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], - blackListEntry[3]}; - } - break; - } - } - - // Domain regular expression black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(DOMAIN_REGULAR_EXPRESSION_BLACKLIST))) { - if (currentDomain.endsWith(blackListEntry[0]) && Pattern.matches(blackListEntry[1], resourceUrl)) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_REGULAR_EXPRESSION_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } - } - - // Only check the third-party black lists if this is a third-party request. - if (isThirdPartyRequest) { - // Third-party black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_BLACKLIST))) { - switch (blackListEntry.length) { - case 2: // There is one entry. - if (resourceUrl.contains(blackListEntry[0])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - break; - - case 3: // There are two entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are three entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], - blackListEntry[3]}; - } - break; - - case 5: // There are four entries. - if (resourceUrl.contains(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2]) && resourceUrl.contains(blackListEntry[3])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2] + "\n" + - blackListEntry[3], blackListEntry[4]}; - } - break; - } - } - - // Third-party initial black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_INITIAL_BLACKLIST))) { - if (blackListEntry.length == 2) { // There is one entry. - if (resourceUrl.startsWith(blackListEntry[0])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_INITIAL_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - } else { // There are two entries. - if (resourceUrl.startsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } - } - - // Third-party domain black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_DOMAIN_BLACKLIST))) { - if (blackListEntry.length == 3) { // There is one entry. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } else { // There are two entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.contains(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + blackListEntry[2], - blackListEntry[3]}; - } - } - } - - // Third-party domain initial black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST))) { - switch (blackListEntry.length) { - case 3: // There is one entry. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.startsWith(blackListEntry[1])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - break; - - case 4: // There are two entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.startsWith(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + - blackListEntry[2], blackListEntry[3]}; - } - break; - - case 5: // There are three entries. - if (currentDomain.endsWith(blackListEntry[0]) && resourceUrl.startsWith(blackListEntry[1]) && resourceUrl.contains(blackListEntry[2]) && resourceUrl.contains(blackListEntry[3])) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1] + "\n" + - blackListEntry[2] + "\n" + blackListEntry[3], blackListEntry[4]}; - } - break; - } - } - - // Third-party regular expression black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST))) { - if (Pattern.matches(blackListEntry[0], resourceUrl)) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - } - - // Third-party domain regular expression black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST))) { - if (currentDomain.endsWith(blackListEntry[0]) && Pattern.matches(blackListEntry[1], resourceUrl)) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST, blackListEntry[0] + "\n" + blackListEntry[1], blackListEntry[2]}; - } - } - } - - // Regular expression black list. - for (String[] blackListEntry : blockList.get(Integer.valueOf(REGULAR_EXPRESSION_BLACKLIST))) { - if (Pattern.matches(blackListEntry[0], resourceUrl)) { - // Return a blacklist match request blocked. - return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, REGULAR_EXPRESSION_BLACKLIST, blackListEntry[0], blackListEntry[1]}; - } - } - - // Return a no match request default. - return new String[] {REQUEST_DEFAULT}; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stoutner/privacybrowser/helpers/BlocklistHelper.java b/app/src/main/java/com/stoutner/privacybrowser/helpers/BlocklistHelper.java new file mode 100644 index 00000000..913cc0b1 --- /dev/null +++ b/app/src/main/java/com/stoutner/privacybrowser/helpers/BlocklistHelper.java @@ -0,0 +1,2121 @@ +/* + * Copyright © 2018-2019 Soren Stoutner . + * + * This file is part of Privacy Browser . + * + * Privacy Browser is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Privacy Browser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Privacy Browser. If not, see . + */ + +package com.stoutner.privacybrowser.helpers; + +import android.content.res.AssetManager; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class BlocklistHelper { + // Describe the schema of the string array in each entry of the resource requests array list. + public final static int REQUEST_DISPOSITION = 0; + public final static int REQUEST_URL = 1; + public final static int REQUEST_BLOCKLIST = 2; + public final static int REQUEST_SUBLIST = 3; + public final static int REQUEST_BLOCKLIST_ENTRIES = 4; + public final static int REQUEST_BLOCKLIST_ORIGINAL_ENTRY = 5; + + // The request disposition options. + public final static String REQUEST_DEFAULT = "0"; + public final static String REQUEST_ALLOWED = "1"; + public final static String REQUEST_THIRD_PARTY = "2"; + public final static String REQUEST_BLOCKED = "3"; + + // The whitelists. + public final static String MAIN_WHITELIST = "1"; + public final static String FINAL_WHITELIST = "2"; + public final static String DOMAIN_WHITELIST = "3"; + public final static String DOMAIN_INITIAL_WHITELIST = "4"; + public final static String DOMAIN_FINAL_WHITELIST = "5"; + public final static String THIRD_PARTY_WHITELIST = "6"; + public final static String THIRD_PARTY_DOMAIN_WHITELIST = "7"; + public final static String THIRD_PARTY_DOMAIN_INITIAL_WHITELIST = "8"; + + // The blacklists. + public final static String MAIN_BLACKLIST = "9"; + public final static String INITIAL_BLACKLIST = "10"; + public final static String FINAL_BLACKLIST = "11"; + public final static String DOMAIN_BLACKLIST = "12"; + public final static String DOMAIN_INITIAL_BLACKLIST = "13"; + public final static String DOMAIN_FINAL_BLACKLIST = "14"; + public final static String DOMAIN_REGULAR_EXPRESSION_BLACKLIST = "15"; + public final static String THIRD_PARTY_BLACKLIST = "16"; + public final static String THIRD_PARTY_INITIAL_BLACKLIST = "17"; + public final static String THIRD_PARTY_DOMAIN_BLACKLIST = "18"; + public final static String THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST = "19"; + public final static String THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST = "20"; + public final static String THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST = "21"; + public final static String REGULAR_EXPRESSION_BLACKLIST = "22"; + + public ArrayList> parseBlocklist(AssetManager assets, String blocklistName) { + // Initialize the header list. + List headers = new ArrayList<>(); // 0. + + // Initialize the whitelists. + List mainWhitelist = new ArrayList<>(); // 1. + List finalWhitelist = new ArrayList<>(); // 2. + List domainWhitelist = new ArrayList<>(); // 3. + List domainInitialWhitelist = new ArrayList<>(); // 4. + List domainFinalWhitelist = new ArrayList<>(); // 5. + List thirdPartyWhitelist = new ArrayList<>(); // 6. + List thirdPartyDomainWhitelist = new ArrayList<>(); // 7. + List thirdPartyDomainInitialWhitelist = new ArrayList<>(); // 8. + + // Initialize the blacklists + List mainBlacklist = new ArrayList<>(); // 9. + List initialBlacklist = new ArrayList<>(); // 10. + List finalBlacklist = new ArrayList<>(); // 11. + List domainBlacklist = new ArrayList<>(); // 12. + List domainInitialBlacklist = new ArrayList<>(); // 13. + List domainFinalBlacklist = new ArrayList<>(); // 14. + List domainRegularExpressionBlacklist = new ArrayList<>(); // 15. + List thirdPartyBlacklist = new ArrayList<>(); // 16. + List thirdPartyInitialBlacklist = new ArrayList<>(); // 17. + List thirdPartyDomainBlacklist = new ArrayList<>(); // 18. + List thirdPartyDomainInitialBlacklist = new ArrayList<>(); // 19. + List regularExpressionBlacklist = new ArrayList<>(); // 20. + List thirdPartyRegularExpressionBlacklist = new ArrayList<>(); // 21. + List thirdPartyDomainRegularExpressionBlacklist = new ArrayList<>(); // 22. + + + // Populate the block lists. The `try` is required by `InputStreamReader`. + try { + // Load the block list into a `BufferedReader`. + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(assets.open(blocklistName))); + + // Create a string for storing the block list entries. + String blocklistEntry; + + // Parse the block list. + while ((blocklistEntry = bufferedReader.readLine()) != null) { + // Store the original block list entry. + String originalBlocklistEntry = blocklistEntry; + + // Remove any `^` from the block list entry. Privacy Browser does not process them in the interest of efficiency. + blocklistEntry = blocklistEntry.replace("^", ""); + + //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("Blocklists", "Not added: " + blocklistEntry); + } else //noinspection StatementWithEmptyBody + if (blocklistEntry.contains("$csp=script-src")) { // Ignore entries that contain `$csp=script-src`. + // Do nothing. It is uncertain what this directive is even supposed to mean, and it is blocking entire websites like androidcentral.com. https://redmine.stoutner.com/issues/306. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else //noinspection StatementWithEmptyBody + if (blocklistEntry.contains("$websocket") || blocklistEntry.contains("$third-party,websocket") || blocklistEntry.contains("$script,websocket")) { // Ignore entries with `websocket`. + // Do nothing. Privacy Browser does not differentiate between websocket requests and other requests and these entries cause a lot of false positives. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else if (blocklistEntry.startsWith("!")) { // Comment entries. + if (blocklistEntry.startsWith("! Version:")) { + // Get the list version number. + String[] listVersion = {blocklistEntry.substring(11)}; + + // Store the list version in the headers list. + headers.add(listVersion); + } + + if (blocklistEntry.startsWith("! Title:")) { + // Get the list title. + String[] listTitle = {blocklistEntry.substring(9)}; + + // Store the list title in the headers list. + headers.add(listTitle); + } + + //Log.i("Blocklists", "Not added: " + blocklistEntry); + } else if (blocklistEntry.startsWith("@@")) { // Entries that begin with `@@` are whitelists. + // Remove the `@@` + blocklistEntry = blocklistEntry.substring(2); + + // Strip out any initial `||`. Privacy Browser doesn't differentiate items that only match against the end of the domain name. + if (blocklistEntry.startsWith("||")) { + blocklistEntry = blocklistEntry.substring(2); + } + + if (blocklistEntry.contains("$")) { // Filter entries. + //noinspection StatementWithEmptyBody + if (blocklistEntry.contains("~third-party")) { // Ignore entries that contain `~third-party`. + // Do nothing. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else if (blocklistEntry.contains("third-party")) { // Third-party white list entries. + if (blocklistEntry.contains("domain=")) { // Third-party domain white list entries. + // Parse the entry. + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + String filters = blocklistEntry.substring(blocklistEntry.indexOf("$") + 1); + String domains = filters.substring(filters.indexOf("domain=") + 7); + + //noinspection StatementWithEmptyBody + if (domains.contains("~")) { // It is uncertain what a `~` domain means inside an `@@` entry. + // Do Nothing + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else if (blocklistEntry.startsWith("|")) { // Third-party domain initial white list entries. + // Strip out the initial `|`. + entry = entry.substring(1); + + //noinspection StatementWithEmptyBody + if (entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. + // Do nothing. These entries are designed for filter options that Privacy Browser does not use. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else { // Process third-party domain initial white list entries. + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.contains("*")) { // Process a third-party domain initial white list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyDomainInitialWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain initial white list added: " + domain + " , " + firstEntry + " , " + secondEntry + + // " - " + originalBlocklistEntry); + } else { // Process a third-party domain initial white list single entry. + // Create a domain entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the third party domain initial white list. + thirdPartyDomainInitialWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain initial white list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } else { // Third-party domain entries. + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // three is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + // Remove any trailing `*` from the entry. + if (entry.endsWith("*")) { + entry = entry.substring(0, entry.length() - 1); + } + + if (entry.contains("*")) { // Process a third-party domain double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyDomainWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } else { // Process a third-party domain single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyDomainWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } else { // Process third-party white list entries. + // Parse the entry + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // There are three or more entries. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + if (thirdEntry.contains("*")) { // There are four or more entries. + // Get the index of the wildcard. + int thirdWildcardIndex = thirdEntry.indexOf("*"); + + // Split the entry into components. + String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); + String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); + + if (fourthEntry.contains("*")) { // Process a third-party white list quintuple entry. + // Get the index of the wildcard. + int fourthWildcardIndex = fourthEntry.indexOf("*"); + + // Split the entry into components. + String realFourthEntry = fourthEntry.substring(0, fourthWildcardIndex); + String fifthEntry = fourthEntry.substring(fourthWildcardIndex + 1); + + // Create an entry string array. + String[] quintupleEntry = {firstEntry, realSecondEntry, realThirdEntry, realFourthEntry, fifthEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyWhitelist.add(quintupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + + // realFourthEntry + " , " + fifthEntry + " - " + originalBlocklistEntry); + } else { // Process a third-party white list quadruple entry. + // Create an entry string array. + String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyWhitelist.add(quadrupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + + // fourthEntry + " - " + originalBlocklistEntry); + } + } else { // Process a third-party white list triple entry. + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyWhitelist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + + // originalBlocklistEntry); + } + } else { // Process a third-party white list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyWhitelist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a third-party white list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyWhitelist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain white list added: " + entry + " - " + originalBlocklistEntry); + } + } + } else if (blocklistEntry.contains("domain=")) { // Process domain white list entries. + // Parse the entry + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + String filters = blocklistEntry.substring(blocklistEntry.indexOf("$") + 1); + String domains = filters.substring(filters.indexOf("domain=") + 7); + + if (entry.startsWith("|")) { // Initial domain white list entries. + // Strip the initial `|`. + entry = entry.substring(1); + + //noinspection StatementWithEmptyBody + if (entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. + // Do nothing. These entries are designed for filter options that Privacy Browser does not use. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else { // Initial domain white list entry. + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a domain initial triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainInitialWhitelist.add(domainTripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + + // thirdEntry + " - " + originalBlocklistEntry); + } else { // Process a domain initial double entry. + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainInitialWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } + } else { // Process a domain initial single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainInitialWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain initial white list entry added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } else if (entry.endsWith("|")) { // Final domain white list entries. + // Strip the `|` from the end of the entry. + entry = entry.substring(0, entry.length() - 1); + + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.contains("*")) { // Process a domain final white list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainFinalWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain final white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } else { // Process a domain final white list single entry. + // create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainFinalWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain final white list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + + } else { // Standard domain white list entries with filters. + //noinspection StatementWithEmptyBody + if (domains.contains("~")) { // It is uncertain what a `~` domain means inside an `@@` entry. + // Do Nothing + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else { + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // There are three or more entries. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + if (thirdEntry.contains("*")) { // Process a domain white list quadruple entry. + // Get the index of the wildcard. + int thirdWildcardIndex = thirdEntry.indexOf("*"); + + // Split the entry into components. + String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); + String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); + + // Create an entry string array. + String[] domainQuadrupleEntry = {domain, firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainQuadrupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + + // realThirdEntry + " , " + fourthEntry + " - " + originalBlocklistEntry); + } else { // Process a domain white list triple entry. + // Create an entry string array. + String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainTripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + + // thirdEntry + " - " + originalBlocklistEntry); + } + } else { // Process a domain white list double entry. + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added : " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } + } else { // Process a domain white list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added : " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } + } // Ignore all other filter entries. + } else if (blocklistEntry.endsWith("|")) { // Final white list entries. + // Remove the final `|` from the entry. + String entry = blocklistEntry.substring(0, blocklistEntry.length() - 1); + + if (entry.contains("*")) { // Process a final white list double entry + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + finalWhitelist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process a final white list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the white list. + finalWhitelist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final white list added: " + entry + " - " + originalBlocklistEntry); + } + } else { // Main white list entries. + if (blocklistEntry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = blocklistEntry.indexOf("*"); + + // Split the entry into components. + String firstEntry = blocklistEntry.substring(0, wildcardIndex); + String secondEntry = blocklistEntry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a main white list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + mainWhitelist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlocklistEntry); + } else { // Process a main white list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + mainWhitelist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a main white list single entry. + // Create an entry string array. + String[] singleEntry = {blocklistEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + mainWhitelist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main white list added: " + blocklistEntry + " - " + originalBlocklistEntry); + } + } + } else if (blocklistEntry.endsWith("|")) { // Final black list entries. + // Strip out the final "|" + String entry = 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 (entry.startsWith("||")) { + entry = entry.substring(2); + } + + if (entry.contains("*")) { // Process a final black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process a final black list single entry. + // create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlocklistEntry); + } + } else if (blocklistEntry.contains("$")) { // Entries with 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")) { // Third-party entries. + //noinspection StatementWithEmptyBody + if (blocklistEntry.contains("~third-party")) { // Third-party filter white list entries. + // Do not process these white list entries. They are designed to combine with block filters that Privacy Browser doesn't use, like `subdocument` and `xmlhttprequest`. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else if (blocklistEntry.contains("domain=")) { // Third-party domain entries. + if (blocklistEntry.startsWith("|")) { // Third-party domain initial entries. + // Strip the initial `|`. + blocklistEntry = blocklistEntry.substring(1); + + // Parse the entry + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + String filters = blocklistEntry.substring(blocklistEntry.indexOf("$") + 1); + String domains = filters.substring(filters.indexOf("domain=") + 7); + + //noinspection StatementWithEmptyBody + if (entry.equals("http:") || entry.equals("https:") || entry.equals("http://") || entry.equals("https://")) { // Ignore generic entries. + // Do nothing. These entries will almost entirely disable the website. + // Often the original entry blocks filter options like `$script`, which Privacy Browser does not differentiate. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else { // Third-party domain initial entries. + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.contains("*")) { // Three are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a third-party domain initial black list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] tripleDomainEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyDomainInitialBlacklist.add(tripleDomainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + + // " , " + thirdEntry + " - " + originalBlocklistEntry); + } else { // Process a third-party domain initial black list double entry. + // Create an entry string array. + String[] doubleDomainEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyDomainInitialBlacklist.add(doubleDomainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + firstEntry + " , " + secondEntry + + // " - " + originalBlocklistEntry); + } + } else { // Process a third-party domain initial black list single entry. + // Create an entry string array. + String[] singleEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyDomainInitialBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain initial black list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } else if (blocklistEntry.contains("\\")) { // Process a third-party domain black list regular expression. + // Parse the entry. At least one regular expression in this entry contains `$`, so the parser uses `/$`. + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("/$") + 1); + String filters = blocklistEntry.substring(blocklistEntry.indexOf("/$") + 2); + String domains = filters.substring(filters.indexOf("domain=") + 7); + + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyDomainRegularExpressionBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain regular expression black list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } while (domains.contains("|")); + } else { // Third-party domain entries. + // Parse the entry + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + String filters = blocklistEntry.substring(blocklistEntry.indexOf("$") + 1); + String domains = filters.substring(filters.indexOf("domain=") + 7); + + // Strip any trailing "*" from the entry. + if (entry.endsWith("*")) { + entry = entry.substring(0, entry.length() - 1); + } + + // Track if any third-party white list filters are applied. + boolean whitelistDomain = false; + + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // The is only one domain in the list. + domain = domains; + } + + // Differentiate between block list domains and white list domains. + if (domain.startsWith("~")) { // White list third-party domain entry. + // Strip the initial `~`. + domain = domain.substring(1); + + // Set the white list domain flag. + whitelistDomain = true; + + if (entry.contains("*")) { // Process a third-party domain white list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyDomainWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } else { // Process a third-party domain white list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + thirdPartyDomainWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain white list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } else { // Third-party domain black list entries. + if (entry.contains("*")) { // Process a third-party domain black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list + thirdPartyDomainBlacklist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } else { // Process a third-party domain black list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyDomainBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party domain block list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } + } while (domains.contains("|")); + + // Add a third-party black list entry if a white list domain was processed. + if (whitelistDomain) { + if (entry.contains("*")) { // Process a third-party black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process a third-party black list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add an entry to the black list. + thirdPartyBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party black list added: " + entry + " - " + originalBlocklistEntry); + } + } + } + } else if (blocklistEntry.startsWith("|")) { // Third-party initial black list entries. + // Strip the initial `|`. + blocklistEntry = blocklistEntry.substring(1); + + // Get the entry. + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + + if (entry.contains("*")) { // Process a third-party initial black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] thirdPartyDoubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyInitialBlacklist.add(thirdPartyDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process a third-party initial black list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyInitialBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party initial black list added: " + entry + " - " + originalBlocklistEntry); + } + } else if (blocklistEntry.contains("\\")) { // Process a regular expression black list entry. + // Prepare a string to hold the entry. + String entry; + + // Get the entry. + if (blocklistEntry.contains("$/$")) { // The first `$` is part of the regular expression. + entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$/$") + 2); + } else { // The only `$` indicates the filter options. + entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + } + + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyRegularExpressionBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party regular expression black list added: " + entry + " - " + originalBlocklistEntry); + } else if (blocklistEntry.contains("*")) { // Third-party and regular expression black list entries. + // Get the entry. + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + + if (entry.endsWith("*")) { // Process a third-party black list single entry. + // Strip the final `*`. + entry = entry.substring(0, entry.length() - 1); + + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third party black list added: " + entry + " - " + originalBlocklistEntry); + } else { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // There are three or more entries. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + if (thirdEntry.contains("*")) { // Process a third-party black list quadruple entry. + // Get the index of the wildcard. + int thirdWildcardIndex = thirdEntry.indexOf("*"); + + // Split the entry into components. + String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); + String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); + + // Create an entry string array. + String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(quadrupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + + // fourthEntry + " - " + originalBlocklistEntry); + } else { // Process a third-party black list triple entry. + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + + // originalBlocklistEntry); + } + } else { // Process a third-party black list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third-party black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } + } else { // Process a third party black list single entry. + // Get the entry. + String entry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + thirdPartyBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " third party black list added: " + entry + " - " + originalBlocklistEntry); + } + } else if (blocklistEntry.substring(blocklistEntry.indexOf("$")).contains("domain=")) { // Domain entries. + if (blocklistEntry.contains("~")) { // Domain white list entries. + // 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); + + // Strip any final `*` from the entry. They are redundant. + if (entry.endsWith("*")) { + entry = entry.substring(0, entry.length() - 1); + } + + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + // Strip the initial `~`. + domain = domain.substring(1); + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a domain white list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring((secondWildcardIndex + 1)); + + // Create an entry string array. + String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainTripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + + // " - " + originalBlocklistEntry); + } else { // Process a domain white list double entry. + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a domain white list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the white list. + domainWhitelist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain white list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } else { // Domain black list entries. + // 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 item if the entry is not null. For example, some lines begin with `$websocket`, which create a null entry. + if (!entry.equals("")) { + // Process each domain. + do { + // Create a string to keep track of the current domain. + String domain; + + if (domains.contains("|")) { // There is more than one domain in the list. + // Get the first domain from the list. + domain = domains.substring(0, domains.indexOf("|")); + + // Remove the first domain from the list. + domains = domains.substring(domains.indexOf("|") + 1); + } else { // There is only one domain in the list. + domain = domains; + } + + if (entry.startsWith("|")) { // Domain initial black list entries. + // 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. + + //Log.i("Blocklists", headers.get(1)[0] + " not added: " + originalBlocklistEntry); + } else { // Process a domain initial black list entry + // Create an entry string array. + String[] domainEntry = {domain, entryBase, originalBlocklistEntry}; + + // Add the entry to the black list. + domainInitialBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain initial black list added: " + domain + " , " + entryBase + " - " + originalBlocklistEntry); + } + } else if (entry.endsWith("|")) { // Domain final black list entries. + // Remove the final `|`. + String entryBase = entry.substring(0, entry.length() - 1); + + if (entryBase.contains("*")) { // Process a domain final black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entryBase.substring(0, wildcardIndex); + String secondEntry = entryBase.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + domainFinalBlacklist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain final black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } else { // Process a domain final black list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entryBase, originalBlocklistEntry}; + + // Add the entry to the black list. + domainFinalBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain final black list added: " + domain + " , " + entryBase + " - " + originalBlocklistEntry); + } + } else if (entry.contains("\\")) { // Process a domain regular expression black list entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the black list. + domainRegularExpressionBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain regular expression black list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } else if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a domain black list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] domainTripleEntry = {domain, firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + domainBlacklist.add(domainTripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain black list added: " + domain + " , " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + + // " - " + originalBlocklistEntry); + } else { // Process a domain black list double entry. + // Create an entry string array. + String[] domainDoubleEntry = {domain, firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + domainBlacklist.add(domainDoubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain black list added: " + domain + " , " + firstEntry + " , " + secondEntry + " - " + + // originalBlocklistEntry); + } + } else { // Process a domain black list single entry. + // Create an entry string array. + String[] domainEntry = {domain, entry, originalBlocklistEntry}; + + // Add the entry to the black list. + domainBlacklist.add(domainEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " domain black list added: " + domain + " , " + entry + " - " + originalBlocklistEntry); + } + } while (domains.contains("|")); + } + } + } else if (blocklistEntry.contains("~")) { // White list entries. Privacy Browser does not differentiate against these filter options, so they are just generally white listed. + // 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("*")) { // Process a white list double entry. + // Get the index of the wildcard. + int wildcardIndex = blocklistEntry.indexOf("*"); + + // Split the entry into components. + String firstEntry = blocklistEntry.substring(0, wildcardIndex); + String secondEntry = blocklistEntry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + mainWhitelist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main white list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process a white list single entry. + // Create an entry string array. + String[] singleEntry = {blocklistEntry, originalBlocklistEntry}; + + // Add the entry to the white list. + mainWhitelist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main white list added: " + blocklistEntry + " - + " + originalBlocklistEntry); + } + } else if (blocklistEntry.contains("\\")) { // Process a regular expression black list entry. + // Remove the filter options. + blocklistEntry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + + // Create an entry string array. + String[] singleEntry = {blocklistEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + regularExpressionBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " regular expression black list added: " + blocklistEntry + " - " + originalBlocklistEntry); + } else { // Black list entries. + // Remove the filter options. + if (!blocklistEntry.contains("$file")) { // EasyPrivacy contains an entry with `$file` that does not have filter options. + blocklistEntry = blocklistEntry.substring(0, blocklistEntry.indexOf("$")); + } + + // Strip any trailing `*`. These are redundant. + if (blocklistEntry.endsWith("*")) { + blocklistEntry = blocklistEntry.substring(0, blocklistEntry.length() - 1); + } + + if (blocklistEntry.startsWith("|")) { // Initial black list entries. + // Strip the initial `|`. + String entry = blocklistEntry.substring(1); + + if (entry.contains("*")) { // Process an initial black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + initialBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process an initial black list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + initialBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " initial black list added: " + entry + " - " + originalBlocklistEntry); + } + } else if (blocklistEntry.endsWith("|")) { // Final black list entries. + // Ignore entries with `object` filters. They can block entire websites and don't have any meaning in the context of Privacy Browser. + if (!originalBlocklistEntry.contains("$object")) { + // Strip the final `|`. + String entry = blocklistEntry.substring(0, blocklistEntry.length() - 1); + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a final black list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + + // originalBlocklistEntry); + } else { // Process a final black list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a final black list single entry. + // Create an entry sting array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlocklistEntry); + } + } + } else if (blocklistEntry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = blocklistEntry.indexOf("*"); + + // Split the entry into components. + String firstEntry = blocklistEntry.substring(0, wildcardIndex); + String secondEntry = blocklistEntry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a main black list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlocklistEntry); + } else { // Process a main black list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a main black list single entry. + // Create an entry string array. + String[] singleEntry = {blocklistEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + blocklistEntry + " - " + originalBlocklistEntry); + } + } + } else { // Main black list entries + // 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.startsWith("|")) { // Initial black list entries. + // Strip the initial `|`. + String entry = blocklistEntry.substring(1); + + if (entry.contains("*")) { // Process an initial black list double entry. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + initialBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " initial black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } else { // Process an initial black list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + initialBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " initial black list added: " + entry + " - " + originalBlocklistEntry); + } + } else if (blocklistEntry.endsWith("|")) { // Final black list entries. + // Strip the final `|`. + String entry = blocklistEntry.substring(0, blocklistEntry.length() - 1); + + if (entry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = entry.indexOf("*"); + + // Split the entry into components. + String firstEntry = entry.substring(0, wildcardIndex); + String secondEntry = entry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // Process a final black list triple entry. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + + // originalBlocklistEntry); + } else { // Process a final black list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a final black list single entry. + // Create an entry string array. + String[] singleEntry = {entry, originalBlocklistEntry}; + + // Add the entry to the black list. + finalBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " final black list added: " + entry + " - " + originalBlocklistEntry); + } + } else { // Main black list entries. + if (blocklistEntry.contains("*")) { // There are two or more entries. + // Get the index of the wildcard. + int wildcardIndex = blocklistEntry.indexOf("*"); + + // Split the entry into components. + String firstEntry = blocklistEntry.substring(0, wildcardIndex); + String secondEntry = blocklistEntry.substring(wildcardIndex + 1); + + if (secondEntry.contains("*")) { // There are three or more entries. + // Get the index of the wildcard. + int secondWildcardIndex = secondEntry.indexOf("*"); + + // Split the entry into components. + String realSecondEntry = secondEntry.substring(0, secondWildcardIndex); + String thirdEntry = secondEntry.substring(secondWildcardIndex + 1); + + if (thirdEntry.contains("*")) { // There are four or more entries. + // Get the index of the wildcard. + int thirdWildcardIndex = thirdEntry.indexOf("*"); + + // Split the entry into components. + String realThirdEntry = thirdEntry.substring(0, thirdWildcardIndex); + String fourthEntry = thirdEntry.substring(thirdWildcardIndex + 1); + + if (fourthEntry.contains("*")) { // Process a main black list quintuple entry. + // Get the index of the wildcard. + int fourthWildcardIndex = fourthEntry.indexOf("*"); + + // Split the entry into components. + String realFourthEntry = fourthEntry.substring(0, fourthWildcardIndex); + String fifthEntry = fourthEntry.substring(fourthWildcardIndex + 1); + + // Create an entry string array. + String[] quintupleEntry = {firstEntry, realSecondEntry, realThirdEntry, realFourthEntry, fifthEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(quintupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + + // realFourthEntry + " , " + fifthEntry + " - " + originalBlocklistEntry); + } else { // Process a main black list quadruple entry. + // Create an entry string array. + String[] quadrupleEntry = {firstEntry, realSecondEntry, realThirdEntry, fourthEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(quadrupleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + realThirdEntry + " , " + + // fourthEntry + " - " + originalBlocklistEntry); + } + } else { // Process a main black list triple entry. + // Create an entry string array. + String[] tripleEntry = {firstEntry, realSecondEntry, thirdEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(tripleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + realSecondEntry + " , " + thirdEntry + " - " + originalBlocklistEntry); + } + } else { // Process a main black list double entry. + // Create an entry string array. + String[] doubleEntry = {firstEntry, secondEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(doubleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + firstEntry + " , " + secondEntry + " - " + originalBlocklistEntry); + } + } else { // Process a main black list single entry. + // Create an entry string array. + String[] singleEntry = {blocklistEntry, originalBlocklistEntry}; + + // Add the entry to the black list. + mainBlacklist.add(singleEntry); + + //Log.i("Blocklists", headers.get(1)[0] + " main black list added: " + blocklistEntry + " - " + originalBlocklistEntry); + } + } + } + } + // Close `bufferedReader`. + bufferedReader.close(); + } catch (IOException e) { + // The asset exists, so the `IOException` will never be thrown. + } + + // Initialize the combined list. + ArrayList> combinedLists = new ArrayList<>(); + + // Add the headers (0). + combinedLists.add(headers); // 0. + + // Add the white lists (1-8). + combinedLists.add(mainWhitelist); // 1. + combinedLists.add(finalWhitelist); // 2. + combinedLists.add(domainWhitelist); // 3. + combinedLists.add(domainInitialWhitelist); // 4. + combinedLists.add(domainFinalWhitelist); // 5. + combinedLists.add(thirdPartyWhitelist); // 6. + combinedLists.add(thirdPartyDomainWhitelist); // 7. + combinedLists.add(thirdPartyDomainInitialWhitelist); // 8. + + // Add the black lists (9-22). + combinedLists.add(mainBlacklist); // 9. + combinedLists.add(initialBlacklist); // 10. + combinedLists.add(finalBlacklist); // 11. + combinedLists.add(domainBlacklist); // 12. + combinedLists.add(domainInitialBlacklist); // 13. + combinedLists.add(domainFinalBlacklist); // 14. + combinedLists.add(domainRegularExpressionBlacklist); // 15. + combinedLists.add(thirdPartyBlacklist); // 16. + combinedLists.add(thirdPartyInitialBlacklist); // 17. + combinedLists.add(thirdPartyDomainBlacklist); // 18. + combinedLists.add(thirdPartyDomainInitialBlacklist); // 19. + combinedLists.add(thirdPartyRegularExpressionBlacklist); // 20. + combinedLists.add(thirdPartyDomainRegularExpressionBlacklist); // 21. + combinedLists.add(regularExpressionBlacklist); // 22. + + return combinedLists; + } + + public String[] checkBlocklist(String currentDomain, String resourceUrl, boolean isThirdPartyRequest, ArrayList> blocklist) { + // Get the blocklist name. + String BLOCK_LIST_NAME_STRING = blocklist.get(0).get(1)[0]; + + // Assert that currentDomain != null only if this is a third party request. Apparently, lint can't tell that this isn't redundant. + //noinspection RedundantIfStatement + if (isThirdPartyRequest) { + assert currentDomain != null; + } + + // Process the white lists. + // Main white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(MAIN_WHITELIST))) { + switch (whitelistEntry.length) { + case 2: // There is one entry. + if (resourceUrl.contains(whitelistEntry[0])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whitelistEntry[0], whitelistEntry[1]}; + } + break; + + case 3: // There are two entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + break; + + case 4: // There are three entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], whitelistEntry[3]}; + } + break; + } + } + + // Final white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(FINAL_WHITELIST))) { + if (whitelistEntry.length == 2) { // There is one entry. + if (resourceUrl.contains(whitelistEntry[0])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_WHITELIST, whitelistEntry[0], whitelistEntry[1]}; + } + } else { // There are two entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + } + } + + // Only check the domain lists if the current domain is not null (like `about:blank`). + if (currentDomain != null) { + // Domain white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(DOMAIN_WHITELIST))) { + switch (whitelistEntry.length) { + case 3: // There is one entry. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + break; + + case 4: // There are two entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + break; + + case 5: // There are three entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2]) && resourceUrl.contains(whitelistEntry[3])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2] + "\n" + + whitelistEntry[3], whitelistEntry[4]}; + } + break; + + case 6: // There are four entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2]) && resourceUrl.contains(whitelistEntry[3]) && + resourceUrl.contains(whitelistEntry[4])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2] + "\n" + + whitelistEntry[3] + "\n" + whitelistEntry[4], whitelistEntry[5]}; + } + break; + } + } + + // Domain initial white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(DOMAIN_INITIAL_WHITELIST))) { + switch (whitelistEntry.length) { + case 3: // There is one entry. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.startsWith(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + break; + + case 4: // There are two entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.startsWith(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + break; + + case 5: // There are three entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.startsWith(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2]) && resourceUrl.startsWith(whitelistEntry[3])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2] + "\n" + + whitelistEntry[3], whitelistEntry[4]}; + } + break; + } + } + + // Domain final white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(DOMAIN_FINAL_WHITELIST))) { + switch (whitelistEntry.length) { + case 3: // There is one entry; + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.endsWith(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + break; + + case 4: // There are two entries; + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.endsWith(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + break; + } + } + } + + // Only check the third-party white lists if this is a third-party request. + if (isThirdPartyRequest) { + // Third-party white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_WHITELIST))) { + switch (whitelistEntry.length) { + case 2: // There is one entry + if (resourceUrl.contains(whitelistEntry[0])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whitelistEntry[0], whitelistEntry[1]}; + } + break; + + case 3: // There are two entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + break; + + case 4: // There are three entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + break; + + case 5: // There are four entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2]) && resourceUrl.contains(whitelistEntry[3])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2] + "\n" + + whitelistEntry[3], whitelistEntry[4]}; + } + break; + + case 6: // There are five entries. + if (resourceUrl.contains(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2]) && resourceUrl.contains(whitelistEntry[3]) && + resourceUrl.contains(whitelistEntry[4])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2] + "\n" + + whitelistEntry[3] + "\n" + whitelistEntry[4], whitelistEntry[5]}; + } + break; + } + } + + // Third-party domain white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_DOMAIN_WHITELIST))) { + if (whitelistEntry.length == 3) { // There is one entry. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + } else { // There are two entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.contains(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + } + } + + // Third-party domain initial white list. + for (String[] whitelistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_DOMAIN_INITIAL_WHITELIST))) { + if (whitelistEntry.length == 3) { // There is one entry. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.startsWith(whitelistEntry[1])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1], whitelistEntry[2]}; + } + } else { // There are two entries. + if (currentDomain.endsWith(whitelistEntry[0]) && resourceUrl.startsWith(whitelistEntry[1]) && resourceUrl.contains(whitelistEntry[2])) { + // Return a whitelist match request allowed. + return new String[] {REQUEST_ALLOWED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_WHITELIST, whitelistEntry[0] + "\n" + whitelistEntry[1] + "\n" + whitelistEntry[2], + whitelistEntry[3]}; + } + } + } + } + + // Process the black lists. + // Main black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(MAIN_BLACKLIST))) { + switch (blacklistEntry.length) { + case 2: // There is one entry. + if (resourceUrl.contains(blacklistEntry[0])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + break; + + case 3: // There are two entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are three entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], blacklistEntry[3]}; + } + break; + + case 5: // There are four entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2]) && resourceUrl.contains(blacklistEntry[3])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2] + "\n" + + blacklistEntry[3], blacklistEntry[4]}; + } + break; + + case 6: // There are five entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2]) && resourceUrl.contains(blacklistEntry[3]) && + resourceUrl.contains(blacklistEntry[4])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, MAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2] + "\n" + + blacklistEntry[3] + "\n" + blacklistEntry[4], blacklistEntry[5]}; + } + break; + } + } + + // Initial black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(INITIAL_BLACKLIST))) { + if (blacklistEntry.length == 2) { // There is one entry. + if (resourceUrl.startsWith(blacklistEntry[0])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, INITIAL_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + } else { // There are two entries + if (resourceUrl.startsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } + } + + // Final black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(FINAL_BLACKLIST))) { + switch (blacklistEntry.length) { + case 2: // There is one entry. + if (resourceUrl.endsWith(blacklistEntry[0])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + break; + + case 3: // There are two entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.endsWith(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are three entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.endsWith(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, FINAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], blacklistEntry[3]}; + } + break; + } + } + + // Only check the domain lists if the current domain is not null (like `about:blank`). + if (currentDomain != null) { + // Domain black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(DOMAIN_BLACKLIST))) { + switch (blacklistEntry.length) { + case 3: // There is one entry. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are two entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], + blacklistEntry[3]}; + } + break; + + case 5: // There are three entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2]) && resourceUrl.contains(blacklistEntry[3])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2] + "\n" + + blacklistEntry[3], blacklistEntry[4]}; + } + break; + } + } + + // Domain initial black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(DOMAIN_INITIAL_BLACKLIST))) { + // Store the entry in the resource request log. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.startsWith(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } + + // Domain final black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(DOMAIN_FINAL_BLACKLIST))) { + switch (blacklistEntry.length) { + case 3: // There is one entry. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.endsWith(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are two entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.endsWith(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_FINAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], + blacklistEntry[3]}; + } + break; + } + } + + // Domain regular expression black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(DOMAIN_REGULAR_EXPRESSION_BLACKLIST))) { + if (currentDomain.endsWith(blacklistEntry[0]) && Pattern.matches(blacklistEntry[1], resourceUrl)) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, DOMAIN_REGULAR_EXPRESSION_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } + } + + // Only check the third-party black lists if this is a third-party request. + if (isThirdPartyRequest) { + // Third-party black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_BLACKLIST))) { + switch (blacklistEntry.length) { + case 2: // There is one entry. + if (resourceUrl.contains(blacklistEntry[0])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + break; + + case 3: // There are two entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are three entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], + blacklistEntry[3]}; + } + break; + + case 5: // There are four entries. + if (resourceUrl.contains(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2]) && resourceUrl.contains(blacklistEntry[3])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2] + "\n" + + blacklistEntry[3], blacklistEntry[4]}; + } + break; + } + } + + // Third-party initial black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_INITIAL_BLACKLIST))) { + if (blacklistEntry.length == 2) { // There is one entry. + if (resourceUrl.startsWith(blacklistEntry[0])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_INITIAL_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + } else { // There are two entries. + if (resourceUrl.startsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } + } + + // Third-party domain black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_DOMAIN_BLACKLIST))) { + if (blacklistEntry.length == 3) { // There is one entry. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } else { // There are two entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.contains(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + blacklistEntry[2], + blacklistEntry[3]}; + } + } + } + + // Third-party domain initial black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST))) { + switch (blacklistEntry.length) { + case 3: // There is one entry. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.startsWith(blacklistEntry[1])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + break; + + case 4: // There are two entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.startsWith(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + + blacklistEntry[2], blacklistEntry[3]}; + } + break; + + case 5: // There are three entries. + if (currentDomain.endsWith(blacklistEntry[0]) && resourceUrl.startsWith(blacklistEntry[1]) && resourceUrl.contains(blacklistEntry[2]) && resourceUrl.contains(blacklistEntry[3])) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1] + "\n" + + blacklistEntry[2] + "\n" + blacklistEntry[3], blacklistEntry[4]}; + } + break; + } + } + + // Third-party regular expression black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST))) { + if (Pattern.matches(blacklistEntry[0], resourceUrl)) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + } + + // Third-party domain regular expression black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST))) { + if (currentDomain.endsWith(blacklistEntry[0]) && Pattern.matches(blacklistEntry[1], resourceUrl)) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST, blacklistEntry[0] + "\n" + blacklistEntry[1], blacklistEntry[2]}; + } + } + } + + // Regular expression black list. + for (String[] blacklistEntry : blocklist.get(Integer.valueOf(REGULAR_EXPRESSION_BLACKLIST))) { + if (Pattern.matches(blacklistEntry[0], resourceUrl)) { + // Return a blacklist match request blocked. + return new String[] {REQUEST_BLOCKED, resourceUrl, BLOCK_LIST_NAME_STRING, REGULAR_EXPRESSION_BLACKLIST, blacklistEntry[0], blacklistEntry[1]}; + } + } + + // Return a no match request default. + return new String[] {REQUEST_DEFAULT}; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/main_framelayout.xml b/app/src/main/res/layout/main_framelayout.xml index cfd7f4eb..7f37a1a7 100644 --- a/app/src/main/res/layout/main_framelayout.xml +++ b/app/src/main/res/layout/main_framelayout.xml @@ -228,6 +228,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/privacy_browser_logo" - android:layout_centerHorizontal="true" /> + android:layout_centerHorizontal="true" + android:layout_margin="10dp" + android:textSize="16sp" + android:textColor="?android:textColorPrimary" /> \ No newline at end of file