X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Ffragments%2FAboutVersionFragment.kt;h=163e41d104cf4b6e9187c2586ece84196e973804;hb=e065315a36c804626a7dba38d3edad05e9fdb473;hp=03fa6f052e4f6bb3c79a0f3b0bdda9930c6711f4;hpb=cbeede13395a246b8a32adebbee3872031259f82;p=PrivacyBrowserAndroid.git 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 03fa6f05..163e41d1 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/fragments/AboutVersionFragment.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 Soren Stoutner . + * Copyright 2016-2024 Soren Stoutner . * * This file is part of Privacy Browser Android . * @@ -46,7 +46,6 @@ import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment -import androidx.webkit.WebViewCompat import com.google.android.material.snackbar.Snackbar @@ -72,7 +71,8 @@ import java.text.NumberFormat import kotlin.text.StringBuilder // Define the class constants. -private const val FILTERLISTS_VERSIONS = "filterlists_versions" +private const val FILTERLISTS_VERSIONS = "A" +private const val SCROLL_Y = "B" private const val MEBIBYTE = 1048576 class AboutVersionFragment : Fragment() { @@ -162,23 +162,17 @@ class AboutVersionFragment : Fragment() { private val saveAboutVersionTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { fileUri -> // 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) { - // Initialize the file name string from the file URI last path segment. - var fileNameString = fileUri.lastPathSegment + // Get a cursor from the content resolver. + val contentResolverCursor = requireActivity().contentResolver.query(fileUri, null, null, null)!! - // 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(fileUri, null, null, null)!! + // Move to the first row. + contentResolverCursor.moveToFirst() - // Move to the first row. - contentResolverCursor.moveToFirst() + // Get the file name from the cursor. + val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)) - // Get the file name from the cursor. - fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)) - - // Close the cursor. - contentResolverCursor.close() - } + // Close the cursor. + contentResolverCursor.close() try { // Get the about version string. @@ -281,8 +275,10 @@ class AboutVersionFragment : Fragment() { val deviceLabel = getString(R.string.device) val bootloaderLabel = getString(R.string.bootloader) val androidLabel = getString(R.string.android) + val securityPatchLabel = getString(R.string.security_patch) val buildLabel = getString(R.string.build) val kernelLabel = getString(R.string.kernel) + val webViewProviderLabel = getString(R.string.webview_provider) val webViewVersionLabel = getString(R.string.webview_version) appConsumedMemoryLabel = getString(R.string.app_consumed_memory) appAvailableMemoryLabel = getString(R.string.app_available_memory) @@ -305,11 +301,8 @@ class AboutVersionFragment : Fragment() { val serialNumberLabel = getString(R.string.serial_number) val signatureAlgorithmLabel = getString(R.string.signature_algorithm) - // 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. - val webViewLayout = layoutInflater.inflate(R.layout.bare_webview, container, false) - val tabLayoutWebView = webViewLayout.findViewById(R.id.bare_webview) - val userAgentString = tabLayoutWebView.settings.userAgentString + // Get the current WebView package info. + val webViewPackageInfo = WebView.getCurrentWebViewPackage()!! // Get the device's information and store it in strings. val brand = Build.BRAND @@ -319,11 +312,11 @@ class AboutVersionFragment : Fragment() { val bootloader = Build.BOOTLOADER val radio = Build.getRadioVersion() val android = getString(R.string.api, Build.VERSION.RELEASE, Build.VERSION.SDK_INT) + val securityPatch = Build.VERSION.SECURITY_PATCH val build = Build.DISPLAY 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/"))) + val webViewPackageName = webViewPackageInfo.packageName + val webViewVersion = webViewPackageInfo.versionName // Get the Orbot version name if Orbot is installed. val orbot: String = try { @@ -337,11 +330,11 @@ class AboutVersionFragment : Fragment() { // Get the I2P version name if I2P is installed. val i2p: String = try { // Check to see if the F-Droid flavor is installed. - requireContext().getString(R.string.fdroid_flavor, requireContext().packageManager.getPackageInfo("net.i2p.android.router", 0).versionName) + getString(R.string.fdroid_flavor, requireContext().packageManager.getPackageInfo("net.i2p.android.router", 0).versionName) } catch (exception: PackageManager.NameNotFoundException) { // The F-Droid flavor is not installed. try { // Check to see if the F-Droid flavor is installed. - requireContext().getString(R.string.google_play_flavor, requireContext().packageManager.getPackageInfo("net.i2p.android", 0).versionName) + getString(R.string.google_play_flavor, requireContext().packageManager.getPackageInfo("net.i2p.android", 0).versionName) } catch (exception: PackageManager.NameNotFoundException) { // The Google Play flavor is not installed either. // Store an empty string. "" @@ -364,9 +357,11 @@ class AboutVersionFragment : Fragment() { val deviceStringBuilder = SpannableStringBuilder(deviceLabel + device) val bootloaderStringBuilder = SpannableStringBuilder(bootloaderLabel + bootloader) val androidStringBuilder = SpannableStringBuilder(androidLabel + android) + val securityPatchStringBuilder = SpannableStringBuilder(securityPatchLabel + securityPatch) val buildStringBuilder = SpannableStringBuilder(buildLabel + build) val kernelStringBuilder = SpannableStringBuilder(kernelLabel + kernel) - val webViewVersionStringBuilder = SpannableStringBuilder(webViewVersionLabel + webView) + val webViewProviderStringBuilder = SpannableStringBuilder(webViewProviderLabel + webViewPackageName) + val webViewVersionStringBuilder = SpannableStringBuilder(webViewVersionLabel + webViewVersion) val easyListStringBuilder = SpannableStringBuilder(easyListLabel + filterListsVersions[0]) val easyPrivacyStringBuilder = SpannableStringBuilder(easyPrivacyLabel + filterListsVersions[1]) val fanboyAnnoyanceStringBuilder = SpannableStringBuilder(fanboyAnnoyanceLabel + filterListsVersions[2]) @@ -384,8 +379,10 @@ class AboutVersionFragment : Fragment() { deviceStringBuilder.setSpan(blueColorSpan, deviceLabel.length, deviceStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) bootloaderStringBuilder.setSpan(blueColorSpan, bootloaderLabel.length, bootloaderStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) androidStringBuilder.setSpan(blueColorSpan, androidLabel.length, androidStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) + securityPatchStringBuilder.setSpan(blueColorSpan, securityPatchLabel.length, securityPatchStringBuilder.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) + webViewProviderStringBuilder.setSpan(blueColorSpan, webViewProviderLabel.length, webViewProviderStringBuilder.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) @@ -402,8 +399,10 @@ class AboutVersionFragment : Fragment() { deviceTextView.text = deviceStringBuilder bootloaderTextView.text = bootloaderStringBuilder androidTextView.text = androidStringBuilder + securityPatchTextView.text = securityPatchStringBuilder buildTextView.text = buildStringBuilder kernelTextView.text = kernelStringBuilder + webViewProviderTextView.text = webViewProviderStringBuilder webViewVersionTextView.text = webViewVersionStringBuilder easyListTextView.text = easyListStringBuilder easyPrivacyTextView.text = easyPrivacyStringBuilder @@ -431,39 +430,6 @@ class AboutVersionFragment : Fragment() { radioTextView.visibility = View.GONE } - // Setup the label. - val securityPatchLabel = getString(R.string.security_patch) - - // Get the security patch version. - val securityPatch = Build.VERSION.SECURITY_PATCH - - // 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) - - // Display the string in the text view. - securityPatchTextView.text = securityPatchStringBuilder - - // 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 WebView provider name. - val webViewPackageName = webViewPackageInfo.packageName - - // Create the spannable string builder. - val webViewProviderStringBuilder = SpannableStringBuilder(webViewProviderLabel + webViewPackageName) - - // Apply the coloration. - webViewProviderStringBuilder.setSpan(blueColorSpan, webViewProviderLabel.length, webViewProviderStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) - - // Display the WebView provider. - webViewProviderTextView.text = webViewProviderStringBuilder - // Only populate the Orbot text view if it is installed. if (orbot.isNotEmpty()) { // Setup the label. @@ -601,8 +567,7 @@ class AboutVersionFragment : Fragment() { // Scroll the tab if the saved instance state is not null. if (savedInstanceState != null) { aboutVersionLayout.post { - aboutVersionLayout.scrollX = savedInstanceState.getInt("scroll_x") - aboutVersionLayout.scrollY = savedInstanceState.getInt("scroll_y") + aboutVersionLayout.scrollY = savedInstanceState.getInt(SCROLL_Y) } } @@ -692,9 +657,8 @@ class AboutVersionFragment : Fragment() { // Run the default commands. super.onSaveInstanceState(savedInstanceState) - // Save the scroll positions. - savedInstanceState.putInt("scroll_x", aboutVersionLayout.scrollX) - savedInstanceState.putInt("scroll_y", aboutVersionLayout.scrollY) + // Save the scroll position. + savedInstanceState.putInt(SCROLL_Y, aboutVersionLayout.scrollY) } override fun onPause() {