]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/AboutTabFragment.java
Switch to the new Day/Night theme. https://redmine.stoutner.com/issues/522
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / AboutTabFragment.java
index 4ff9a28a2d1194facd314ca20c66ba17060fbb8b..8f148a4bcf05890154d3ae6ec63a458ee8c430e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2019 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2020 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
  *
@@ -21,12 +21,12 @@ package com.stoutner.privacybrowser.fragments;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
-import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.Signature;
+import android.content.res.Configuration;
 import android.os.Build;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
@@ -38,6 +38,7 @@ import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
+import androidx.webkit.WebViewCompat;
 
 import com.stoutner.privacybrowser.BuildConfig;
 import com.stoutner.privacybrowser.R;
@@ -100,18 +101,15 @@ public class AboutTabFragment extends Fragment {
         Context context = getContext();
         assert context != null;
 
-        // Get a handle for the shared preferences.
-        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
-
-        // Get the theme preference.
-        boolean darkTheme = sharedPreferences.getBoolean("dark_theme", false);
+        // Get the current theme status.
+        int currentThemeStatus = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
 
         // Load the tabs.  Tab numbers start at 0.
         if (tabNumber == 0) {  // Load the about tab.
             // Setting false at the end of inflater.inflate does not attach the inflated layout as a child of container.  The fragment will take care of attaching the root automatically.
             tabLayout = layoutInflater.inflate(R.layout.about_tab_version, container, false);
 
-            // Get handles for the `TextViews`.
+            // Get handles for the text views.
             TextView versionTextView = tabLayout.findViewById(R.id.version);
             TextView brandTextView = tabLayout.findViewById(R.id.brand);
             TextView manufacturerTextView = tabLayout.findViewById(R.id.manufacturer);
@@ -122,13 +120,16 @@ public class AboutTabFragment extends Fragment {
             TextView androidTextView = tabLayout.findViewById(R.id.android);
             TextView securityPatchTextView = tabLayout.findViewById(R.id.security_patch);
             TextView buildTextView = tabLayout.findViewById(R.id.build);
-            TextView webViewTextView = tabLayout.findViewById(R.id.webview);
+            TextView webViewProviderTextView = tabLayout.findViewById(R.id.webview_provider);
+            TextView webViewVersionTextView = tabLayout.findViewById(R.id.webview_version);
             TextView orbotTextView = tabLayout.findViewById(R.id.orbot);
+            TextView i2pTextView = tabLayout.findViewById(R.id.i2p);
             TextView openKeychainTextView = tabLayout.findViewById(R.id.open_keychain);
             TextView easyListTextView = tabLayout.findViewById(R.id.easylist);
             TextView easyPrivacyTextView = tabLayout.findViewById(R.id.easyprivacy);
             TextView fanboyAnnoyanceTextView = tabLayout.findViewById(R.id.fanboy_annoyance);
             TextView fanboySocialTextView = tabLayout.findViewById(R.id.fanboy_social);
+            TextView ultraListTextView = tabLayout.findViewById(R.id.ultralist);
             TextView ultraPrivacyTextView = tabLayout.findViewById(R.id.ultraprivacy);
             TextView certificateIssuerDNTextView = tabLayout.findViewById(R.id.certificate_issuer_dn);
             TextView certificateSubjectDNTextView = tabLayout.findViewById(R.id.certificate_subject_dn);
@@ -147,11 +148,12 @@ public class AboutTabFragment extends Fragment {
             String bootloaderLabel = getString(R.string.bootloader) + "  ";
             String androidLabel = getString(R.string.android) + "  ";
             String buildLabel = getString(R.string.build) + "  ";
-            String webViewLabel = getString(R.string.webview) + "  ";
+            String webViewVersionLabel = getString(R.string.webview_version) + "  ";
             String easyListLabel = getString(R.string.easylist_label) + "  ";
             String easyPrivacyLabel = getString(R.string.easyprivacy_label) + "  ";
             String fanboyAnnoyanceLabel = getString(R.string.fanboy_annoyance_label) + "  ";
             String fanboySocialLabel = getString(R.string.fanboy_social_label) + "  ";
+            String ultraListLabel = getString(R.string.ultralist_label) + "  ";
             String ultraPrivacyLabel = getString(R.string.ultraprivacy_label) + "  ";
             String issuerDNLabel = getString(R.string.issuer_dn) + "  ";
             String subjectDNLabel = getString(R.string.subject_dn) + "  ";
@@ -161,7 +163,8 @@ public class AboutTabFragment extends Fragment {
             String serialNumberLabel = getString(R.string.serial_number) + "  ";
             String signatureAlgorithmLabel = getString(R.string.signature_algorithm) + "  ";
 
-            // `webViewLayout` is only used to get the default user agent from `bare_webview`.  It is not used to render content on the screen.
+            // The WebView layout is only used to get the default user agent from `bare_webview`.  It is not used to render content on the screen.
+            // Once the minimum API >= 26 this can be accomplished with the WebView package info.
             View webViewLayout = layoutInflater.inflate(R.layout.bare_webview, container, false);
             WebView tabLayoutWebView = webViewLayout.findViewById(R.id.bare_webview);
             String userAgentString =  tabLayoutWebView.getSettings().getUserAgentString();
@@ -187,6 +190,15 @@ public class AboutTabFragment extends Fragment {
                 orbot = "";
             }
 
+            // Get the I2P version name if I2P is installed.
+            String i2p;
+            try {
+                // Store the version name.
+                i2p = context.getPackageManager().getPackageInfo("net.i2p.android.router", 0).versionName;
+            } catch (PackageManager.NameNotFoundException exception) {  // I2P is not installed.
+                i2p = "";
+            }
+
             // Get the OpenKeychain version name if it is installed.
             String openKeychain;
             try {
@@ -204,18 +216,19 @@ public class AboutTabFragment extends Fragment {
             SpannableStringBuilder bootloaderStringBuilder = new SpannableStringBuilder(bootloaderLabel + bootloader);
             SpannableStringBuilder androidStringBuilder = new SpannableStringBuilder(androidLabel + android);
             SpannableStringBuilder buildStringBuilder = new SpannableStringBuilder(buildLabel + build);
-            SpannableStringBuilder webViewStringBuilder = new SpannableStringBuilder(webViewLabel + webView);
+            SpannableStringBuilder webViewVersionStringBuilder = new SpannableStringBuilder(webViewVersionLabel + webView);
             SpannableStringBuilder easyListStringBuilder = new SpannableStringBuilder(easyListLabel + blocklistVersions[0]);
             SpannableStringBuilder easyPrivacyStringBuilder = new SpannableStringBuilder(easyPrivacyLabel + blocklistVersions[1]);
             SpannableStringBuilder fanboyAnnoyanceStringBuilder = new SpannableStringBuilder(fanboyAnnoyanceLabel + blocklistVersions[2]);
             SpannableStringBuilder fanboySocialStringBuilder = new SpannableStringBuilder(fanboySocialLabel + blocklistVersions[3]);
-            SpannableStringBuilder ultraPrivacyStringBuilder = new SpannableStringBuilder(ultraPrivacyLabel + blocklistVersions[4]);
+            SpannableStringBuilder ultraListStringBuilder = new SpannableStringBuilder(ultraListLabel + blocklistVersions[4]);
+            SpannableStringBuilder ultraPrivacyStringBuilder = new SpannableStringBuilder(ultraPrivacyLabel + blocklistVersions[5]);
 
             // Create the `blueColorSpan` variable.
             ForegroundColorSpan blueColorSpan;
 
-            // Set `blueColorSpan` according to the theme.  We have to use the deprecated `getColor()` until API >= 23.
-            if (darkTheme) {
+            // Set the blue color span according to the theme.  The deprecated `getResources()` must be used until the minimum API >= 23.
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {
                 blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_400));
             } else {
                 blueColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.blue_700));
@@ -229,11 +242,12 @@ public class AboutTabFragment extends Fragment {
             bootloaderStringBuilder.setSpan(blueColorSpan, bootloaderLabel.length(), bootloaderStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             androidStringBuilder.setSpan(blueColorSpan, androidLabel.length(), androidStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             buildStringBuilder.setSpan(blueColorSpan, buildLabel.length(), buildStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
-            webViewStringBuilder.setSpan(blueColorSpan, webViewLabel.length(), webViewStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+            webViewVersionStringBuilder.setSpan(blueColorSpan, webViewVersionLabel.length(), webViewVersionStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             easyListStringBuilder.setSpan(blueColorSpan, easyListLabel.length(), easyListStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
             easyPrivacyStringBuilder.setSpan(blueColorSpan, easyPrivacyLabel.length(), easyPrivacyStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             fanboyAnnoyanceStringBuilder.setSpan(blueColorSpan, fanboyAnnoyanceLabel.length(), fanboyAnnoyanceStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             fanboySocialStringBuilder.setSpan(blueColorSpan, fanboySocialLabel.length(), fanboySocialStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+            ultraListStringBuilder.setSpan(blueColorSpan, ultraListLabel.length(), ultraListStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
             ultraPrivacyStringBuilder.setSpan(blueColorSpan, ultraPrivacyLabel.length(), ultraPrivacyStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
 
             // Display the strings in the text boxes.
@@ -245,13 +259,24 @@ public class AboutTabFragment extends Fragment {
             bootloaderTextView.setText(bootloaderStringBuilder);
             androidTextView.setText(androidStringBuilder);
             buildTextView.setText(buildStringBuilder);
-            webViewTextView.setText(webViewStringBuilder);
+            webViewVersionTextView.setText(webViewVersionStringBuilder);
             easyListTextView.setText(easyListStringBuilder);
             easyPrivacyTextView.setText(easyPrivacyStringBuilder);
             fanboyAnnoyanceTextView.setText(fanboyAnnoyanceStringBuilder);
             fanboySocialTextView.setText(fanboySocialStringBuilder);
+            ultraListTextView.setText(ultraListStringBuilder);
             ultraPrivacyTextView.setText(ultraPrivacyStringBuilder);
 
+            // Only populate the radio text view if there is a radio in the device.
+            if (!radio.isEmpty()) {
+                String radioLabel = getString(R.string.radio) + "  ";
+                SpannableStringBuilder radioStringBuilder = new SpannableStringBuilder(radioLabel + radio);
+                radioStringBuilder.setSpan(blueColorSpan, radioLabel.length(), radioStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                radioTextView.setText(radioStringBuilder);
+            } else {  // This device does not have a radio.
+                radioTextView.setVisibility(View.GONE);
+            }
+
             // Build.VERSION.SECURITY_PATCH is only available for SDK_INT >= 23.
             if (Build.VERSION.SDK_INT >= 23) {
                 String securityPatchLabel = getString(R.string.security_patch) + "  ";
@@ -259,18 +284,36 @@ public class AboutTabFragment extends Fragment {
                 SpannableStringBuilder securityPatchStringBuilder = new SpannableStringBuilder(securityPatchLabel + securityPatch);
                 securityPatchStringBuilder.setSpan(blueColorSpan, securityPatchLabel.length(), securityPatchStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                 securityPatchTextView.setText(securityPatchStringBuilder);
-            } else {  // SDK_INT < 23.
+            } else {  // The API < 23.
+                // Hide the security patch text view.
                 securityPatchTextView.setVisibility(View.GONE);
             }
 
-            // Only populate the radio text view if there is a radio in the device.
-            if (!radio.isEmpty()) {
-                String radioLabel = getString(R.string.radio) + "  ";
-                SpannableStringBuilder radioStringBuilder = new SpannableStringBuilder(radioLabel + radio);
-                radioStringBuilder.setSpan(blueColorSpan, radioLabel.length(), radioStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
-                radioTextView.setText(radioStringBuilder);
-            } else {  // This device does not have a radio.
-                radioTextView.setVisibility(View.GONE);
+            // Only populate the WebView provider if the SDK >= 21.
+            if (Build.VERSION.SDK_INT >= 21) {
+                // Create the WebView provider label.
+                String webViewProviderLabel = getString(R.string.webview_provider) + "  ";
+
+                // Get the current WebView package info.
+                PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(context);
+
+                // Remove the warning below that the package info might be null.
+                assert webViewPackageInfo != null;
+
+                // Get the WebView provider name.
+                String webViewPackageName = webViewPackageInfo.packageName;
+
+                // Create the spannable string builder.
+                SpannableStringBuilder webViewProviderStringBuilder = new SpannableStringBuilder(webViewProviderLabel + webViewPackageName);
+
+                // Apply the coloration.
+                webViewProviderStringBuilder.setSpan(blueColorSpan, webViewProviderLabel.length(), webViewProviderStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+
+                // Display the WebView provider.
+                webViewProviderTextView.setText(webViewProviderStringBuilder);
+            } else {  // The API < 21.
+                // Hide the WebView provider text view.
+                webViewProviderTextView.setVisibility(View.GONE);
             }
 
             // Only populate the Orbot text view if it is installed.
@@ -283,6 +326,16 @@ public class AboutTabFragment extends Fragment {
                 orbotTextView.setVisibility(View.GONE);
             }
 
+            // Only populate the I2P text view if it is installed.
+            if (!i2p.isEmpty()) {
+                String i2pLabel = getString(R.string.i2p)  + "  ";
+                SpannableStringBuilder i2pStringBuilder = new SpannableStringBuilder(i2pLabel + i2p);
+                i2pStringBuilder.setSpan(blueColorSpan, i2pLabel.length(), i2pStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                i2pTextView.setText(i2pStringBuilder);
+            } else {  // I2P is not installed.
+                i2pTextView.setVisibility(View.GONE);
+            }
+
             // Only populate the OpenKeychain text view if it is installed.
             if (!openKeychain.isEmpty()) {
                 String openKeychainLabel = getString(R.string.openkeychain) + "  ";
@@ -296,9 +349,10 @@ public class AboutTabFragment extends Fragment {
             // Display the package signature.
             try {
                 // Get the first package signature.  Suppress the lint warning about the need to be careful in implementing comparison of certificates for security purposes.
-                @SuppressLint("PackageManagerGetSignatures") Signature packageSignature = getContext().getPackageManager().getPackageInfo(getContext().getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
+                @SuppressLint("PackageManagerGetSignatures") Signature packageSignature = getContext().getPackageManager().getPackageInfo(getContext().getPackageName(),
+                        PackageManager.GET_SIGNATURES).signatures[0];
 
-                // Convert the signature to a `byte[]` `InputStream`.
+                // Convert the signature to a byte array input stream.
                 InputStream certificateByteArrayInputStream = new ByteArrayInputStream(packageSignature.toByteArray());
 
                 // Display the certificate information on the screen.
@@ -350,7 +404,7 @@ public class AboutTabFragment extends Fragment {
             } catch (PackageManager.NameNotFoundException e) {
                 // Do nothing if `PackageManager` says Privacy Browser isn't installed.
             }
-        } else { // load a `WebView` for all the other tabs.  Tab numbers start at 0.
+        } else { // load a WebView for all the other tabs.  Tab numbers start at 0.
             // Setting false at the end of inflater.inflate does not attach the inflated layout as a child of container.  The fragment will take care of attaching the root automatically.
             tabLayout = layoutInflater.inflate(R.layout.bare_webview, container, false);
 
@@ -358,7 +412,7 @@ public class AboutTabFragment extends Fragment {
             WebView tabWebView = (WebView) tabLayout;
 
             // Load the tabs according to the theme.
-            if (darkTheme) {  // The dark theme is applied.
+            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES) {  // The dark theme is applied.
                 // Set the background color.  The deprecated `.getColor()` must be used until the minimum API >= 23.
                 tabWebView.setBackgroundColor(getResources().getColor(R.color.gray_850));