From b36f8bd357e28072bd7c810bb3ae47e4e0b20acc Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Wed, 14 Sep 2016 22:15:07 -0700 Subject: [PATCH] Implement Orbot proxy support. Fixes https://redmine.stoutner.com/issues/26. --- .idea/dictionaries/soren.xml | 2 + app/src/main/assets/de/images/tor.png | 1 + app/src/main/assets/en/guide_tor.html | 99 +++++--- app/src/main/assets/en/images/tor.png | Bin 0 -> 89156 bytes .../privacybrowser/AboutTabFragment.java | 2 +- .../BookmarksDatabaseViewActivity.java | 2 +- .../privacybrowser/MainWebViewActivity.java | 24 +- .../privacybrowser/OrbotProxyHelper.java | 101 ++++++++ .../privacybrowser/SettingsFragment.java | 12 + .../privacybrowser/SslCertificateError.java | 2 +- .../privacybrowser/ViewSslCertificate.java | 5 +- .../res/drawable/bookmarks_list_selector.xml | 2 +- .../res/layout/about_coordinatorlayout.xml | 10 +- app/src/main/res/layout/about_tab_version.xml | 6 +- .../layout/bookmarks_coordinatorlayout.xml | 2 +- ...kmarks_database_view_coordinatorlayout.xml | 2 +- ...kmarks_database_view_item_linearlayout.xml | 2 +- .../res/layout/guide_coordinatorlayout.xml | 10 +- .../res/layout/main_coordinatorlayout.xml | 4 +- app/src/main/res/layout/navigation_header.xml | 2 +- .../main/res/layout/ssl_certificate_error.xml | 10 +- app/src/main/res/layout/url_bar.xml | 2 +- .../main/res/layout/view_ssl_certificate.xml | 6 +- app/src/main/res/values/colors.xml | 35 ++- app/src/main/res/values/strings.xml | 227 +++++++++--------- app/src/main/res/values/styles.xml | 14 +- app/src/main/res/xml/preferences.xml | 6 + 27 files changed, 384 insertions(+), 206 deletions(-) create mode 120000 app/src/main/assets/de/images/tor.png create mode 100644 app/src/main/assets/en/images/tor.png create mode 100644 app/src/main/java/com/stoutner/privacybrowser/OrbotProxyHelper.java diff --git a/.idea/dictionaries/soren.xml b/.idea/dictionaries/soren.xml index c623c835..5818a708 100644 --- a/.idea/dictionaries/soren.xml +++ b/.idea/dictionaries/soren.xml @@ -39,6 +39,7 @@ oname orbot panopticlick + parameterized parentfolder programatically qwant @@ -58,6 +59,7 @@ tablayout techrepublic textview + torproject uids uname webkay diff --git a/app/src/main/assets/de/images/tor.png b/app/src/main/assets/de/images/tor.png new file mode 120000 index 00000000..4d657c3f --- /dev/null +++ b/app/src/main/assets/de/images/tor.png @@ -0,0 +1 @@ +../../en/images/tor.png \ No newline at end of file diff --git a/app/src/main/assets/en/guide_tor.html b/app/src/main/assets/en/guide_tor.html index caab3b4c..1ce0d59d 100644 --- a/app/src/main/assets/en/guide_tor.html +++ b/app/src/main/assets/en/guide_tor.html @@ -23,48 +23,71 @@ color: 0D4781; } - strong { - color: BF360C; + img.center { + display: block; + margin-left: auto; + margin-right: auto; } -

Masking IP Addresses

- -

Although it isn't a perfect science, IP addresses can be turned into physical addresses with increasing accuracy. - There are public databases that show which ISP owns which IP address with a - good sense of which region they use it in. There are private databases with more accurate information. And, of course, - the ISP knows the exact service address of each IP address.

- -

VPN services can mask a device's IP address from a web server. When a VPN service is engaged, all traffic is encrypted and routed - through the VPN server. The web server only sees the IP address of the VPN server. This is sufficient for maintaining anonymity - from web server operators and advertisers, as well as accessing websites that intentionally block access from particular countries - (like some music and video streaming services), but it isn't sufficient for maintaining anonymity from oppressive regimes which might - be able to lean on VPN operators to turn over their logs showing the original IP addresses. Those looking for safety from such - regimes or desiring to blow the whistle on government agencies need something more.

- -

The TOR (The Onion Router) network was designed for just such purposes. It bounces encrypted web traffic through at least three independent servers - that volunteer bandwidth to the project. None of the servers have enough information to identify both the IP address of the original computer - and the final destination. Therefore, any government agency wanting to access the information would have to compromise all the machines in the - link, which are dispersed over the globe. This doesn't provide perfect privacy, but it gets pretty close.

- -

The Tor project has an app for Android called Orbot, which is available on F-Droid - and everywhere else Privacy Browser is distributed. Orbot can operate in three modes.

- - - -

Currently, Privacy Browser works with Orbot in transparent proxy and VPN modes. Support for the standard proxy mode will be added in a - future release.

- -

Because traffic is being routed through several Tor nodes, using Tor is often much slower than connecting straight to the internet.

+

Tor and Its Limits

+ +

There are two general categories of bad actors that want to infringe on the privacy of the web: malicious governments + with access to ISPs (Internet Service Providers) and mega corporations that run social and advertising networks. + TOR (The Onion Router) is useful in protecting privacy from malicious governments but not from mega corporations.

+ + +

Malicious Governments

+ +

Malicious governments often spy on their citizens to punish dissent or human rights activity. They commonly either + operate the local ISPs or they can force them to disclose information showing every IP address that is visited + by each user. Tor is designed to defeat this infringement of privacy by encrypting the traffic + from a user's device and routing it through three separate servers on the internet before sending it on to the final destination. + This means that no individual ISP, server, or website, can know both the IP address the user's device + and the IP address of the final web server. Malicious governments and the ISPs they control cannot tell which + web servers a user is accessing, although they can tell that the user is using Tor. In some parts of + the world, using Tor could be construed as an evidence of illegal behavior ("if you didn't have anything + to hide you wouldn't be hiding your traffic from us") and users could be punished because governments + assume they are doing something that is prohibited. Thus, Tor can be helpful, but isn't a panacea.

+ + +

Mega Corporations

+ +

When a user connects to a web server, the web server can see the user's IP address. Although it isn't a perfect science, + IP addresses can be turned into physical addresses with a fair amount of accuracy. + Small web servers typically rely on IP addresses to identify the location of the users visiting their site. + Tor is a good solution to mask the user's location from these servers. But large mega corporations + that own social media and advertising networks use a whole profile of information that is designed to track users + across devices and IP addresses. These profiles employ a variety of techniques to identify users, including JavaScript, + cookies, tracking IDs, and browser fingerprinting. Because the vast majority + of the websites on the internet either load an ad from one of the major networks or embed social media icons with their + associated JavaScript, these corporations have build profiles for almost every user online and can track their internet + activity across unrelated sites.

+ +

They track every site that is visited, everything that is purchased, every credit card that is used to + make a purchase, every address that items are shipped to, and the GPS metadata of every picture that is + uploaded to the internet. They build a profile of a user's age, gender, marital status, address, political affiliations, + religious affiliations, family circumstance, number of pets, and everything else they can get their hands on. + They even buy up databases of credit card usage at stores, so they can track the off-line purchasing patterns of the users + in their profiles. Because they already have much more accurate address information about a user than an IP address discloses, + Tor provides no real privacy protection against mega corporations.

+ +

The single best privacy protection against mega corporations is to browse the web with JavaScript disabled, followed + by blocking ad networks, disabling cookies and DOM storage, and using a browser that is difficult to fingerprint.

+ + +

Using Tor

+ +

Despite the limitations, Tor can be useful in some circumstances. The Tor project has an app for Android called Orbot, + which is available on F-Droid + and everywhere else that Privacy Browser is distributed. Privacy Browser has a setting to use Orbot as + a proxy. When this is turned on, Privacy Browser's app bar will have a light blue background instead of + the default light grey. When Privacy Browser's Orbot proxy setting is enabled, internet access + will not work unless Orbot is running and connected to Tor. Because traffic is being routed through several Tor nodes, + using Tor is often much slower than connecting straight to the internet.

+ + \ No newline at end of file diff --git a/app/src/main/assets/en/images/tor.png b/app/src/main/assets/en/images/tor.png new file mode 100644 index 0000000000000000000000000000000000000000..58dc7e1feca3cd2e201a8b28ffeb0bcf9009548a GIT binary patch literal 89156 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%0D)ODqfGVgNGPiMoTxK1HEPnyptld0A zAxMuo`Zv7Y{XH;m^M;UMnuUgS#NsiSoP(>IuVEMslpvNEa+d&SNtoR4{!xX!V{DQm z)uoD0#J(L4_jULA0^v`{Q?n-cX@|^%GRM7Z(m&jnp{L_3!1_Hg=RnVp$Os>)9y0M7U%%SSAtPs3c>sE}U6$iG>m|L)zDa_KgTDcX%R)zd*X z64B`{bBuwqHI;7ljV&9$eonG<(7#G@SqjQUF$KB-(}By#mn%!;;+eyuEVQ13;@w4c z=P3nwOsGBoZbkk`qBX>$|63{4xj?1cH-VWLc>Xg%RIO3~4ri`v_x0mE_mWU&=ua{V zlk>?CqH;S=@%GtJXbg3Lhi&guEwwOLRaBGcBlJ}!H@Xo1Cx53j6Xac??BYl##adNk^%bH%CI<0Z(bn{j1~7((=!CTpkusZT`ZbU`v7C zD#k?DHhO*kv|c4P{lRKC52?)K>&v=MUs=~fH43f915bkre6pQ4bAJxKm8X2jK;s1E zcVShFvvikG{pf6y&QuIz?_BgZ*p>Za?HAdwnTNc{4cFjO2YjW>!M}LkN+nEvAP2@D z^|_GNi_`R6s3A7zhuS+6qq=+K^=ehr*#GMJ`!tVg*CD&Hsij6k7Vg6*|N2Z6lhAo) zrA+x7?|$6y&|f{5qb5Ol_`eIg|6Kz9uW$a>67YXkjsL3_{NI-VBhCL^)%ZUz`4>F+ z|8~j$yr2J5ZTde8&Hw!f|GebikMOT={)0>YeLw$v>VIDH@51+gKJ`B@`47tL|9Q!O z!G^jFv>{{LGABkli{&f>pX_kW)KP6tv58tgy+E5igx*)4J2PQXPAnEc(9 z?>PgcuJx1QyyN~;(SXtkT$yIbWI$sI9qvAc9ziS{A>Vyt|^aCwVRUmBXT|So;m=8qQ);Bgr zy(BwstbY~?{odKxu!y71{`jc*=mg)U0Jm!38W7~g0|WwV#9m4!YDLAMuM&tLqxqE+ zIWo~==|P@Aj+S7kNu=NW`wZZqBAE<;>mgMG0V&WXO$JzBKIh5TsvdUu;0s`F)fO)% zZC(+|lT|2QTEDW7@&htFuiy+U6{zxom!Hrt0qN5^f0`3fC^_&~AiD$Kg*HEeVC>B! zxuk*9IG}4}sO1j;qc9*{v;c;xf`fW}Kr%ez)vdbU#CL?>7b1s&{6A6(HwTR1_3qw% zeOnlS<1d`v7oTTEN^SpXW-GXKCHjI)lfhAFJAek+IZZ!bOQSH6vjMS`E?3_-MCPwy*Z#m?f)78W>mFniAqyNT-R+D4YA#KtGo5;=oUE~ z7#m`Alg7a{z`eGR9t%vi{K2gO+>I&_f$zE2j6Fr?QgMLWxUU8W9b~pERabR#HMu

1`|}~T54rQq zFZ;;E^mM@Q9S4r)QJ$GU3BZ23y)zf6!2ssXeG>sBZUlgi0I&!q4g8jckt%VKF!$}X zd0>wUj0l0v3SA}yNMy4?ciq#gv}=v&U-!>6d@1+=n0D?xt9$v>dc^o)BK zc3DmzW(`Whg2xBYBO`q!41lGrs&rHUB`LP{_gf$$1pp5t!Tu#CV~KeM0bL|882~O< zazgN$V^0Qn5qf>{zs1EheOX~KA4+Lb{~|Bkp*T$tpq>? z0wQr{r^3X2J-w3r{C7|wDRmhtoBVp#pdNUXS`jg~9bW^N-d^|dt9q-6mTpRku@==X z!=rUxEX@yes+{^}0aQ1)e*e>Iz#!d+2o9A!Vg#M|V%t+qgBaze_>MRMymbFDmVTfv z1{&Y(PF|pX#ZuEy;RpbA+GB4AHw6eec}@EtQUqu^!C*xDjro|~y9elx;g3G#ZUIAV zzs1pj!D8?^(JOuFjLPET`^VXjAKs^t+A%)^cqBmH+=IY~{0eS-oJVi|Qe*(yYa=jD z1zw3JGr^aE1XedmiXTXdVSZ!AKGjYcFSMe0W;PmuKOf*Bell0{0)H^Z4x@9y3r`h3 zbeNUTK-3_u9;m_qFJL?P@{60FeZ~MXcb_5*m=6l{TYZ2-dl{310z;+Ou@Zd3*2+xy zqvJv@q{Y5GwmV0U^C`N0ZEaOwAF>0ZK4$8;kT(no+>J(R+?l}t*@%xX65tipp8>MC z0?`44*)2&v#<~7;+?((1oL8sr0ogH#E_-=`M_zpa?_e3YFy=}q`hpu-ih{S0&{@6t zOe=E?3YjGFTu|0RF-8oa3K=LJjn{WCtqj@4HZZoSfTaEKXlwoocN%DcPWne6IsKy< zmFom7KhAOg{p?pQkVAV67@Kafo!lt>yEU3ODLEO@%%boB+#HAw5RAHlqgU`#03+IK zRByg|!S?X;&mJisRS~`bOE3|%+G%?=pNgAO1jBs4Cjl{d*A1!!rP$@Z{YmNWCE?IA2`XTa z=Isvv^~3v}7FeACZUR3b06JO7@z7P40CdC}*xUj>WdR${Z@@EIC(oaZX!aZR&<1`5 z$-9PZs%sAbw{)Uj20XS_)WN@>?LGr8Q5ztr^Q(vK0v-!sBx6tj+XLq1AV9bReA?8f z^+a~{halP^LFnA&&B#Fs1_5N98u{fZsZE+Yl9x3i>`eHhQ6zJ(|2z=cMLZp@um|`6 z{8Wsx6_K9jc`{4`&`zZ;U#{I-Cl#QVF2{~n6gz^DXfP4z47;)(WKHC^X9ImbeFXu#n5qnr~5{T2*_xh{3) zZf&iiQ0SB*7)WDfk2DV4=AYa(!~-&g2a+aTEiR*ZQm1C_s$a0@N&ktD$VH^BA9JcL4_K+O-3l9~Zvp_98H3yggQvy~w5+o5De2;hL(FJQmy ziJO9U>`Fy|(O}5ePXTcnK)y%-+^L!Q07gCm!8oB`+_VMF1Hhd7z=eEX=K)|~2FKRr z0*|6rwJ6Qw%YbDG=Ft*!wUeI}vcS3t1Y$`5P6gdVQj#|ONlgA$Fqa5)Ka>Nz4G92$ zkd{_|_Uk6V5Q4A$_~hYni34=s4$$={3XH^@k7P8yIw7*@!6W_6nEX|jtqyV?ey8Q8x?aa^1lJk C*m+g} literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/stoutner/privacybrowser/AboutTabFragment.java b/app/src/main/java/com/stoutner/privacybrowser/AboutTabFragment.java index 5c670bcd..7d63bb22 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/AboutTabFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/AboutTabFragment.java @@ -119,7 +119,7 @@ public class AboutTabFragment extends Fragment { SpannableStringBuilder chromeStringBuilder = new SpannableStringBuilder(chromeLabel + chrome); // Create a blue `ForegroundColorSpan`. We have to use the deprecated `getColor` until API >= 23. - ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue)); + ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700)); // Setup the spans to display the device information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. brandStringBuilder.setSpan(blueColorSpan, brandLabel.length(), brandStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); diff --git a/app/src/main/java/com/stoutner/privacybrowser/BookmarksDatabaseViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/BookmarksDatabaseViewActivity.java index db5b198e..d4d0f4c6 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/BookmarksDatabaseViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/BookmarksDatabaseViewActivity.java @@ -122,7 +122,7 @@ public class BookmarksDatabaseViewActivity extends AppCompatActivity { if (bookmarkParentFolder.isEmpty()) { parentFolderImageView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.folder_grey)); bookmarkParentFolderTextView.setText(R.string.home_folder); - bookmarkParentFolderTextView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.grey)); + bookmarkParentFolderTextView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.grey_500)); } else { parentFolderImageView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.folder_dark_blue)); bookmarkParentFolderTextView.setText(bookmarkParentFolder); diff --git a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java index 4433cf38..54f6d8ff 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java @@ -23,6 +23,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.DialogFragment; import android.app.DownloadManager; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -74,6 +75,14 @@ import java.util.Map; // We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21. public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener, SslCertificateError.SslCertificateErrorListener, DownloadFile.DownloadFileListener { + // `privacyBrowserContext` is public static so it can be accessed from `SettingsFragment`. + // It is also used in `onCreate()` and `onConfigurationChanged()`. + public static Context privacyBrowserContext; + + // `appBar` is public static so it can be accessed from `OrbotProxyHelper`. + // It is also used in `onCreate()`. + public static ActionBar appBar; + // `favoriteIcon` is public static so it can be accessed from `CreateHomeScreenShortcut`, `BookmarksActivity`, `CreateBookmark`, `CreateBookmarkFolder`, and `EditBookmark`. // It is also used in `onCreate()` and `onCreateHomeScreenShortcutCreate()`. public static Bitmap favoriteIcon; @@ -162,10 +171,13 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // We need a handle for the activity, which is accessed from `SettingsFragment` and fed into `updatePrivacyIcons()`. privacyBrowserActivity = this; + // Get a handle for the application context. + privacyBrowserContext = getApplicationContext(); + // We need to use the SupportActionBar from android.support.v7.app.ActionBar until the minimum API is >= 21. Toolbar supportAppBar = (Toolbar) findViewById(R.id.appBar); setSupportActionBar(supportAppBar); - final ActionBar appBar = getSupportActionBar(); + appBar = getSupportActionBar(); // This is needed to get rid of the Android Studio warning that appBar might be null. assert appBar != null; @@ -200,7 +212,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Implement swipe to refresh swipeToRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); assert swipeToRefresh != null; //This assert removes the incorrect warning on the following line that swipeToRefresh might be null. - swipeToRefresh.setColorSchemeResources(R.color.blue); + swipeToRefresh.setColorSchemeResources(R.color.blue_700); swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { @@ -448,6 +460,10 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation customHeaders.put("DNT", "1"); } + // Set Orbot proxy status. The default is `false`. + if (sharedPreferences.getBoolean("proxy_through_orbot", false)) { + OrbotProxyHelper.setProxy(privacyBrowserContext, privacyBrowserActivity, "localhost", "8118"); + } // Get the intent information that started the app. final Intent intent = getIntent(); @@ -469,7 +485,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // If the favorite icon is null, load the default. if (favoriteIcon == null) { // We have to use `ContextCompat` until API >= 21. - Drawable favoriteIconDrawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.world); + Drawable favoriteIconDrawable = ContextCompat.getDrawable(privacyBrowserContext, R.drawable.world); BitmapDrawable favoriteIconBitmapDrawable = (BitmapDrawable) favoriteIconDrawable; favoriteIcon = favoriteIconBitmapDrawable.getBitmap(); } @@ -951,7 +967,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation super.onConfigurationChanged(newConfig); // Reload the ad if this is the free flavor. - BannerAd.reloadAfterRotate(adView, getApplicationContext(), getString(R.string.ad_id)); + BannerAd.reloadAfterRotate(adView, privacyBrowserContext, getString(R.string.ad_id)); // Reinitialize the adView variable, as the View will have been removed and re-added in the free flavor by BannerAd.reloadAfterRotate(). adView = findViewById(R.id.adView); diff --git a/app/src/main/java/com/stoutner/privacybrowser/OrbotProxyHelper.java b/app/src/main/java/com/stoutner/privacybrowser/OrbotProxyHelper.java new file mode 100644 index 00000000..ec9ad58f --- /dev/null +++ b/app/src/main/java/com/stoutner/privacybrowser/OrbotProxyHelper.java @@ -0,0 +1,101 @@ +/** + * Copyright 2016 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; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Proxy; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; +import android.util.ArrayMap; +import android.util.Log; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class OrbotProxyHelper { + public static void setProxy(Context privacyBrowserContext, Activity parentActivity, String proxyHost, String proxyPort) { + // Set the proxy values + System.setProperty("http.proxyHost", proxyHost); + System.setProperty("http.proxyPort", proxyPort); + System.setProperty("https.proxyHost", proxyHost); + System.setProperty("https.proxyPort", proxyPort); + + // Use reflection to apply the new proxy values. + try { + Class applicationClass = Class.forName("android.app.Application"); + Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk"); + // `setAccessible(true)` allows us to change the value of `mLoadedApkField`. + mLoadedApkField.setAccessible(true); + Object mLoadedApkObject = mLoadedApkField.get(privacyBrowserContext); + + Class loadedApkClass = Class.forName("android.app.LoadedApk"); + Field mReceiversField = loadedApkClass.getDeclaredField("mReceivers"); + // `setAccessible(true)` allows us to change the value of `mReceiversField`. + mReceiversField.setAccessible(true); + + ArrayMap receivers = (ArrayMap) mReceiversField.get(mLoadedApkObject); + + for (Object receiverMap : receivers.values()) { + for (Object receiver : ((ArrayMap) receiverMap).keySet()) { + // We have to use `Class`, which is an `unbounded wildcard parameterized type`, instead of `Class`, which is a `raw type`, or `receiveClass.getDeclaredMethod` below will produce an error. + Class receiverClass = receiver.getClass(); + if (receiverClass.getName().contains("ProxyChangeListener")) { + Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class); + Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION); + onReceiveMethod.invoke(receiver, privacyBrowserContext, intent); + } + } + } + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException exception) { + Log.d("enableProxyThroughOrbot", "Exception: " + exception); + } + + if (proxyPort.equals("8118")) { // Orbot proxy was turned on. + // Set the `appBar` background to be light blue if Orbot proxy support is enabled. + MainWebViewActivity.appBar.setBackgroundDrawable(ContextCompat.getDrawable(privacyBrowserContext, R.color.blue_50)); + + try { // Check to see if Orbot is installed. + PackageManager packageManager = privacyBrowserContext.getPackageManager(); + packageManager.getPackageInfo("org.torproject.android", PackageManager.GET_ACTIVITIES); + } catch (PackageManager.NameNotFoundException exception){ // If an exception is thrown, Orbot is not installed. + // Build an `AlertDialog`. `R.style.LightAlertDialog` formats the color of the button text. + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(parentActivity, R.style.LightAlertDialog); + dialogBuilder.setMessage(R.string.orbot_proxy_not_installed); + dialogBuilder.setPositiveButton(R.string.close, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Do nothing. The `AlertDialog` will close automatically. + } + }); + + // Convert `dialogBuilder` to `alertDialog` and display it on the screen. + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + } + } else { // Otherwise set the default grey `appBar` background. + MainWebViewActivity.appBar.setBackgroundDrawable(ContextCompat.getDrawable(privacyBrowserContext, R.color.grey_100)); + } + } +} diff --git a/app/src/main/java/com/stoutner/privacybrowser/SettingsFragment.java b/app/src/main/java/com/stoutner/privacybrowser/SettingsFragment.java index 7446ce61..60e250b2 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/SettingsFragment.java +++ b/app/src/main/java/com/stoutner/privacybrowser/SettingsFragment.java @@ -20,6 +20,7 @@ package com.stoutner.privacybrowser; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; @@ -241,6 +242,17 @@ public class SettingsFragment extends PreferenceFragment { MainWebViewActivity.mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0")); break; + case "proxy_through_orbot": + // Get a handle for `settingsActivity`. + Activity settingsActivity = getActivity(); + + // Update the proxy. The default is `false` + if (sharedPreferences.getBoolean("proxy_through_orbot", false)) { // Orbot proxies on localhost port 8118. + OrbotProxyHelper.setProxy(MainWebViewActivity.privacyBrowserContext, settingsActivity, "localhost", "8118"); + } else { // Disable the proxy by setting the host to `null` and the port to `0`. + OrbotProxyHelper.setProxy(MainWebViewActivity.privacyBrowserContext, settingsActivity, "", "0"); + } + case "javascript_disabled_search": String newJavaScriptDisabledSearchString = sharedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q="); if (newJavaScriptDisabledSearchString.equals("Custom URL")) { diff --git a/app/src/main/java/com/stoutner/privacybrowser/SslCertificateError.java b/app/src/main/java/com/stoutner/privacybrowser/SslCertificateError.java index e42b3926..3ee666f8 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/SslCertificateError.java +++ b/app/src/main/java/com/stoutner/privacybrowser/SslCertificateError.java @@ -212,7 +212,7 @@ public class SslCertificateError extends DialogFragment{ SpannableStringBuilder endDateStringBuilder = new SpannableStringBuilder((endDateLabel + endDate)); // Create a blue `ForegroundColorSpan`. We have to use the deprecated `getColor` until API >= 23. - ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue)); + ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700)); // Setup the spans to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. urlStringBuilder.setSpan(blueColorSpan, urlLabel.length(), urlStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); diff --git a/app/src/main/java/com/stoutner/privacybrowser/ViewSslCertificate.java b/app/src/main/java/com/stoutner/privacybrowser/ViewSslCertificate.java index 2a81362a..f68f503c 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/ViewSslCertificate.java +++ b/app/src/main/java/com/stoutner/privacybrowser/ViewSslCertificate.java @@ -26,15 +26,12 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.http.SslCertificate; import android.os.Bundle; -import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.widget.TextView; -import org.w3c.dom.Text; - import java.util.Date; public class ViewSslCertificate extends DialogFragment { @@ -123,7 +120,7 @@ public class ViewSslCertificate extends DialogFragment { SpannableStringBuilder endDateStringBuilder = new SpannableStringBuilder(endDateLabel + endDate.toString()); // Create a blue `ForegroundColorSpan`. We have to use the deprecated `getColor` until API >= 23. - ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue)); + ForegroundColorSpan blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700)); // Setup the spans to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. issuedToCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length(), issuedToCNameStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); diff --git a/app/src/main/res/drawable/bookmarks_list_selector.xml b/app/src/main/res/drawable/bookmarks_list_selector.xml index 834b9ec6..30e99383 100644 --- a/app/src/main/res/drawable/bookmarks_list_selector.xml +++ b/app/src/main/res/drawable/bookmarks_list_selector.xml @@ -22,5 +22,5 @@ + android:drawable="@color/blue_100" /> \ No newline at end of file diff --git a/app/src/main/res/layout/about_coordinatorlayout.xml b/app/src/main/res/layout/about_coordinatorlayout.xml index a0d221e6..6821c446 100644 --- a/app/src/main/res/layout/about_coordinatorlayout.xml +++ b/app/src/main/res/layout/about_coordinatorlayout.xml @@ -35,12 +35,12 @@ android:layout_width="match_parent" android:orientation="vertical" > - + @@ -48,7 +48,7 @@ android:id="@+id/about_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" - android:background="@color/blue" + android:background="@color/blue_700" android:theme="@style/DarkAppBar" app:popupTheme="@style/LightPopupOverlay" /> @@ -57,8 +57,8 @@ xmlns:android.support.design="http://schemas.android.com/apk/res-auto" android:layout_height="wrap_content" android:layout_width="match_parent" - android.support.design:tabBackground="@color/blue" - android.support.design:tabTextColor="@color/light_blue" + android.support.design:tabBackground="@color/blue_700" + android.support.design:tabTextColor="@color/blue_100" android.support.design:tabSelectedTextColor="@color/white" android.support.design:tabIndicatorColor="@color/white" android.support.design:tabMode="scrollable" /> diff --git a/app/src/main/res/layout/about_tab_version.xml b/app/src/main/res/layout/about_tab_version.xml index 0fd52013..7196450c 100644 --- a/app/src/main/res/layout/about_tab_version.xml +++ b/app/src/main/res/layout/about_tab_version.xml @@ -60,7 +60,7 @@ android:id="@+id/about_version_number" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="@color/blue" + android:textColor="@color/blue_700" android:layout_below="@id/about_version_privacy_browser_textview" android:layout_toEndOf="@id/about_version_icon" /> @@ -82,7 +82,7 @@ android:text="@string/hardware" android:textStyle="bold" android:textSize="18sp" - android:textColor="@color/dark_blue" /> + android:textColor="@color/blue_900" /> diff --git a/app/src/main/res/layout/bookmarks_database_view_coordinatorlayout.xml b/app/src/main/res/layout/bookmarks_database_view_coordinatorlayout.xml index 2db02819..b1aa243d 100644 --- a/app/src/main/res/layout/bookmarks_database_view_coordinatorlayout.xml +++ b/app/src/main/res/layout/bookmarks_database_view_coordinatorlayout.xml @@ -45,7 +45,7 @@ android:id="@+id/bookmarks_database_view_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" - android:background="@color/blue" + android:background="@color/blue_700" android:theme="@style/DarkAppBar" app:popupTheme="@style/LightPopupOverlay" /> diff --git a/app/src/main/res/layout/bookmarks_database_view_item_linearlayout.xml b/app/src/main/res/layout/bookmarks_database_view_item_linearlayout.xml index 393ac28f..8bbaf1bf 100644 --- a/app/src/main/res/layout/bookmarks_database_view_item_linearlayout.xml +++ b/app/src/main/res/layout/bookmarks_database_view_item_linearlayout.xml @@ -41,7 +41,7 @@ android:layout_width="50dp" android:layout_marginEnd="10dp" android:gravity="end" - android:textColor="@color/grey" + android:textColor="@color/grey_500" android:textSize="22sp" /> - + @@ -48,7 +48,7 @@ android:id="@+id/guide_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/blue" + android:background="@color/blue_700" android:theme="@style/DarkAppBar" app:popupTheme="@style/LightPopupOverlay" /> @@ -57,8 +57,8 @@ xmlns:android.support.design="http://schemas.android.com/apk/res-auto" android:layout_height="wrap_content" android:layout_width="match_parent" - android.support.design:tabBackground="@color/blue" - android.support.design:tabTextColor="@color/light_blue" + android.support.design:tabBackground="@color/blue_700" + android.support.design:tabTextColor="@color/blue_100" android.support.design:tabSelectedTextColor="@color/white" android.support.design:tabIndicatorColor="@color/white" android.support.design:tabMode="scrollable" /> diff --git a/app/src/main/res/layout/main_coordinatorlayout.xml b/app/src/main/res/layout/main_coordinatorlayout.xml index 0dba1f95..b0d9c1f2 100644 --- a/app/src/main/res/layout/main_coordinatorlayout.xml +++ b/app/src/main/res/layout/main_coordinatorlayout.xml @@ -56,7 +56,7 @@ android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?attr/colorPrimary" + android:background="@color/grey_100" app:popupTheme="@style/LightPopupOverlay" /> @@ -81,5 +81,5 @@ android:layout_gravity="start" app:headerLayout="@layout/navigation_header" app:menu="@menu/webview_navigation_menu" - app:itemIconTint="@color/blue_grey" /> + app:itemIconTint="@color/blue_800" /> \ No newline at end of file diff --git a/app/src/main/res/layout/navigation_header.xml b/app/src/main/res/layout/navigation_header.xml index 7ed9685e..0f6c443a 100644 --- a/app/src/main/res/layout/navigation_header.xml +++ b/app/src/main/res/layout/navigation_header.xml @@ -32,6 +32,6 @@ android:paddingStart="15dp" android:textStyle="bold" android:textSize="20sp" - android:background="@color/blue" + android:background="@color/blue_700" android:textColor="@color/white" /> diff --git a/app/src/main/res/layout/ssl_certificate_error.xml b/app/src/main/res/layout/ssl_certificate_error.xml index c9626512..08e8ca79 100644 --- a/app/src/main/res/layout/ssl_certificate_error.xml +++ b/app/src/main/res/layout/ssl_certificate_error.xml @@ -33,7 +33,7 @@ android:id="@+id/primary_error" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:textColor="@color/red" + android:textColor="@color/red_a700" android:textStyle="bold"/> @@ -44,7 +44,7 @@ android:text="@string/url" android:textAllCaps="true" android:textStyle="bold" - android:textColor="@color/dark_blue" /> + android:textColor="@color/blue_900" /> + android:textColor="@color/blue_900" /> + android:textColor="@color/blue_900"/> + android:textColor="@color/blue_900"/> \ No newline at end of file diff --git a/app/src/main/res/layout/view_ssl_certificate.xml b/app/src/main/res/layout/view_ssl_certificate.xml index cdb5cebe..ccef2701 100644 --- a/app/src/main/res/layout/view_ssl_certificate.xml +++ b/app/src/main/res/layout/view_ssl_certificate.xml @@ -36,7 +36,7 @@ android:text="@string/issued_to" android:textAllCaps="true" android:textStyle="bold" - android:textColor="@color/dark_blue" /> + android:textColor="@color/blue_900" /> + android:textColor="@color/blue_900"/> + android:textColor="@color/blue_900"/> = 22 we can remove the hardcoded colors and reference these entries. --> #FF000000 - #FF1976D2 - #FF0D47A1 - #FF607D8B - #FF9E9E9E - #FF64DD17 - #FFBBDEFB - #FF42A5F5 - #FFF57F17 - #FFD50000 + + #FFE3F2FD + #FFBBDEFB + #FF90CAF9 + #FF64B5F6 + #FF42A5F5 + #FF2196F3 + #FF1E88E5 + #FF1976D2 + #FF1565C0 + #FF0D47A1 + #FF2962FF + + #FF607D8B + + #FFF5F5F5 + #FF9E9E9E + + #FF64DD17 + + #FFD50000 + #FFFFFFFF - #FFFFD600 + + #FFF57F17 + #FFFFD600 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 628548f3..9b6a969d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -166,119 +166,124 @@ Privacy - Enable JavaScript by default - JavaScript allows websites to run programs (scripts) on your device. - Enable first-party cookies by default - Devices with versions of Android older than Lollipop (version 5.0) will also enable third-party cookies with this setting. - Enable third-party cookies by default - This setting requires Android Lollipop (version 5.0) or higher. It has no effect if first-party cookies are disabled. - Enable DOM storage by default - JavaScript must be enabled for DOM storage to function. - Enable saving of form data by default - Saved form data can auto-populate fields on websites. - User agent - - WebView Default - Privacy Browser 1.0 - Firefox 48 on Android 6.0.1 - Chrome 52 on Android 6.0.1 - Safari on iOS 10 - Firefox 45 on Linux - Chromium 52 on Linux - Konqueror 4.14.23 on Linux - Firefox 48 on Windows 10 - Chrome 52 on Windows 10 - Internet Explorer 11 on Windows 10 - Edge 14 on Windows 10 - Safari 9.1.2 on OS X 10.11.6 - Custom - - - Default user agent - PrivacyBrowser/1.0 - Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0 - Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36 - Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A5345a Safari/602.1 - Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) konqueror/4.14.23 Safari/537.21 - Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 - Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 - Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7 - Custom user agent - - Custom user agent - Do not track - Send the Do Not Track header which politely suggests that web servers not track this browser. + Enable JavaScript by default + JavaScript allows websites to run programs (scripts) on your device. + Enable first-party cookies by default + Devices with versions of Android older than Lollipop (version 5.0) will also enable third-party cookies with this setting. + Enable third-party cookies by default + This setting requires Android Lollipop (version 5.0) or higher. It has no effect if first-party cookies are disabled. + Enable DOM storage by default + JavaScript must be enabled for DOM storage to function. + Enable saving of form data by default + Saved form data can auto-populate fields on websites. + User agent + + WebView Default + Privacy Browser 1.0 + Firefox 48 on Android 6.0.1 + Chrome 52 on Android 6.0.1 + Safari on iOS 10 + Firefox 45 on Linux + Chromium 52 on Linux + Konqueror 4.14.23 on Linux + Firefox 48 on Windows 10 + Chrome 52 on Windows 10 + Internet Explorer 11 on Windows 10 + Edge 14 on Windows 10 + Safari 9.1.2 on OS X 10.11.6 + Custom + + + Default user agent + PrivacyBrowser/1.0 + Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0 + Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36 + Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A5345a Safari/602.1 + Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 + Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 + Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) konqueror/4.14.23 Safari/537.21 + Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 + Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 + Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7 + Custom user agent + + Custom user agent + Do not track + Send the Do Not Track header which politely suggests that web servers not track this browser. + Proxy through Orbot + Proxy all web traffic through Orbot on localhost:8118. Search - JavaScript-disabled search - - DuckDuckGo - Google - Bing - Yahoo - StartPage - Qwant - Custom - - - https://duckduckgo.com/html/?q= - https://www.google.com/search?q= - https://www.bing.com/search?q= - https://search.yahoo.com/mobile/s?nojs=1&p= - https://www.startpage.com/do/search?q= - https://lite.qwant.com/?q= - Custom URL - - JavaScript-disabled search custom URL - JavaScript-enabled search - - DuckDuckGo - Google - Bing - Yahoo - StartPage - Qwant - Custom - - - https://duckduckgo.com/?q= - https://www.google.com/search?q= - https://www.bing.com/search?q= - https://search.yahoo.com/mobile/s?p= - https://www.startpage.com/do/search?q= - https://www.qwant.com/?q= - Custom URL - - JavaScript-enabled search custom URL - Custom URL + JavaScript-disabled search + + DuckDuckGo + Google + Bing + Yahoo + StartPage + Qwant + Custom + + + https://duckduckgo.com/html/?q= + https://www.google.com/search?q= + https://www.bing.com/search?q= + https://search.yahoo.com/mobile/s?nojs=1&p= + https://www.startpage.com/do/search?q= + https://lite.qwant.com/?q= + Custom URL + + JavaScript-disabled search custom URL + JavaScript-enabled search + + DuckDuckGo + Google + Bing + Yahoo + StartPage + Qwant + Custom + + + https://duckduckgo.com/?q= + https://www.google.com/search?q= + https://www.bing.com/search?q= + https://search.yahoo.com/mobile/s?p= + https://www.startpage.com/do/search?q= + https://www.qwant.com/?q= + Custom URL + + JavaScript-enabled search custom URL + Custom URL General - Homepage - Default font size - - 50% - 75% - 100% - 125% - 150% - 175% - 200% - - - 50 - 75 - 100 - 125 - 150 - 175 - 200 - - Swipe to refresh - Some websites don\'t work well if swipe to refresh is enabled. - Display additional app bar icons - Display icons for toggling cookies, DOM storage, and form data in the app bar if there is room. + Homepage + Default font size + + 50% + 75% + 100% + 125% + 150% + 175% + 200% + + + 50 + 75 + 100 + 125 + 150 + 175 + 200 + + Swipe to refresh + Some websites don\'t work well if swipe to refresh is enabled. + Display additional app bar icons + Display icons for toggling cookies, DOM storage, and form data in the app bar if there is room. + + + Orbot proxy will not work unless Orbot is installed. About Privacy Browser diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 25ca3a0d..74364f58 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,23 +23,23 @@ When it is specified the root layout should include android:fitsSystemWindows="true". --> @@ -51,6 +51,6 @@ \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 4441ca6a..35d9ed1b 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -74,6 +74,12 @@ android:summary="@string/do_not_track_summary" android:defaultValue="true" /> + +