From 0d5f4763ba83016e32a91379ceb66baac63cc0c9 Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Wed, 8 May 2019 15:04:01 -0700 Subject: [PATCH] Add option to remove Google Analytics from URLs. https://redmine.stoutner.com/issues/414 --- .idea/assetWizardSettings.xml | 5 +- .../main/assets/de/about_licenses_dark.html | 1 + .../main/assets/de/about_licenses_light.html | 1 + .../main/assets/en/about_licenses_dark.html | 1 + .../main/assets/en/about_licenses_light.html | 1 + .../main/assets/es/about_licenses_dark.html | 1 + .../main/assets/es/about_licenses_light.html | 1 + .../main/assets/it/about_licenses_dark.html | 1 + .../main/assets/it/about_licenses_light.html | 1 + .../main/assets/ru/about_licenses_dark.html | 1 + .../main/assets/ru/about_licenses_light.html | 1 + .../assets/shared_images/link_off_dark.png | Bin 0 -> 2150 bytes .../assets/shared_images/link_off_light.png | Bin 0 -> 1907 bytes .../main/assets/tr/about_licenses_dark.html | 1 + .../main/assets/tr/about_licenses_light.html | 1 + .../activities/MainWebViewActivity.java | 31 +++++++++++ .../fragments/SettingsFragment.java | 49 +++++++++++++++--- .../res/drawable/modify_url_disabled_dark.xml | 18 +++++++ .../drawable/modify_url_disabled_light.xml | 18 +++++++ .../res/drawable/modify_url_enabled_dark.xml | 18 +++++++ .../res/drawable/modify_url_enabled_light.xml | 18 +++++++ .../main/res/drawable/more_disabled_dark.xml | 2 +- .../main/res/drawable/more_disabled_light.xml | 2 +- .../main/res/drawable/more_enabled_dark.xml | 2 +- .../main/res/drawable/more_enabled_light.xml | 2 +- app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/preferences.xml | 11 ++++ 27 files changed, 177 insertions(+), 14 deletions(-) create mode 100644 app/src/main/assets/shared_images/link_off_dark.png create mode 100644 app/src/main/assets/shared_images/link_off_light.png create mode 100644 app/src/main/res/drawable/modify_url_disabled_dark.xml create mode 100644 app/src/main/res/drawable/modify_url_disabled_light.xml create mode 100644 app/src/main/res/drawable/modify_url_enabled_dark.xml create mode 100644 app/src/main/res/drawable/modify_url_enabled_light.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index e1c83ef8..1db0caef 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -78,9 +78,10 @@ diff --git a/app/src/main/assets/de/about_licenses_dark.html b/app/src/main/assets/de/about_licenses_dark.html index aaaac72f..86b8293a 100644 --- a/app/src/main/assets/de/about_licenses_dark.html +++ b/app/src/main/assets/de/about_licenses_dark.html @@ -124,6 +124,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/de/about_licenses_light.html b/app/src/main/assets/de/about_licenses_light.html index 69b7a2da..e156dcbc 100644 --- a/app/src/main/assets/de/about_licenses_light.html +++ b/app/src/main/assets/de/about_licenses_light.html @@ -124,6 +124,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/en/about_licenses_dark.html b/app/src/main/assets/en/about_licenses_dark.html index 0283e5b5..2efa366b 100644 --- a/app/src/main/assets/en/about_licenses_dark.html +++ b/app/src/main/assets/en/about_licenses_dark.html @@ -122,6 +122,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/en/about_licenses_light.html b/app/src/main/assets/en/about_licenses_light.html index 2a0b87a1..8da7e035 100644 --- a/app/src/main/assets/en/about_licenses_light.html +++ b/app/src/main/assets/en/about_licenses_light.html @@ -123,6 +123,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/es/about_licenses_dark.html b/app/src/main/assets/es/about_licenses_dark.html index 27318b7e..117dd369 100644 --- a/app/src/main/assets/es/about_licenses_dark.html +++ b/app/src/main/assets/es/about_licenses_dark.html @@ -127,6 +127,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/es/about_licenses_light.html b/app/src/main/assets/es/about_licenses_light.html index 97b70bf8..b2e078ab 100644 --- a/app/src/main/assets/es/about_licenses_light.html +++ b/app/src/main/assets/es/about_licenses_light.html @@ -128,6 +128,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/it/about_licenses_dark.html b/app/src/main/assets/it/about_licenses_dark.html index 4e01d4fa..231f25aa 100644 --- a/app/src/main/assets/it/about_licenses_dark.html +++ b/app/src/main/assets/it/about_licenses_dark.html @@ -131,6 +131,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/it/about_licenses_light.html b/app/src/main/assets/it/about_licenses_light.html index 320d8668..f31976f7 100644 --- a/app/src/main/assets/it/about_licenses_light.html +++ b/app/src/main/assets/it/about_licenses_light.html @@ -132,6 +132,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/ru/about_licenses_dark.html b/app/src/main/assets/ru/about_licenses_dark.html index 1ca17ea5..a7c1bbe0 100644 --- a/app/src/main/assets/ru/about_licenses_dark.html +++ b/app/src/main/assets/ru/about_licenses_dark.html @@ -125,6 +125,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/ru/about_licenses_light.html b/app/src/main/assets/ru/about_licenses_light.html index 7f90a11b..9304d2b8 100644 --- a/app/src/main/assets/ru/about_licenses_light.html +++ b/app/src/main/assets/ru/about_licenses_light.html @@ -125,6 +125,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/shared_images/link_off_dark.png b/app/src/main/assets/shared_images/link_off_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2d80b53edb4ca192128a832908ad525b4605c7d9 GIT binary patch literal 2150 zcmZuzdpOe#8~%+stSqtQEPc%s@)B~GSBCJ5AtvYA)Fu{|EvLjbB6*1w<`5EL5#33Bo=h&Hh%AHR8M%iun^-wCF@G zawQu>hIu{+`?7tqJ--!tsI5H7k&TaI&rBr1tQnTxn>sBPs4qKa|9`lN+}CYMA7-Qk z8yK?WE7W5qgc4FQP+~JeU*Xb z7IPIxgUDpy0Fc)`TfoPfH;S@*gt-x1LSS8kF5RHXdgz`jLdRWr_51D>U5?l63M3ag z?owsxsRwzdW1io`4R;Cj8MJc3R}_hbDeaibym)TUX0%3QqM~vbX|cp zsHoP&xv;1b%%U9-X3Onix3l<=r$T=nm9J+*=wwCEgAd03|E z285moKC|m@P@7QG;T&QhD_As13M~;|3kS4VHJE<+Z&UShQ)vQyFl^2Go#$Y58=#%J zI+RU#fFrht+L^rj{%%6vQlJEO+qLJkq_Hw=JyCN@tdt7*WfQ%|sydE0ol2kMb>=j2 zMFr)*C>^Opi3LDQ=)Gu^>~Q)>0&qYDC!7H|62+sXHc%_`5fjtdc(f&nX~s?C&M;#9 zYJPeM>M=KdVd966B9R7i7=*1fMTin+-54C;HEUGWt0^r<9n|HZ+@VopBh&r@<-nVp z4K9N9t}cI=5zBV$wCy&8`voDjj>Bj~AEqs|w+#-Hfc3 z3QkE6RZx*wKufgFWc2El0cHoiQ@Y(=SaUc3Zw|^xW;lPCf7fW*!`SzXvB|GB(fI?e zi1FEr4-M0%rN1UyNeytl6#G-j%mg`Sgwx%gJJ}Q}k?5mG#XI-U#}zgkR2L>`Fm5B8 z8rR<-eY9hqg*F!H^<2uV{(SzE*H~3MPlb8}T@!y!^C;HLpEUKMdo?Y8fU=A+6N02fu z0l^v@ZXAB`ftx*~4CmJ_>pWalX0_V2@$YvNaK*_!SqAuI&fnX`E-hYnLP;&kq_q~- zmEL_{YTIa^^sCCHq~ueZpUmERpH^^itHfA8rVKpzP{|^?pPecp=Zg@GRcz*=uKxqM zrM_!KGIx~CmgqWBeG$JMB~*^ua$Wi0|HBj_P_XF?EIxlLPU4L%pd_-{bMNtn*KmVX z^5hs?|4sd2bqNNH-ns(ca^WtF^`QiQuTvUpWC(k@&Up;h!;aNf1UnC0Vl1~ctFNGO z=)|2x6)3E|MSpv4?$!KD-XbRZ&E@s}$HJ;}sW7@sQ~gT!)$pMU1>Q%Nw(exOhvSsoA3Pm9;DfvF!A?_&?3b}xYaKe6lEfQ2Rs*&Gn zrfP`RDC0q-5G*qvJ)Ryb`meduU@ynSxmF*|TYMcWQxF;d0@GiT`h z`_#jb^{M;MmKbK!b@h0QB-bRX-rKA6{&iWceIYhXa?he9+~34pQ{G4~=UBBDZ;=KD z-=QUPdQz^Al{O1sz)Fna3%0ExN(cR~b6WE=%SL0uYl=|s5t|*nN8n)k*OJqAYE8Xm zgq))4NX_zCLj2|w(Syn?h+Va(?5rLK`yDu{_IqdPuxK`cDb@$;n^nu literal 0 HcmV?d00001 diff --git a/app/src/main/assets/shared_images/link_off_light.png b/app/src/main/assets/shared_images/link_off_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d85bfc6b40a1012077c70fe5a052a0eed95bd074 GIT binary patch literal 1907 zcmZ8idpOezAOCG;HfCmS%ig0xNMX5DZ^>ndN%9bJMh$IK#9V4}-Gz?KJR^x*wsksK zM5ME6luPH#X@{<_To$XPyfM~Mq08%?=l$zF-{<*$zMt>s`Tp_!>+`u778+=%Z>bLe zfFU8sKU_N*8x4bMamXuPt{sp}JmDxzTY0dPCE6WM3yR4EfY82;24$X3GS!NkvI3&B zBGM>X^!N-iK&R84Po*YjCdSjq&S@Fcx(vd!lE_GmtdL6i>v&UK zca^j0rB^C-lxjdeuk-IcIv zama(G|9JQDmZ!%wWla3}c=A%_=(-;EZG6L>dv{)>jm3PON?y{z!?qTo{sy^Ekvkzs zmwl*;#&gPJ0{uL;ZIWXSvOvv)93Gs8oAcum*&bAZZk8vjQ`bguSN8wT>tz` z8`{C595GM`nrAMhU+Vz=Q~o$g)B-#r@!?Tm8~qY`flr%I7Nzu4B9-H&4LeE=m?O`B zf^63v|Go;5fRnh>a{rJAXC37Pf|G9r_<8vfqcv#RrW{n9sde0Xpe6m(jaAh1cL zFH>Dpg_lp$cmuEw9JmF9Ox+q1_-C)XK^0HSmXaKI&{k461XccFw3b^s0$* zuAM_G5J@t|x&Qb`XJT_UzuVsWZAcgebfZ6<6mL_MpU!wvOMokT8qz)(8gMZETNT%~g+Ro^04QQ?!+^uR&t@7z}<_iq8Z5c*eQEgThD0%tMv5o`!?~kx7*^D}d zcjwAiBjw|dTZc?Q1I`03q9z0jN$CK4CMR`N*w%2)m}Ba!TXGS;XJ1$P z$DE3Sf6?KqW@aWjbx!LPd_Xi|F;^0&MjQtSJ{AS}aojTvWJ)h}OQezuQ}1boRAW=d z{I6d8>dBsihL)K6wLs*e6Y$9oM zjjo)(P1{0a3csNh$H%?t!wA(<4ANG>Y`y~$6bLzN- z@J#=8aekZ&%=3m76x2DH*wBv@38o(xgQXSdD!k=<-|fN)JIz(&zQN(Mlw#M zaL7QBy1l?q2)aZqu_ufaI>NA$wGn0C1s&jIQV$j=|~-j;ySSbgqbZ@T_{-}now z(w7r+#CQbgAm}^dQ+4s=)&3RR7eROI=6;$gQVl_8f}OzM-o&&U?wt-xtDOV91oh~$ zA@6jH0LG^arS_QjPFV8g{yox_{ZLSwNEsl(;`2MlZ`T($iby*wKoMp9nDRqdqFb^_ z`u2Cd5d()bhdNvU=g}VZy2N0;&R5;Zf^Es7J~=i{WntK^mG>?YiuO5h zh;%+|wylQQ{R(}+i<$Lmw_DZ4$8>YEHMzZs=DyiC8~C)nri6-%RGe$-ibIb*3&CMl z2T+M+(p$NYnd(!5p6x8xa3gegLfscS5NKb@6(g9D=`KEwSmAz7cn}Ib)jPaPJ^1f& zK0FUboZhNSt|H-5aZVpnY+e->a<7#6My0QP?&<@&LeOO|V>&#lWf|o|9OKnARz;zXxK-wWwgs@AP{AUFHBNz}_koynW8 zi{K;W;I&w{QQh{DXc<&#pd>0(qr@)g9gBU;JzpInr28b3(e$LrY`Y2b;b)APObsov8g1;^w1Qc=v$7;b^w}pWE3*0hoJ2x12;4)=$i91gt4sonLUV{u1 zSss!AO584U@$B6>rb{rxQ+xHYZ|A~3?;U2!V8v{ln?5gqC8}CFmxH_6Kie-Wx_|7} zaou5SU%w0l4V$VWKRk=C03T(#Y!^ZTIvn&~kLk-^eMTW=v!)3O`&CnM?QeSg&0I@R zePUVsrp1w#c`n~%n{8HZ?LDMriN40PQXs1MpG(uwo&T3g-*jgw)f2%TtEs%IFOcO<-?x&xNw+7G~fo=Ha9~o nzuA#@r~2Lad&+1-#~-&2Mhm4=xU^2NHXs2)K&XGa)(8Fzwu)9r literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tr/about_licenses_dark.html b/app/src/main/assets/tr/about_licenses_dark.html index 627b822b..aa4fc54d 100644 --- a/app/src/main/assets/tr/about_licenses_dark.html +++ b/app/src/main/assets/tr/about_licenses_dark.html @@ -122,6 +122,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

diff --git a/app/src/main/assets/tr/about_licenses_light.html b/app/src/main/assets/tr/about_licenses_light.html index 8876b9dc..fbe184be 100644 --- a/app/src/main/assets/tr/about_licenses_light.html +++ b/app/src/main/assets/tr/about_licenses_light.html @@ -123,6 +123,7 @@

important_devices.

info_outline.

language.

+

link_off.

list.

local_activity.

location_off.

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 df7cef48..7900b066 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java @@ -279,6 +279,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The swipe refresh layout top padding is used when exiting full screen browsing mode. It is used in an inner class in `initializeWebView()`. private int swipeRefreshLayoutPaddingTop; + // The URL sanitizers are set in `applyAppSettings()` and used in `sanitizeUrl()`. + private boolean sanitizeGoogleAnalytics; + // The download strings are used in `onCreate()`, `onRequestPermissionResult()` and `initializeWebView()`. private String downloadUrl; private String downloadContentDisposition; @@ -2999,6 +3002,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } private void loadUrl(String url) { + // Sanitize the URL. + url = sanitizeUrl(url); + // Apply the domain settings. applyDomainSettings(currentWebView, url, true, false); @@ -3053,6 +3059,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Store the values from the shared preferences in variables. incognitoModeEnabled = sharedPreferences.getBoolean("incognito_mode", false); boolean doNotTrackEnabled = sharedPreferences.getBoolean("do_not_track", false); + sanitizeGoogleAnalytics = sharedPreferences.getBoolean("google_analytics", true); proxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false); fullScreenBrowsingModeEnabled = sharedPreferences.getBoolean("full_screen_browsing_mode", false); hideAppBar = sharedPreferences.getBoolean("hide_app_bar", true); @@ -3959,12 +3966,33 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook startActivity(openWithBrowserIntent); } + private String sanitizeUrl(String url) { + // Sanitize Google Analytics. + if (sanitizeGoogleAnalytics) { + // Remove `?utm_`. + if (url.contains("?utm_")) { + url = url.substring(0, url.indexOf("?utm_")); + } + + // Remove `&utm_`. + if (url.contains("&utm_")) { + url = url.substring(0, url.indexOf("&utm_")); + } + } + + // Return the sanitized URL. + return url; + } + public void addTab(View view) { // Add a new tab with a blank URL. addNewTab(""); } private void addNewTab(String url) { + // Sanitize the URL. + url = sanitizeUrl(url); + // Get a handle for the tab layout and the view pager. TabLayout tabLayout = findViewById(R.id.tablayout); ViewPager webViewPager = findViewById(R.id.webviewpager); @@ -4770,6 +4798,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // The deprecated `shouldOverrideUrlLoading` must be used until API >= 24. @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { + // Sanitize the url. + url = sanitizeUrl(url); + if (url.startsWith("http")) { // Load the URL in Privacy Browser. // Apply the domain settings for the new URL. This doesn't do anything if the domain has not changed. boolean userAgentChanged = applyDomainSettings(nestedScrollWebView, url, true, false); diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java index 35956e94..37225fb6 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/SettingsFragment.java @@ -60,7 +60,7 @@ public class SettingsFragment extends PreferenceFragment { Preference firstPartyCookiesPreference = findPreference("first_party_cookies"); Preference thirdPartyCookiesPreference = findPreference("third_party_cookies"); Preference domStoragePreference = findPreference("dom_storage"); - Preference saveFormDataPreference = findPreference("save_form_data"); // The form data preference can be removed once the minimum API >= 26. + Preference formDataPreference = findPreference("save_form_data"); // The form data preference can be removed once the minimum API >= 26. Preference userAgentPreference = findPreference("user_agent"); Preference customUserAgentPreference = findPreference("custom_user_agent"); Preference incognitoModePreference = findPreference("incognito_mode"); @@ -72,6 +72,7 @@ public class SettingsFragment extends PreferenceFragment { Preference fanboySocialBlockingListPreference = findPreference("fanboys_social_blocking_list"); Preference ultraPrivacyPreference = findPreference("ultraprivacy"); Preference blockAllThirdPartyRequestsPreference = findPreference("block_all_third_party_requests"); + Preference googleAnalyticsPreference = findPreference("google_analytics"); Preference proxyThroughOrbotPreference = findPreference("proxy_through_orbot"); Preference torHomepagePreference = findPreference("tor_homepage"); Preference torSearchPreference = findPreference("tor_search"); @@ -130,7 +131,7 @@ public class SettingsFragment extends PreferenceFragment { PreferenceCategory clearAndExitCategory = (PreferenceCategory) findPreference("clear_and_exit"); // Remove the form data preferences. - privacyCategory.removePreference(saveFormDataPreference); + privacyCategory.removePreference(formDataPreference); clearAndExitCategory.removePreference(clearFormDataPreference); } @@ -288,12 +289,12 @@ public class SettingsFragment extends PreferenceFragment { // Set the save form data icon if API < 26. Save form data has no effect on API >= 26. if (Build.VERSION.SDK_INT < 26) { if (savedPreferences.getBoolean("save_form_data", false)) { - saveFormDataPreference.setIcon(R.drawable.form_data_enabled); + formDataPreference.setIcon(R.drawable.form_data_enabled); } else { if (darkTheme) { - saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark); + formDataPreference.setIcon(R.drawable.form_data_disabled_dark); } else { - saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light); + formDataPreference.setIcon(R.drawable.form_data_disabled_light); } } } @@ -457,6 +458,21 @@ public class SettingsFragment extends PreferenceFragment { } } + // Set the Google Analytics icons according to the theme. + if (savedPreferences.getBoolean("google_analytics", true)) { + if (darkTheme) { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_dark); + } else { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_light); + } + } else { + if (darkTheme) { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_dark); + } else { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_light); + } + } + // Set the Tor icons according to the theme. if (proxyThroughOrbot) { // Proxying is enabled. if (darkTheme) { @@ -829,12 +845,12 @@ public class SettingsFragment extends PreferenceFragment { case "save_form_data": // Update the icon. if (sharedPreferences.getBoolean("save_form_data", false)) { - saveFormDataPreference.setIcon(R.drawable.form_data_enabled); + formDataPreference.setIcon(R.drawable.form_data_enabled); } else { if (darkTheme) { - saveFormDataPreference.setIcon(R.drawable.form_data_disabled_dark); + formDataPreference.setIcon(R.drawable.form_data_disabled_dark); } else { - saveFormDataPreference.setIcon(R.drawable.form_data_disabled_light); + formDataPreference.setIcon(R.drawable.form_data_disabled_light); } } break; @@ -1110,6 +1126,23 @@ public class SettingsFragment extends PreferenceFragment { } break; + case "google_analytics": + // Update the icon. + if (sharedPreferences.getBoolean("google_analytics", true)) { + if (darkTheme) { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_dark); + } else { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_enabled_light); + } + } else { + if (darkTheme) { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_dark); + } else { + googleAnalyticsPreference.setIcon(R.drawable.modify_url_disabled_light); + } + } + break; + case "proxy_through_orbot": // Get current settings. boolean currentProxyThroughOrbot = sharedPreferences.getBoolean("proxy_through_orbot", false); diff --git a/app/src/main/res/drawable/modify_url_disabled_dark.xml b/app/src/main/res/drawable/modify_url_disabled_dark.xml new file mode 100644 index 00000000..907eeecc --- /dev/null +++ b/app/src/main/res/drawable/modify_url_disabled_dark.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/modify_url_disabled_light.xml b/app/src/main/res/drawable/modify_url_disabled_light.xml new file mode 100644 index 00000000..a8f2b293 --- /dev/null +++ b/app/src/main/res/drawable/modify_url_disabled_light.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/modify_url_enabled_dark.xml b/app/src/main/res/drawable/modify_url_enabled_dark.xml new file mode 100644 index 00000000..7bcd082d --- /dev/null +++ b/app/src/main/res/drawable/modify_url_enabled_dark.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/modify_url_enabled_light.xml b/app/src/main/res/drawable/modify_url_enabled_light.xml new file mode 100644 index 00000000..8f5c094d --- /dev/null +++ b/app/src/main/res/drawable/modify_url_enabled_light.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/more_disabled_dark.xml b/app/src/main/res/drawable/more_disabled_dark.xml index c877d9be..ca98677d 100644 --- a/app/src/main/res/drawable/more_disabled_dark.xml +++ b/app/src/main/res/drawable/more_disabled_dark.xml @@ -11,7 +11,7 @@ android:viewportWidth="24.0" tools:ignore="VectorRaster"> - + diff --git a/app/src/main/res/drawable/more_disabled_light.xml b/app/src/main/res/drawable/more_disabled_light.xml index 7b6c9b55..1ea8021b 100644 --- a/app/src/main/res/drawable/more_disabled_light.xml +++ b/app/src/main/res/drawable/more_disabled_light.xml @@ -11,7 +11,7 @@ android:viewportWidth="24.0" tools:ignore="VectorRaster"> - + diff --git a/app/src/main/res/drawable/more_enabled_dark.xml b/app/src/main/res/drawable/more_enabled_dark.xml index 4ac57172..d7fcaa5f 100644 --- a/app/src/main/res/drawable/more_enabled_dark.xml +++ b/app/src/main/res/drawable/more_enabled_dark.xml @@ -11,7 +11,7 @@ android:width="24dp" tools:ignore="VectorRaster"> - + diff --git a/app/src/main/res/drawable/more_enabled_light.xml b/app/src/main/res/drawable/more_enabled_light.xml index b61bf654..0f494c9e 100644 --- a/app/src/main/res/drawable/more_enabled_light.xml +++ b/app/src/main/res/drawable/more_enabled_light.xml @@ -11,7 +11,7 @@ android:width="24dp" tools:ignore="VectorRaster"> - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c48c937e..099857f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -514,6 +514,9 @@ UltraPrivacy blocks trackers that EasyPrivacy doesn’t because doing so can break websites. Block all third-party requests Blocking all third-party requests increases privacy, but it breaks many websites. + URL Modification + Google Analytics + Remove “?utm_” or “&utm_” and anything after it from URLs. Tor Proxy through Orbot Proxy all web traffic through Orbot on localhost:8118. diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index af3e7a50..dc8ffcba 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -129,6 +129,17 @@ android:defaultValue="false" /> + + + + + -- 2.43.0