]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt
Add kernel information to About > Version. https://redmine.stoutner.com/issues/815
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / AboutVersionFragment.kt
index 4a9869c44dc0e6715a703e8d1228a9d25022477f..7fb52dac7c364597213315d6f8d19bc33766e401 100644 (file)
@@ -1,20 +1,20 @@
 /*
- * Copyright © 2016-2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2022 Soren Stoutner <soren@stoutner.com>.
  *
- * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
  *
- * Privacy Browser is free software: you can redistribute it and/or modify
+ * Privacy Browser Android 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,
+ * Privacy Browser Android 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 <http://www.gnu.org/licenses/>.
+ * along with Privacy Browser Android.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 package com.stoutner.privacybrowser.fragments
@@ -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,15 +155,15 @@ 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()) { fileNameUri: Uri? ->
+    private val saveAboutVersionTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument()) { 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 (fileNameUri != null) {
+        if (fileUri != null) {
             try {
                 // Get the about version string.
                 val aboutVersionString = getAboutVersionString()
 
                 // Open an output stream.
-                val outputStream = requireActivity().contentResolver.openOutputStream(fileNameUri)!!
+                val outputStream = requireActivity().contentResolver.openOutputStream(fileUri)!!
 
                 // Write the about version string to the output stream.
                 outputStream.write(aboutVersionString.toByteArray(StandardCharsets.UTF_8))
@@ -170,19 +171,19 @@ class AboutVersionFragment : Fragment() {
                 // Close the output stream.
                 outputStream.close()
 
-                // Initialize the file name string from the file name URI last path segment.
-                var fileNameString = fileNameUri.lastPathSegment
+                // Initialize the file name string from the file URI last path segment.
+                var fileNameString = fileUri.lastPathSegment
 
                 // Query the exact file name if the API >= 26.
                 if (Build.VERSION.SDK_INT >= 26) {
                     // Get a cursor from the content resolver.
-                    val contentResolverCursor = requireActivity().contentResolver.query(fileNameUri, null, null, null)!!
+                    val contentResolverCursor = requireActivity().contentResolver.query(fileUri, null, null, null)!!
 
                     // Move to the first row.
                     contentResolverCursor.moveToFirst()
 
                     // Get the file name from the cursor.
-                    fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
+                    fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
 
                     // Close the cursor.
                     contentResolverCursor.close()
@@ -198,11 +199,11 @@ 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()) { fileNameUri: Uri? ->
+    private val saveAboutVersionImageActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument()) { 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 (fileNameUri != null) {
+        if (fileUri != null) {
             // Save the about version image.
-            SaveAboutVersionImage(requireActivity(), fileNameUri, aboutVersionLayout.findViewById(R.id.about_version_linearlayout)).execute()
+            SaveAboutVersionImage(requireActivity(), fileUri, aboutVersionLayout.findViewById(R.id.about_version_linearlayout)).execute()
         }
     }
 
@@ -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) + "  "
@@ -310,7 +313,9 @@ 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.
@@ -348,6 +353,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 +363,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(resources.getColor(R.color.about_version_blue_text))
+        blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.about_version_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 +373,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 +391,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
@@ -411,50 +419,38 @@ class AboutVersionFragment : Fragment() {
             radioTextView.visibility = View.GONE
         }
 
-        // Build.VERSION.SECURITY_PATCH is only available for SDK_INT >= 23.
-        if (Build.VERSION.SDK_INT >= 23) {
-            // Setup the label.
-            val securityPatchLabel = getString(R.string.security_patch) + "  "
+        // Setup the label.
+        val securityPatchLabel = getString(R.string.security_patch) + "  "
 
-            // Get the security patch version.
-            val securityPatch = Build.VERSION.SECURITY_PATCH
+        // Get the security patch version.
+        val securityPatch = Build.VERSION.SECURITY_PATCH
 
-            // Create a spannable string builder.
-            val securityPatchStringBuilder = SpannableStringBuilder(securityPatchLabel + securityPatch)
+        // Create a spannable string builder.
+        val securityPatchStringBuilder = SpannableStringBuilder(securityPatchLabel + securityPatch)
 
-            // Set the span to display the security patch version in blue.
-            securityPatchStringBuilder.setSpan(blueColorSpan, securityPatchLabel.length, securityPatchStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
+        // Set the span to display the security patch version in blue.
+        securityPatchStringBuilder.setSpan(blueColorSpan, securityPatchLabel.length, securityPatchStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
 
-            // Display the string in the text view.
-            securityPatchTextView.text = securityPatchStringBuilder
-        } else {  // The API < 23.
-            // Hide the security patch text view.
-            securityPatchTextView.visibility = View.GONE
-        }
+        // Display the string in the text view.
+        securityPatchTextView.text = securityPatchStringBuilder
 
-        // Only populate the WebView provider if the SDK >= 21.
-        if (Build.VERSION.SDK_INT >= 21) {
-            // Create the WebView provider label.
-            val webViewProviderLabel = getString(R.string.webview_provider) + "  "
+        // Create the WebView provider label.
+        val webViewProviderLabel = getString(R.string.webview_provider) + "  "
 
-            // Get the current WebView package info.
-            val webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(requireContext())!!
+        // Get the current WebView package info.
+        val webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(requireContext())!!
 
-            // Get the WebView provider name.
-            val webViewPackageName = webViewPackageInfo.packageName
+        // Get the WebView provider name.
+        val webViewPackageName = webViewPackageInfo.packageName
 
-            // Create the spannable string builder.
-            val webViewProviderStringBuilder = SpannableStringBuilder(webViewProviderLabel + webViewPackageName)
+        // Create the spannable string builder.
+        val webViewProviderStringBuilder = SpannableStringBuilder(webViewProviderLabel + webViewPackageName)
 
-            // Apply the coloration.
-            webViewProviderStringBuilder.setSpan(blueColorSpan, webViewProviderLabel.length, webViewProviderStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
+        // Apply the coloration.
+        webViewProviderStringBuilder.setSpan(blueColorSpan, webViewProviderLabel.length, webViewProviderStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
 
-            // Display the WebView provider.
-            webViewProviderTextView.text = webViewProviderStringBuilder
-        } else {  // The API < 21.
-            // Hide the WebView provider text view.
-            webViewProviderTextView.visibility = View.GONE
-        }
+        // Display the WebView provider.
+        webViewProviderTextView.text = webViewProviderStringBuilder
 
         // Only populate the Orbot text view if it is installed.
         if (orbot.isNotEmpty()) {
@@ -819,6 +815,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")