]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt
First wrong button text in View Headers in night theme. https://redmine.stoutner...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / dialogs / ViewSslCertificateDialog.kt
index b5b0dd275608cb4fb009f5a8c918dba08ebbe445..fd269459690398cd0b53dd9d2dbbb649cda45ff8 100644 (file)
@@ -1,31 +1,28 @@
 /*
- * Copyright © 2016-2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2016-2023 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.dialogs
 
-import android.annotation.SuppressLint
 import android.app.Dialog
-import android.content.res.Configuration
 import android.graphics.Bitmap
 import android.graphics.BitmapFactory
 import android.graphics.drawable.BitmapDrawable
-import android.graphics.drawable.Drawable
 import android.net.Uri
 import android.os.Bundle
 import android.text.SpannableStringBuilder
@@ -48,50 +45,40 @@ import java.text.DateFormat
 import java.util.Calendar
 import java.util.Date
 
-// Define the class constants.
-private const val WEBVIEW_FRAGMENT_ID = "webview_fragment_id"
-private const val HAS_SSL_CERTIFICATE = "has_ssl_certificate"
-private const val FAVORITE_ICON = "favorite_icon"
-private const val DOMAIN = "domain"
-private const val IP_ADDRESSES = "ip_addresses"
-private const val ISSUED_TO_CNAME = "issued_to_cname"
-private const val ISSUED_TO_ONAME = "issued_to_oname"
-private const val ISSUED_TO_UNAME = "issued_to_uname"
-private const val ISSUED_BY_CNAME = "issued_by_cname"
-private const val ISSUED_BY_ONAME = "issued_by_oname"
-private const val ISSUED_BY_UNAME = "issued_by_uname"
-private const val START_DATE = "start_date"
-private const val END_DATE = "end_date"
+// Define the private class constants.
+private const val DOMAIN = "A"
+private const val END_DATE = "B"
+private const val FAVORITE_ICON_BYTE_ARRAY = "C"
+private const val HAS_SSL_CERTIFICATE = "D"
+private const val IP_ADDRESSES = "E"
+private const val ISSUED_BY_CNAME = "F"
+private const val ISSUED_BY_ONAME = "G"
+private const val ISSUED_BY_UNAME = "H"
+private const val ISSUED_TO_CNAME = "I"
+private const val ISSUED_TO_ONAME = "J"
+private const val ISSUED_TO_UNAME = "K"
+private const val START_DATE = "L"
+private const val WEBVIEW_FRAGMENT_ID = "M"
+private const val URL = "N"
 
 class ViewSslCertificateDialog : DialogFragment() {
-    // Define the class variables.
-    private var hasSslCertificate: Boolean = false
-
-    // Declare the class variables.
-    private lateinit var favoriteIconDrawable: Drawable
-    private lateinit var domainString: String
-    private lateinit var ipAddresses: String
-    private lateinit var issuedToCName: String
-    private lateinit var issuedToOName: String
-    private lateinit var issuedToUName: String
-    private lateinit var issuedByCName: String
-    private lateinit var issuedByOName: String
-    private lateinit var issuedByUName: String
-    private lateinit var startDate: Date
-    private lateinit var endDate: Date
-
-    // Declare the class views.
-    private lateinit var nestedScrollWebView: NestedScrollWebView
-
     companion object {
-        // `@JvmStatic` will no longer be required once all the code has transitioned to Kotlin.
-        @JvmStatic
-        fun displayDialog(webViewFragmentId: Long): ViewSslCertificateDialog {
+        fun displayDialog(webViewFragmentId: Long, favoriteIconBitmap: Bitmap): ViewSslCertificateDialog {
             // Create an arguments bundle.
             val argumentsBundle = Bundle()
 
-            // Store the WebView fragment ID in the bundle.
+            // Create a favorite icon byte array output stream.
+            val favoriteIconByteArrayOutputStream = ByteArrayOutputStream()
+
+            // Convert the bitmap to a PNG and place it in the byte array output stream.  `0` is for lossless compression (the only option for a PNG).
+            favoriteIconBitmap.compress(Bitmap.CompressFormat.PNG, 0, favoriteIconByteArrayOutputStream)
+
+            // Convert the favorite icon byte array output stream to a byte array.
+            val favoriteIconByteArray = favoriteIconByteArrayOutputStream.toByteArray()
+
+            // Store the arguments in the bundle.
             argumentsBundle.putLong(WEBVIEW_FRAGMENT_ID, webViewFragmentId)
+            argumentsBundle.putByteArray(FAVORITE_ICON_BYTE_ARRAY, favoriteIconByteArray)
 
             // Create a new instance of the view SSL certificate dialog.
             val viewSslCertificateDialog = ViewSslCertificateDialog()
@@ -104,8 +91,23 @@ class ViewSslCertificateDialog : DialogFragment() {
         }
     }
 
-    // `@SuppressLint("InflateParams")` removes the warning about using `null` as the parent view group when inflating the alert dialog.
-    @SuppressLint("InflateParams")
+    // Define the class variables.
+    private var hasSslCertificate: Boolean = false
+
+    // Declare the class variables.
+    private lateinit var domainString: String
+    private lateinit var endDate: Date
+    private lateinit var ipAddresses: String
+    private lateinit var issuedByCName: String
+    private lateinit var issuedByOName: String
+    private lateinit var issuedByUName: String
+    private lateinit var issuedToCName: String
+    private lateinit var issuedToOName: String
+    private lateinit var issuedToUName: String
+    private lateinit var nestedScrollWebView: NestedScrollWebView
+    private lateinit var startDate: Date
+    private lateinit var urlString: String
+
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
         // Use a builder to create the alert dialog.
         val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog)
@@ -113,10 +115,10 @@ class ViewSslCertificateDialog : DialogFragment() {
         // Populate the class variables.
         if (savedInstanceState == null) {  // The dialog is starting for the first time.
             // Get the current position of this WebView fragment.
-            val webViewPosition = MainWebViewActivity.webViewPagerAdapter.getPositionForId(requireArguments().getLong(WEBVIEW_FRAGMENT_ID))
+            val webViewPosition = MainWebViewActivity.webViewStateAdapter!!.getPositionForId(requireArguments().getLong(WEBVIEW_FRAGMENT_ID))
 
             // Get the WebView tab fragment.
-            val webViewTabFragment = MainWebViewActivity.webViewPagerAdapter.getPageFragment(webViewPosition)
+            val webViewTabFragment = MainWebViewActivity.webViewStateAdapter!!.getPageFragment(webViewPosition)
 
             // Get the fragment view.
             val fragmentView = webViewTabFragment.requireView()
@@ -130,13 +132,13 @@ class ViewSslCertificateDialog : DialogFragment() {
             // Store the status of the SSL certificate.
             hasSslCertificate = sslCertificate != null
 
-            // Create a drawable version of the favorite icon.
-            favoriteIconDrawable = BitmapDrawable(resources, nestedScrollWebView.favoriteOrDefaultIcon)
+            // Store the URL string.
+            urlString = nestedScrollWebView.currentUrl
 
             // Populate the certificate class variables if the webpage has an SSL certificate.
             if (hasSslCertificate) {
                 // Convert the URL to a URI.
-                val uri = Uri.parse(nestedScrollWebView.url)
+                val uri = Uri.parse(nestedScrollWebView.currentUrl)
 
                 // Extract the domain name from the URI.
                 domainString = uri.host!!
@@ -157,13 +159,7 @@ class ViewSslCertificateDialog : DialogFragment() {
         } else {  // The dialog has been restarted.
             // Get the data from the saved instance state.
             hasSslCertificate = savedInstanceState.getBoolean(HAS_SSL_CERTIFICATE)
-            val favoriteIconByteArray = savedInstanceState.getByteArray(FAVORITE_ICON)!!
-
-            // Convert the favorite icon byte array to a bitmap.
-            val favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.size)
-
-            // Create a drawable version of the favorite icon.
-            favoriteIconDrawable = BitmapDrawable(resources, favoriteIconBitmap)
+            urlString = savedInstanceState.getString(URL)!!
 
             // Populate the certificate class variables if the webpage has an SSL certificate.
             if (hasSslCertificate) {
@@ -181,6 +177,15 @@ class ViewSslCertificateDialog : DialogFragment() {
             }
         }
 
+        // Get the favorite icon byte array from the arguments.
+        val favoriteIconByteArray = requireArguments().getByteArray(FAVORITE_ICON_BYTE_ARRAY)!!
+
+        // Convert the favorite icon byte array to a bitmap.
+        val favoriteIconBitmap = BitmapFactory.decodeByteArray(favoriteIconByteArray, 0, favoriteIconByteArray.size)
+
+        // Create a drawable version of the favorite icon.
+        val favoriteIconDrawable = BitmapDrawable(resources, favoriteIconBitmap)
+
         // Set the icon.
         dialogBuilder.setIcon(favoriteIconDrawable)
 
@@ -188,7 +193,7 @@ class ViewSslCertificateDialog : DialogFragment() {
         dialogBuilder.setNegativeButton(R.string.close, null)
 
         // Get a handle for the shared preferences.
-        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
+        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
 
         // Get the screenshot preference.
         val allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false)
@@ -198,8 +203,8 @@ class ViewSslCertificateDialog : DialogFragment() {
             // Set the title.
             dialogBuilder.setTitle(R.string.ssl_certificate)
 
-            // Set the layout.  The parent view is `null` because it will be assigned by the alert dialog.
-            dialogBuilder.setView(layoutInflater.inflate(R.layout.view_ssl_certificate_dialog, null))
+            // Set the layout.
+            dialogBuilder.setView(R.layout.view_ssl_certificate_dialog)
 
             // Create an alert dialog from the builder.
             val alertDialog = dialogBuilder.create()
@@ -226,13 +231,13 @@ class ViewSslCertificateDialog : DialogFragment() {
             val endDateTextView = alertDialog.findViewById<TextView>(R.id.end_date)!!
 
             // Setup the labels.
-            val domainLabel = getString(R.string.domain_label) + "  "
-            val ipAddressesLabel = getString(R.string.ip_addresses) + "  "
-            val cNameLabel = getString(R.string.common_name) + "  "
-            val oNameLabel = getString(R.string.organization) + "  "
-            val uNameLabel = getString(R.string.organizational_unit) + "  "
-            val startDateLabel = getString(R.string.start_date) + "  "
-            val endDateLabel = getString(R.string.end_date) + "  "
+            val domainLabel = getString(R.string.domain_label)
+            val ipAddressesLabel = getString(R.string.ip_addresses)
+            val cNameLabel = getString(R.string.common_name)
+            val oNameLabel = getString(R.string.organization)
+            val uNameLabel = getString(R.string.organizational_unit)
+            val startDateLabel = getString(R.string.start_date)
+            val endDateLabel = getString(R.string.end_date)
 
             // Create spannable string builders for each text view that needs multiple colors of text.
             val domainStringBuilder = SpannableStringBuilder(domainLabel + domainString)
@@ -247,24 +252,8 @@ class ViewSslCertificateDialog : DialogFragment() {
             val endDateStringBuilder = SpannableStringBuilder(endDateLabel + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG).format(endDate))
 
             // Define the color spans.
-            val blueColorSpan: ForegroundColorSpan
-            val redColorSpan: ForegroundColorSpan
-
-            // Get the current theme status.
-            val currentThemeStatus = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
-
-            // Set the color spans according to the theme.  The deprecated `getColor()` must be used until the minimum API >= 23.
-            if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) {
-                @Suppress("DEPRECATION")
-                blueColorSpan = ForegroundColorSpan(resources.getColor(R.color.blue_700))
-                @Suppress("DEPRECATION")
-                redColorSpan = ForegroundColorSpan(resources.getColor(R.color.red_a700))
-            } else {
-                @Suppress("DEPRECATION")
-                blueColorSpan = ForegroundColorSpan(resources.getColor(R.color.violet_700))
-                @Suppress("DEPRECATION")
-                redColorSpan = ForegroundColorSpan(resources.getColor(R.color.red_900))
-            }
+            val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text))
+            val redColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.red_text))
 
             // Format the domain string and issued to CName colors.
             if (domainString == issuedToCName) {  // The domain and issued to CName match.
@@ -348,11 +337,20 @@ class ViewSslCertificateDialog : DialogFragment() {
             // Return the alert dialog.
             return alertDialog
         } else {  // The website is not encrypted.
-            // Set the title.
-            dialogBuilder.setTitle(R.string.unencrypted_website)
-
-            // Set the Layout.  The parent view is `null` because it will be assigned by the alert dialog.
-            dialogBuilder.setView(layoutInflater.inflate(R.layout.unencrypted_website_dialog, null))
+            // Populate the dialog according to the URL type.
+            if (urlString.startsWith("content://")) {  // A content URL is loaded.
+                // Set the title.
+                dialogBuilder.setTitle(R.string.content_url)
+
+                // Set the message.
+                dialogBuilder.setMessage(R.string.content_url_message)
+            } else {  // The website is unencrypted.
+                // Set the title.
+                dialogBuilder.setTitle(R.string.unencrypted_website)
+
+                // Set the layout.
+                dialogBuilder.setView(R.layout.unencrypted_website_dialog)
+            }
 
             // Create an alert dialog from the builder.
             val alertDialog = dialogBuilder.create()
@@ -372,24 +370,9 @@ class ViewSslCertificateDialog : DialogFragment() {
         // Run the default commands.
         super.onSaveInstanceState(savedInstanceState)
 
-        // Get the favorite icon bitmap drawable.
-        val favoriteIconBitmapDrawable = favoriteIconDrawable as BitmapDrawable
-
-        // Get the favorite icon bitmap.
-        val favoriteIconBitmap = favoriteIconBitmapDrawable.bitmap
-
-        // Create a favorite icon byte array output stream.
-        val favoriteIconByteArrayOutputStream = ByteArrayOutputStream()
-
-        // Convert the bitmap to a PNG and place it in the byte array output stream.  `0` is for lossless compression (the only option for a PNG).
-        favoriteIconBitmap.compress(Bitmap.CompressFormat.PNG, 0, favoriteIconByteArrayOutputStream)
-
-        // Convert the favorite icon byte array output stream to a byte array.
-        val favoriteIconByteArray = favoriteIconByteArrayOutputStream.toByteArray()
-
         // Save the common class variables.
         savedInstanceState.putBoolean(HAS_SSL_CERTIFICATE, hasSslCertificate)
-        savedInstanceState.putByteArray(FAVORITE_ICON, favoriteIconByteArray)
+        savedInstanceState.putString(URL, urlString)
 
         // Save the SSL certificate strings if they exist.
         if (hasSslCertificate) {
@@ -405,4 +388,4 @@ class ViewSslCertificateDialog : DialogFragment() {
             savedInstanceState.putLong(END_DATE, endDate.time)
         }
     }
-}
\ No newline at end of file
+}