X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fdialogs%2FViewSslCertificateDialog.kt;h=0a79f80653c254a86641121f84412762fa7f6fb2;hp=b5b0dd275608cb4fb009f5a8c918dba08ebbe445;hb=1b27ac6f2b7c046945fc97e2aff9adbde8a152ce;hpb=cd609c9888924549c03cd6509ed889cdb052d5bb diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt b/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt index b5b0dd27..0a79f806 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/ViewSslCertificateDialog.kt @@ -1,31 +1,28 @@ /* - * 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.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 @@ -50,8 +47,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" @@ -68,7 +65,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 @@ -86,12 +82,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() @@ -104,8 +110,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) @@ -130,9 +134,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. @@ -157,13 +158,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) { @@ -181,6 +175,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 +191,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 +201,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() @@ -247,24 +250,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.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. @@ -351,8 +338,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() @@ -372,24 +359,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) {