/*
- * 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
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
}
// 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))
// 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()
}
// 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()
}
}
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)
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) + " "
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 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])
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)
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)
bootloaderTextView.text = bootloaderStringBuilder
androidTextView.text = androidStringBuilder
buildTextView.text = buildStringBuilder
+ kernelTextView.text = kernelStringBuilder
webViewVersionTextView.text = webViewVersionStringBuilder
easyListTextView.text = easyListStringBuilder
easyPrivacyTextView.text = easyPrivacyStringBuilder
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()) {
}
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")