/*
- * Copyright © 2017-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2017-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import android.app.Dialog
import android.content.DialogInterface
-import android.content.res.Configuration
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
private const val WEBVIEW_FRAGMENT_ID = "webview_fragment_id"
class HttpAuthenticationDialog : DialogFragment() {
- // Define the class variables.
- private var dismissDialog: Boolean = false
-
- // Declare the class views.
- private lateinit var usernameEditText: EditText
- private lateinit var passwordEditText: EditText
-
companion object {
- // `@JvmStatic` will no longer be required once all the code has transitioned to Kotlin.
- @JvmStatic
fun displayDialog(host: String, realm: String, webViewFragmentId: Long): HttpAuthenticationDialog {
// Create an arguments bundle.
val argumentsBundle = Bundle()
}
}
+ // Define the class variables.
+ private var httpAuthHandler: HttpAuthHandler? = null
+
+ // Declare the class views.
+ private lateinit var usernameEditText: EditText
+ private lateinit var passwordEditText: EditText
+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
// Get a handle for the arguments.
val arguments = requireArguments()
// Try to populate the alert dialog.
try { // Getting the WebView tab fragment will fail if Privacy Browser has been restarted.
// Get the current position of this WebView fragment.
- val webViewPosition = MainWebViewActivity.webViewPagerAdapter.getPositionForId(webViewFragmentId)
+ val webViewPosition = MainWebViewActivity.webViewStateAdapter!!.getPositionForId(webViewFragmentId)
// 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()
val nestedScrollWebView = fragmentView.findViewById<NestedScrollWebView>(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)
- // Set the icon according to the theme.
- dialogBuilder.setIconAttribute(R.attr.lockBlueIcon)
+ // Set the icon.
+ dialogBuilder.setIcon(R.drawable.lock)
// Set the title.
dialogBuilder.setTitle(R.string.http_authentication)
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()
val dialogWindow = alertDialog.window!!
// 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)
realmTextView.text = httpAuthRealm
// Initialize the host label and the spannable string builder.
- val hostLabel = getString(R.string.host) + " "
+ val hostLabel = getString(R.string.host)
val hostStringBuilder = SpannableStringBuilder(hostLabel + httpAuthHost)
- // Get the current theme status.
- val currentThemeStatus = 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 API >= 23.
- val blueColorSpan = if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) {
- @Suppress("DEPRECATION")
- ForegroundColorSpan(resources.getColor(R.color.blue_700))
- } else {
- @Suppress("DEPRECATION")
- ForegroundColorSpan(resources.getColor(R.color.violet_700))
- }
+ // Set the blue color span.
+ val blueColorSpan = ForegroundColorSpan(requireContext().getColor(R.color.blue_text))
// Setup the span to display the host name in blue. `SPAN_INCLUSIVE_INCLUSIVE` allows the span to grow in either direction.
hostStringBuilder.setSpan(blueColorSpan, hostLabel.length, hostStringBuilder.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
// 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) {
nestedScrollWebView.resetHttpAuthHandler()
}
}
-}
\ No newline at end of file
+}