Release 3.9.
[PrivacyBrowser.git] / app / src / main / java / com / stoutner / privacybrowser / dialogs / ViewSslCertificateDialog.kt
index 3c971dc6bc712f6ca9b05a6ad1eea8acd7eab9e5..48c2e52c2fa0529a2df8ed6e7122a6f6360853ee 100644 (file)
 
 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
@@ -41,6 +39,7 @@ import androidx.preference.PreferenceManager
 import com.stoutner.privacybrowser.R
 import com.stoutner.privacybrowser.activities.MainWebViewActivity
 import com.stoutner.privacybrowser.views.NestedScrollWebView
+
 import java.io.ByteArrayOutputStream
 
 import java.text.DateFormat
@@ -49,8 +48,8 @@ import java.util.Date
 
 // Define the class constants.
 private const val WEBVIEW_FRAGMENT_ID = "webview_fragment_id"
+private const val FAVORITE_ICON_BYTE_ARRAY = "favorite_icon_byte_array"
 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"
@@ -67,7 +66,6 @@ class ViewSslCertificateDialog : DialogFragment() {
     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
@@ -85,12 +83,22 @@ class ViewSslCertificateDialog : DialogFragment() {
     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()
@@ -103,8 +111,6 @@ class ViewSslCertificateDialog : DialogFragment() {
         }
     }
 
-    // `@SuppressLint("InflateParams")` removes the warning about using `null` as the parent view group when inflating the alert dialog.
-    @SuppressLint("InflateParams")
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
         // Use a builder to create the alert dialog.
         val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog)
@@ -129,9 +135,6 @@ 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)
-
             // Populate the certificate class variables if the webpage has an SSL certificate.
             if (hasSslCertificate) {
                 // Convert the URL to a URI.
@@ -156,13 +159,6 @@ 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)
 
             // Populate the certificate class variables if the webpage has an SSL certificate.
             if (hasSslCertificate) {
@@ -180,6 +176,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)
 
@@ -197,8 +202,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()
@@ -350,8 +355,8 @@ class ViewSslCertificateDialog : DialogFragment() {
             // 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))
+            // Set the Layout.
+            dialogBuilder.setView(R.layout.unencrypted_website_dialog)
 
             // Create an alert dialog from the builder.
             val alertDialog = dialogBuilder.create()
@@ -371,24 +376,8 @@ 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)
 
         // Save the SSL certificate strings if they exist.
         if (hasSslCertificate) {