X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fdialogs%2FSslCertificateErrorDialog.kt;h=9a81641f8b8c24a155c930f9328b780ad741447e;hb=dc36dea65a4eb37496fb1ecbbd9f8e1906f50216;hp=e44e8026bf29e325985d5f55047f8f63eda8ccfa;hpb=aa121d6d6df14a0425ac3b5603765dbae7e8d156;p=PrivacyBrowserAndroid.git diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt b/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt index e44e8026..9a81641f 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt @@ -1,32 +1,28 @@ /* - * Copyright © 2016-2021 Soren Stoutner . + * Copyright 2016-2023 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.Activity import android.app.Dialog import android.content.DialogInterface -import android.content.res.Configuration import android.net.Uri import android.net.http.SslError -import android.os.AsyncTask import android.os.Bundle import android.text.SpannableStringBuilder import android.text.Spanned @@ -40,11 +36,9 @@ import androidx.preference.PreferenceManager import com.stoutner.privacybrowser.R import com.stoutner.privacybrowser.activities.MainWebViewActivity +import com.stoutner.privacybrowser.coroutines.GetHostIpAddressesCoroutine import com.stoutner.privacybrowser.views.NestedScrollWebView -import java.lang.ref.WeakReference -import java.net.InetAddress -import java.net.UnknownHostException import java.text.DateFormat // Define the class constants. @@ -62,8 +56,6 @@ private const val WEBVIEW_FRAGMENT_ID = "webview_fragment_id" class SslCertificateErrorDialog : DialogFragment() { companion object { - // `@JvmStatic` will no longer be required once all the code has transitioned to Kotlin. - @JvmStatic fun displayDialog(sslError: SslError, webViewFragmentId: Long): SslCertificateErrorDialog { // Get the various components of the SSL error message. val primaryErrorInt = sslError.primaryError @@ -105,8 +97,6 @@ class SslCertificateErrorDialog : 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 { // Get the variables from the bundle. val primaryErrorInt = requireArguments().getInt(PRIMARY_ERROR_INT) @@ -122,10 +112,10 @@ class SslCertificateErrorDialog : DialogFragment() { val webViewFragmentId = requireArguments().getLong(WEBVIEW_FRAGMENT_ID) // Get the current position of this WebView fragment. - val webViewPosition = MainWebViewActivity.webViewPagerAdapter.getPositionForId(webViewFragmentId) + val webViewPosition = MainWebViewActivity.webViewPagerAdapter!!.getPositionForId(webViewFragmentId) // Get the WebView tab fragment. - val webViewTabFragment = MainWebViewActivity.webViewPagerAdapter.getPageFragment(webViewPosition) + val webViewTabFragment = MainWebViewActivity.webViewPagerAdapter!!.getPageFragment(webViewPosition) // Get the fragment view. val fragmentView = webViewTabFragment.requireView() @@ -139,17 +129,14 @@ class SslCertificateErrorDialog : DialogFragment() { // Use an alert dialog builder to create the alert dialog. val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog) - // Get the current theme status. - val currentThemeStatus = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK - - // Set the icon according to the theme. - dialogBuilder.setIconAttribute(R.attr.sslCertificateBlueIcon) + // Set the icon. + dialogBuilder.setIcon(R.drawable.ssl_certificate) // Set the title. dialogBuilder.setTitle(R.string.ssl_certificate_error) - // Set the view. The parent view is null because it will be assigned by the alert dialog. - dialogBuilder.setView(layoutInflater.inflate(R.layout.ssl_certificate_error, null)) + // Set the view. + dialogBuilder.setView(R.layout.ssl_certificate_error) // Set the cancel button listener. dialogBuilder.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int -> @@ -179,7 +166,7 @@ class SslCertificateErrorDialog : DialogFragment() { val alertDialog = dialogBuilder.create() // 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) @@ -193,15 +180,13 @@ class SslCertificateErrorDialog : DialogFragment() { // Get a URI for the URL with errors. val uriWithErrors = Uri.parse(urlWithErrors) - // Get the IP addresses for the URI. - GetIpAddresses(requireActivity(), alertDialog).execute(uriWithErrors.host) - // The alert dialog must be shown before the contents can be modified. alertDialog.show() // Get handles for the views. val primaryErrorTextView = alertDialog.findViewById(R.id.primary_error)!! val urlTextView = alertDialog.findViewById(R.id.url)!! + val ipAddressesTextView = alertDialog.findViewById(R.id.ip_addresses)!! val issuedToCNameTextView = alertDialog.findViewById(R.id.issued_to_cname)!! val issuedToONameTextView = alertDialog.findViewById(R.id.issued_to_oname)!! val issuedToUNameTextView = alertDialog.findViewById(R.id.issued_to_uname)!! @@ -213,13 +198,20 @@ class SslCertificateErrorDialog : DialogFragment() { val startDateTextView = alertDialog.findViewById(R.id.start_date)!! val endDateTextView = alertDialog.findViewById(R.id.end_date)!! + // Define the color spans. + val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.alt_blue_text)) + val redColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.red_text)) + + // Get the IP Addresses for the URI. + GetHostIpAddressesCoroutine.getAddresses(uriWithErrors.host!!, getString(R.string.ip_addresses), blueColorSpan, ipAddressesTextView) + // Setup the common strings. - val urlLabel = getString(R.string.url_label) + " " - 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 urlLabel = getString(R.string.url_label) + 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 a spannable string builder for each text view that needs multiple colors of text. val urlStringBuilder = SpannableStringBuilder(urlLabel + urlWithErrors) @@ -232,23 +224,6 @@ class SslCertificateErrorDialog : DialogFragment() { val startDateStringBuilder = SpannableStringBuilder(startDateLabel + startDate) val endDateStringBuilder = SpannableStringBuilder(endDateLabel + endDate) - // Define the color spans. - val blueColorSpan: ForegroundColorSpan - val redColorSpan: ForegroundColorSpan - - // 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)) - } - // Setup the spans to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. urlStringBuilder.setSpan(blueColorSpan, urlLabel.length, urlStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) issuedToCNameStringBuilder.setSpan(blueColorSpan, cNameLabel.length, issuedToCNameStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) @@ -275,14 +250,8 @@ class SslCertificateErrorDialog : DialogFragment() { } SslError.SSL_UNTRUSTED -> { - // Change the issued by text view text to red. The deprecated `getColor()` must be used until the minimum API >= 23. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - @Suppress("DEPRECATION") - issuedByTextView.setTextColor(resources.getColor(R.color.red_a700)) - } else { - @Suppress("DEPRECATION") - issuedByTextView.setTextColor(resources.getColor(R.color.red_900)) - } + // Change the issued by text view text to red. + issuedByTextView.setTextColor(requireContext().getColor(R.color.red_text)) // Change the issued by span color to red. issuedByCNameStringBuilder.setSpan(redColorSpan, cNameLabel.length, issuedByCNameStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) @@ -294,14 +263,8 @@ class SslCertificateErrorDialog : DialogFragment() { } SslError.SSL_DATE_INVALID -> { - // Change the valid dates text view text to red. The deprecated `getColor()` must be used until the minimum API >= 23. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - @Suppress("DEPRECATION") - validDatesTextView.setTextColor(resources.getColor(R.color.red_a700)) - } else { - @Suppress("DEPRECATION") - validDatesTextView.setTextColor(resources.getColor(R.color.red_900)) - } + // Change the valid dates text view text to red. + validDatesTextView.setTextColor(requireContext().getColor(R.color.red_text)) // Change the date span colors to red. startDateStringBuilder.setSpan(redColorSpan, startDateLabel.length, startDateStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) @@ -347,90 +310,4 @@ class SslCertificateErrorDialog : DialogFragment() { // Return the alert dialog. return alertDialog } - - // This must run asynchronously because it involves a network request. `String` declares the parameters. `Void` does not declare progress units. `SpannableStringBuilder` contains the results. - private class GetIpAddresses constructor(activity: Activity, alertDialog: AlertDialog) : AsyncTask() { - // Define the weak references. - private val activityWeakReference: WeakReference = WeakReference(activity) - private val alertDialogWeakReference: WeakReference = WeakReference(alertDialog) - - override fun doInBackground(vararg domainName: String): SpannableStringBuilder { - // Get handles for the activity and the alert dialog. - val activity = activityWeakReference.get() - val alertDialog = alertDialogWeakReference.get() - - // Abort if the activity or the dialog is gone. - if (activity == null || activity.isFinishing || alertDialog == null) { - return SpannableStringBuilder() - } - - // Initialize an IP address string builder. - val ipAddresses = StringBuilder() - - // Get an array with the IP addresses for the host. - try { - // Get an array with all the IP addresses for the domain. - val inetAddressesArray = InetAddress.getAllByName(domainName[0]) - - // Add each IP address to the string builder. - for (inetAddress in inetAddressesArray) { - // Check to see if this is not the first IP address. - if (ipAddresses.isNotEmpty()) { - // Add a line break to the string builder first. - ipAddresses.append("\n") - } - - // Add the IP Address to the string builder. - ipAddresses.append(inetAddress.hostAddress) - } - } catch (exception: UnknownHostException) { - // Do nothing. - } - - // Set the label. - val ipAddressesLabel = activity.getString(R.string.ip_addresses) + " " - - // Create a spannable string builder. - val ipAddressesStringBuilder = SpannableStringBuilder(ipAddressesLabel + ipAddresses) - - // Create a blue foreground color span. - val blueColorSpan: ForegroundColorSpan - - // Get the current theme status. - val currentThemeStatus = activity.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK - - // Set the blue color span according to the theme. The deprecated `getColor()` must be used until the minimum API >= 23. - blueColorSpan = if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - @Suppress("DEPRECATION") - ForegroundColorSpan(activity.resources.getColor(R.color.blue_700)) - } else { - @Suppress("DEPRECATION") - ForegroundColorSpan(activity.resources.getColor(R.color.violet_500)) - } - - // Set the string builder to display the certificate information in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction. - ipAddressesStringBuilder.setSpan(blueColorSpan, ipAddressesLabel.length, ipAddressesStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE) - - // Return the formatted string. - return ipAddressesStringBuilder - } - - // `onPostExecute()` operates on the UI thread. - override fun onPostExecute(ipAddresses: SpannableStringBuilder) { - // Get handles for the activity and the alert dialog. - val activity = activityWeakReference.get() - val alertDialog = alertDialogWeakReference.get() - - // Abort if the activity or the alert dialog is gone. - if (activity == null || activity.isFinishing || alertDialog == null) { - return - } - - // Get a handle for the IP addresses text view. - val ipAddressesTextView = alertDialog.findViewById(R.id.ip_addresses)!! - - // Populate the IP addresses text view. - ipAddressesTextView.text = ipAddresses - } - } -} \ No newline at end of file +}