]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt
Detect the Google Play flavor of I2P. https://redmine.stoutner.com/issues/895
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / AboutVersionFragment.kt
index 9d002ad4ed6917d038c0b371ab1a73a57cd92b5d..c4c522741f892e56f80ee0930bc4a7a8b9856d14 100644 (file)
@@ -105,6 +105,7 @@ class AboutVersionFragment : Fragment() {
     private lateinit var androidTextView: TextView
     private lateinit var securityPatchTextView: TextView
     private lateinit var buildTextView: TextView
+    private lateinit var kernelTextView: TextView
     private lateinit var webViewProviderTextView: TextView
     private lateinit var webViewVersionTextView: TextView
     private lateinit var orbotTextView: TextView
@@ -154,7 +155,7 @@ class AboutVersionFragment : Fragment() {
     }
 
     // Define the save about version text activity result launcher.  It must be defined before `onCreate()` is run or the app will crash.
-    private val saveAboutVersionTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument()) { fileUri: Uri? ->
+    private val saveAboutVersionTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { fileUri: Uri? ->
         // Only save the file if the URI is not null, which happens if the user exited the file picker by pressing back.
         if (fileUri != null) {
             try {
@@ -198,7 +199,7 @@ class AboutVersionFragment : Fragment() {
     }
 
     // Define the save about version image activity result launcher.  It must be defined before `onCreate()` is run or the app will crash.
-    private val saveAboutVersionImageActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument()) { fileUri: Uri? ->
+    private val saveAboutVersionImageActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("image/png")) { fileUri: Uri? ->
         // Only save the file if the URI is not null, which happens if the user exited the file picker by pressing back.
         if (fileUri != null) {
             // Save the about version image.
@@ -235,6 +236,7 @@ class AboutVersionFragment : Fragment() {
         androidTextView = aboutVersionLayout.findViewById(R.id.android)
         securityPatchTextView = aboutVersionLayout.findViewById(R.id.security_patch)
         buildTextView = aboutVersionLayout.findViewById(R.id.build)
+        kernelTextView = aboutVersionLayout.findViewById(R.id.kernel)
         webViewProviderTextView = aboutVersionLayout.findViewById(R.id.webview_provider)
         webViewVersionTextView = aboutVersionLayout.findViewById(R.id.webview_version)
         orbotTextView = aboutVersionLayout.findViewById(R.id.orbot)
@@ -273,6 +275,7 @@ class AboutVersionFragment : Fragment() {
         val bootloaderLabel = getString(R.string.bootloader) + "  "
         val androidLabel = getString(R.string.android) + "  "
         val buildLabel = getString(R.string.build) + "  "
+        val kernelLabel = getString(R.string.kernel) + "  "
         val webViewVersionLabel = getString(R.string.webview_version) + "  "
         appConsumedMemoryLabel = getString(R.string.app_consumed_memory) + "  "
         appAvailableMemoryLabel = getString(R.string.app_available_memory) + "  "
@@ -283,8 +286,8 @@ class AboutVersionFragment : Fragment() {
         systemTotalMemoryLabel = getString(R.string.system_total_memory) + "  "
         val easyListLabel = getString(R.string.easylist_label) + "  "
         val easyPrivacyLabel = getString(R.string.easyprivacy_label) + "  "
-        val fanboyAnnoyanceLabel = getString(R.string.fanboy_annoyance_label) + "  "
-        val fanboySocialLabel = getString(R.string.fanboy_social_label) + "  "
+        val fanboyAnnoyanceLabel = getString(R.string.fanboys_annoyance_label) + "  "
+        val fanboySocialLabel = getString(R.string.fanboys_social_label) + "  "
         val ultraListLabel = getString(R.string.ultralist_label) + "  "
         val ultraPrivacyLabel = getString(R.string.ultraprivacy_label) + "  "
         val issuerDNLabel = getString(R.string.issuer_dn) + "  "
@@ -310,12 +313,15 @@ class AboutVersionFragment : Fragment() {
         val radio = Build.getRadioVersion()
         val android = Build.VERSION.RELEASE + " (" + getString(R.string.api) + " " + Build.VERSION.SDK_INT + ")"
         val build = Build.DISPLAY
-        // Select the substring that begins after `Chrome/` and goes until the next ` `.
+        val kernel = System.getProperty("os.version")
+
+        // Get the WebView version, selecting the substring that begins after `Chrome/` and goes until the next ` `.
         val webView = userAgentString.substring(userAgentString.indexOf("Chrome/") + 7, userAgentString.indexOf(" ", userAgentString.indexOf("Chrome/")))
 
         // Get the Orbot version name if Orbot is installed.
         val orbot: String = try {
-            // Store the version name.
+            // Store the version name.  The newer `getPackageInfo()` may be used once the minimum API >= 33.
+            @Suppress("DEPRECATION")
             requireContext().packageManager.getPackageInfo("org.torproject.android", 0).versionName
         } catch (exception: PackageManager.NameNotFoundException) {  // Orbot is not installed.
             // Store an empty string.
@@ -324,16 +330,24 @@ class AboutVersionFragment : Fragment() {
 
         // Get the I2P version name if I2P is installed.
         val i2p: String = try {
-            // Store the version name.
-            requireContext().packageManager.getPackageInfo("net.i2p.android.router", 0).versionName
-        } catch (exception: PackageManager.NameNotFoundException) {  // I2P is not installed.
-            // Store an empty string.
-            ""
+            // Check to see if the F-Droid flavor is installed.  The newer `getPackageInfo()` may be used once the minimum API >= 33.
+            @Suppress("DEPRECATION")
+            requireContext().packageManager.getPackageInfo("net.i2p.android.router", 0).versionName + " " + requireContext().getString(R.string.fdroid_flavor)
+        } catch (exception: PackageManager.NameNotFoundException) {  // The F-Droid flavor is not installed.
+            try {
+                // Check to see if the F-Droid flavor is installed.  The newer `getPackageInfo()` may be used once the minimum API >= 33.
+                @Suppress("DEPRECATION")
+                requireContext().packageManager.getPackageInfo("net.i2p.android", 0).versionName + " " + requireContext().getString(R.string.google_play_flavor)
+            } catch (exception: PackageManager.NameNotFoundException) {  // The Google Play flavor is not installed either.
+                // Store an empty string.
+                ""
+            }
         }
 
         // Get the OpenKeychain version name if it is installed.
         val openKeychain: String = try {
-            // Store the version name.
+            // Store the version name.  The newer `getPackageInfo()` may be used once the minimum API >= 33.
+            @Suppress("DEPRECATION")
             requireContext().packageManager.getPackageInfo("org.sufficientlysecure.keychain", 0).versionName
         } catch (exception: PackageManager.NameNotFoundException) {  // OpenKeychain is not installed.
             // Store an empty string.
@@ -348,6 +362,7 @@ class AboutVersionFragment : Fragment() {
         val bootloaderStringBuilder = SpannableStringBuilder(bootloaderLabel + bootloader)
         val androidStringBuilder = SpannableStringBuilder(androidLabel + android)
         val buildStringBuilder = SpannableStringBuilder(buildLabel + build)
+        val kernelStringBuilder = SpannableStringBuilder(kernelLabel + kernel)
         val webViewVersionStringBuilder = SpannableStringBuilder(webViewVersionLabel + webView)
         val easyListStringBuilder = SpannableStringBuilder(easyListLabel + blocklistVersions[0])
         val easyPrivacyStringBuilder = SpannableStringBuilder(easyPrivacyLabel + blocklistVersions[1])
@@ -357,7 +372,7 @@ class AboutVersionFragment : Fragment() {
         val ultraPrivacyStringBuilder = SpannableStringBuilder(ultraPrivacyLabel + blocklistVersions[5])
 
         // Set the blue color span according to the theme.  The deprecated `getColor()` must be used until the minimum API >= 23.
-        blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.about_version_blue_text))
+        blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text))
 
         // Set 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)
@@ -367,6 +382,7 @@ class AboutVersionFragment : 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)
+        kernelStringBuilder.setSpan(blueColorSpan, kernelLabel.length, kernelStringBuilder.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)
@@ -384,6 +400,7 @@ class AboutVersionFragment : Fragment() {
         bootloaderTextView.text = bootloaderStringBuilder
         androidTextView.text = androidStringBuilder
         buildTextView.text = buildStringBuilder
+        kernelTextView.text = kernelStringBuilder
         webViewVersionTextView.text = webViewVersionStringBuilder
         easyListTextView.text = easyListStringBuilder
         easyPrivacyTextView.text = easyPrivacyStringBuilder
@@ -501,7 +518,8 @@ class AboutVersionFragment : 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.
-            // Once the minimum API >= 28, `GET_SIGNING_CERTIFICATES` can be used instead.
+            // Once the minimum API >= 28, `GET_SIGNING_CERTIFICATES` can be used instead.  Once the minimum API >= 33, the newer `getPackageInfo()` may be used.
+            @Suppress("DEPRECATION")
             @SuppressLint("PackageManagerGetSignatures") val packageSignature = requireContext().packageManager.getPackageInfo(requireContext().packageName,PackageManager.GET_SIGNATURES)
                 .signatures[0]
 
@@ -807,6 +825,8 @@ class AboutVersionFragment : Fragment() {
         }
         aboutVersionStringBuilder.append(buildTextView.text)
         aboutVersionStringBuilder.append("\n")
+        aboutVersionStringBuilder.append(kernelTextView.text)
+        aboutVersionStringBuilder.append("\n")
         if (webViewProviderTextView.visibility == View.VISIBLE) {
             aboutVersionStringBuilder.append(webViewProviderTextView.text)
             aboutVersionStringBuilder.append("\n")