X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FMainWebViewActivity.kt;h=042af73dce4f9258440b6da318dcdbfaac7ba25d;hb=refs%2Fheads%2Fmaster;hp=b56a02f0d0adc08e0da393bcbc448303f5191768;hpb=e6befb69eb16e4c633623df508bfb9de370e204f;p=PrivacyBrowserAndroid.git diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt index b56a02f0..a1d8ecc7 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.kt @@ -3,7 +3,7 @@ * * Download cookie code contributed 2017 Hendrik Knackstedt. Copyright assigned to Soren Stoutner . * - * This file is part of Privacy Browser Android . + * This file is part of Privacy Browser Android . * * 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 @@ -278,6 +278,7 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook private lateinit var findOnPageLinearLayout: LinearLayout private lateinit var fullScreenVideoFrameLayout: FrameLayout private lateinit var initialGrayColorSpan: ForegroundColorSpan + private lateinit var inputMethodManager: InputMethodManager private lateinit var navigationBackMenuItem: MenuItem private lateinit var navigationForwardMenuItem: MenuItem private lateinit var navigationHistoryMenuItem: MenuItem @@ -392,14 +393,14 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook private var ultraPrivacy: ArrayList>>? = null private var waitingForProxy = false - // Define the save webpage image activity result launcher. It must be defined before `onCreate()` is run or the app will crash. + // Define the browse file upload activity result launcher. It must be defined before `onCreate()` is run or the app will crash. private val browseFileUploadActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult -> // Pass the file to the WebView. fileChooserCallback.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(activityResult.resultCode, activityResult.data)) } // Define the save URL activity result launcher. It must be defined before `onCreate()` is run or the app will crash. - private val saveUrlActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("*/*")) { fileUri -> + private val saveUrlActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("*/*")) { fileUri -> // Only save the URL if the file URI is not null, which happens if the user exited the file picker by pressing back. if (fileUri != null) { // Instantiate the save URL coroutine. @@ -414,7 +415,7 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook } // Define the save webpage archive activity result launcher. It must be defined before `onCreate()` is run or the app will crash. - private val saveWebpageArchiveActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("multipart/related")) { fileUri -> + private val saveWebpageArchiveActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("multipart/related")) { fileUri -> // Only save the webpage archive if the file URI is not null, which happens if the user exited the file picker by pressing back. if (fileUri != null) { // Get a cursor from the content resolver. @@ -487,7 +488,7 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook } // Define the save webpage image activity result launcher. It must be defined before `onCreate()` is run or the app will crash. - private val saveWebpageImageActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("image/png")) { fileUri -> + private val saveWebpageImageActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("image/png")) { fileUri -> // Only save the webpage image if the file URI is not null, which happens if the user exited the file picker by pressing back. if (fileUri != null) { // Instantiate the save webpage image coroutine. @@ -893,9 +894,9 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook pendingDialogsArrayList.clear() } - public override fun onSaveInstanceState(savedInstanceState: Bundle) { + public override fun onSaveInstanceState(outState: Bundle) { // Run the default commands. - super.onSaveInstanceState(savedInstanceState) + super.onSaveInstanceState(outState) // Only save the instance state if the WebView state adapter is not null, which will be the case if the app is restarting to change the initial app theme. if (webViewStateAdapter != null) { @@ -933,11 +934,11 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook val currentTabPosition = tabLayout.selectedTabPosition // Store the saved states in the bundle. - savedInstanceState.putBoolean(BOOKMARKS_DRAWER_PINNED, bookmarksDrawerPinned) - savedInstanceState.putString(PROXY_MODE, proxyMode) - savedInstanceState.putParcelableArrayList(SAVED_NESTED_SCROLL_WEBVIEW_STATE_ARRAY_LIST, savedNestedScrollWebViewStateArrayList) - savedInstanceState.putParcelableArrayList(SAVED_STATE_ARRAY_LIST, savedStateArrayList) - savedInstanceState.putInt(SAVED_TAB_POSITION, currentTabPosition) + outState.putBoolean(BOOKMARKS_DRAWER_PINNED, bookmarksDrawerPinned) + outState.putString(PROXY_MODE, proxyMode) + outState.putParcelableArrayList(SAVED_NESTED_SCROLL_WEBVIEW_STATE_ARRAY_LIST, savedNestedScrollWebViewStateArrayList) + outState.putParcelableArrayList(SAVED_STATE_ARRAY_LIST, savedStateArrayList) + outState.putInt(SAVED_TAB_POSITION, currentTabPosition) } } @@ -1853,9 +1854,6 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Set the focus on the find on page edit text. findOnPageEditText.requestFocus() - // Get a handle for the input method manager. - val inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager) - // Display the keyboard. `0` sets no input flags. inputMethodManager.showSoftInput(findOnPageEditText, 0) }, 200) @@ -3859,9 +3857,6 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Show the toolbar. toolbar.visibility = View.VISIBLE - // Get a handle for the input method manager. - val inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager) - // Hide the keyboard. inputMethodManager.hideSoftInputFromWindow(toolbar.windowToken, 0) } @@ -4155,7 +4150,7 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook @SuppressLint("ClickableViewAccessibility") private fun initializeApp() { // Get a handle for the input method. - val inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager) + inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager) // Initialize the color spans for highlighting the URLs. initialGrayColorSpan = ForegroundColorSpan(getColor(R.color.gray_500)) @@ -4344,11 +4339,15 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Search for the string on the page whenever a character changes in the find on page edit text. findOnPageEditText.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + override fun beforeTextChanged(charSequence: CharSequence, start: Int, count: Int, after: Int) { + // Do nothing. + } - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} + override fun onTextChanged(charSequence: CharSequence, start: Int, before: Int, count: Int) { + // Do nothing. + } - override fun afterTextChanged(s: Editable) { + override fun afterTextChanged(editable: Editable) { // Search for the text in the WebView if it is not null. Sometimes on resume after a period of non-use the WebView will be null. currentWebView?.findAllAsync(findOnPageEditText.text.toString()) } @@ -4603,9 +4602,6 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook } } - // Get a handle for the input method manager. - val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager - // Set the app bar scrolling. nestedScrollWebView.isNestedScrollingEnabled = scrollAppBar @@ -5006,26 +5002,17 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Store the file path callback. fileChooserCallback = filePathCallback - // Create an intent to open a chooser based on the file chooser parameters. - val fileChooserIntent = fileChooserParams.createIntent() + // Create a file chooser intent. + val fileChooserIntent = Intent(Intent.ACTION_GET_CONTENT) - // Check to see if the file chooser intent resolves to an installed package. - if (fileChooserIntent.resolveActivity(packageManager) != null) { // The file chooser intent is fine. - // Launch the file chooser intent. - browseFileUploadActivityResultLauncher.launch(fileChooserIntent) - } else { // The file chooser intent will cause a crash. - // Create a generic intent to open a chooser. - val genericFileChooserIntent = Intent(Intent.ACTION_GET_CONTENT) + // Request an openable file. + fileChooserIntent.addCategory(Intent.CATEGORY_OPENABLE) - // Request an openable file. - genericFileChooserIntent.addCategory(Intent.CATEGORY_OPENABLE) + // Set the file type to everything. The file chooser params cannot be used to create the intent because it only selects the first specified file type. See . + fileChooserIntent.type = "*/*" - // Set the file type to everything. - genericFileChooserIntent.type = "*/*" - - // Launch the generic file chooser intent. - browseFileUploadActivityResultLauncher.launch(genericFileChooserIntent) - } + // Launch the file chooser intent. + browseFileUploadActivityResultLauncher.launch(fileChooserIntent) // Handle the event. return true @@ -5455,8 +5442,14 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Instantiate an HTTP authentication dialog. val httpAuthenticationDialogFragment = HttpAuthenticationDialog.displayDialog(host, realm, nestedScrollWebView.webViewFragmentId) - // Show the HTTP authentication dialog. - httpAuthenticationDialogFragment.show(supportFragmentManager, getString(R.string.http_authentication)) + // Try to show the dialog. WebView can receive an HTTP authentication request even after the app has been paused. Attempting to display a dialog in that state leads to a crash. + try { + // Show the HTTP authentication dialog. + httpAuthenticationDialogFragment.show(supportFragmentManager, getString(R.string.http_authentication)) + } catch (exception: Exception) { // The dialog could not be shown. + // Add the dialog to the pending dialog array list. It will be displayed in `onStart()`. + pendingDialogsArrayList.add(PendingDialogDataClass(httpAuthenticationDialogFragment, getString(R.string.http_authentication))) + } } override fun onPageStarted(webView: WebView, url: String, favicon: Bitmap?) { @@ -5694,7 +5687,7 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Instantiate an SSL certificate error alert dialog. val sslCertificateErrorDialogFragment = SslCertificateErrorDialog.displayDialog(error, nestedScrollWebView.webViewFragmentId) - // Try to show the dialog. The SSL error handler continues to function even when the WebView is paused. Attempting to display a dialog in that state leads to a crash. + // Try to show the dialog. The SSL error handler continues to function even when the app has been stopped. Attempting to display a dialog in that state leads to a crash. try { // Show the SSL certificate error dialog. sslCertificateErrorDialogFragment.show(supportFragmentManager, getString(R.string.ssl_certificate_error)) @@ -6186,9 +6179,6 @@ class MainWebViewActivity : AppCompatActivity(), CreateBookmarkDialog.CreateBook // Update the privacy icons. `true` redraws the icons in the app bar. updatePrivacyIcons(true) - // Get a handle for the input method manager. - val inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager) - // Get the current URL. val urlString = currentWebView!!.url