X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Ffragments%2FAboutVersionFragment.kt;h=c4c522741f892e56f80ee0930bc4a7a8b9856d14;hp=d2e9790b426e8fc928f4c7e420bde8d4be4c5019;hb=b1612e9c92c3aa6cc39e89c2a7859dfeebf71bf9;hpb=484f0b0f0143c53a4722cee3a31e714df0c8c49a diff --git a/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt b/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt index d2e9790b..c4c52274 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt @@ -1,20 +1,20 @@ /* - * Copyright © 2016-2021 Soren Stoutner . + * Copyright © 2016-2022 Soren Stoutner . * - * This file is part of Privacy Browser . + * This file is part of 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 . + * along with Privacy Browser Android. If not, see . */ 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,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(resources.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 @@ -411,50 +428,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()) { @@ -513,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] @@ -819,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")