From 4395165965c4a211f7c03583ebca6edaa5bf19fe Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Sat, 17 Jun 2023 13:33:16 -0700 Subject: [PATCH] Fix a delay when displaying an HTTP authentication dialog after restart. https://redmine.stoutner.com/issues/692 --- .../dialogs/HttpAuthenticationDialog.kt | 31 +++++++++---------- .../dialogs/SslCertificateErrorDialog.kt | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/stoutner/privacybrowser/dialogs/HttpAuthenticationDialog.kt b/app/src/main/java/com/stoutner/privacybrowser/dialogs/HttpAuthenticationDialog.kt index b2c749bd..1f2f1f2f 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/HttpAuthenticationDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/HttpAuthenticationDialog.kt @@ -68,7 +68,7 @@ class HttpAuthenticationDialog : DialogFragment() { } // Define the class variables. - private var dismissDialog: Boolean = false + private var httpAuthHandler: HttpAuthHandler? = null // Declare the class views. private lateinit var usernameEditText: EditText @@ -98,7 +98,7 @@ class HttpAuthenticationDialog : DialogFragment() { val nestedScrollWebView = fragmentView.findViewById(R.id.nestedscroll_webview) // Get a handle for the HTTP authentication handler. - val httpAuthHandler = nestedScrollWebView.httpAuthHandler + httpAuthHandler = nestedScrollWebView.httpAuthHandler // Use an alert dialog builder to create the alert dialog. val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog) @@ -116,7 +116,7 @@ class HttpAuthenticationDialog : DialogFragment() { dialogBuilder.setNegativeButton(R.string.close) { _: DialogInterface?, _: Int -> if (httpAuthHandler != null) { // Cancel the HTTP authentication request. - httpAuthHandler.cancel() + httpAuthHandler!!.cancel() // Reset the HTTP authentication handler. nestedScrollWebView.resetHttpAuthHandler() @@ -211,28 +211,25 @@ class HttpAuthenticationDialog : DialogFragment() { // Return the alert dialog. return alertDialog } catch (exception: Exception) { // Privacy Browser was restarted and the HTTP auth handler no longer exists. + // Dismiss this new instance of the dialog as soon as it is displayed. + dismiss() + // Use an alert dialog builder to create an empty alert dialog. val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.PrivacyBrowserAlertDialog) - // Create an empty alert dialog from the alert dialog builder. - val alertDialog = dialogBuilder.create() - - // Set the flag to dismiss the dialog as soon as it is resumed. - dismissDialog = true - // Return the alert dialog. - return alertDialog + return dialogBuilder.create() } } - override fun onResume() { + override fun onSaveInstanceState(outState: Bundle) { // Run the default commands. - super.onResume() + super.onSaveInstanceState(outState) - // Dismiss the alert dialog if the activity was restarted and the HTTP auth handler no longer exists. - if (dismissDialog) { - dialog!!.dismiss() - } + // Cancel the request if the SSL error handler is not null. This resets the WebView so it is not waiting on a response to the error handler if it is restarted in the background. + // Otherwise, after restart, the dialog is no longer displayed, but the error handler is still pending and there is no way to cause the dialog to redisplay for that URL in that tab. + if (httpAuthHandler != null) + httpAuthHandler!!.cancel() } private fun login(httpAuthHandler: HttpAuthHandler?, nestedScrollWebView: NestedScrollWebView) { @@ -244,4 +241,4 @@ class HttpAuthenticationDialog : DialogFragment() { nestedScrollWebView.resetHttpAuthHandler() } } -} \ No newline at end of file +} 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 63acae3f..60df833f 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/dialogs/SslCertificateErrorDialog.kt @@ -98,7 +98,7 @@ class SslCertificateErrorDialog : DialogFragment() { } } - // Declare the class variables. + // Define the class variables. private var sslErrorHandler: SslErrorHandler? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { -- 2.45.2