- // Load the temporary MHT file.
- currentWebView!!.loadUrl(temporaryMhtFile.toString())
- } catch (exception: Exception) {
- // Display a snackbar.
- Snackbar.make(currentWebView!!, getString(R.string.error, exception), Snackbar.LENGTH_INDEFINITE).show()
- }
- } else { // Let the WebView handle opening of the file.
- // Open the file.
- currentWebView!!.loadUrl(openFilePath)
- }
- }
-
- private fun downloadUrlWithExternalApp(url: String) {
- // Create a download intent. Not specifying the action type will display the maximum number of options.
- val downloadIntent = Intent()
-
- // Set the URI and the mime type.
- downloadIntent.setDataAndType(Uri.parse(url), "text/html")
-
- // Flag the intent to open in a new task.
- downloadIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-
- // Show the chooser.
- startActivity(Intent.createChooser(downloadIntent, getString(R.string.download_with_external_app)))
- }
-
- override fun onSaveUrl(originalUrlString: String, fileNameString: String, dialogFragment: DialogFragment) {
- // Store the URL. This will be used in the save URL activity result launcher.
- saveUrlString = if (originalUrlString.startsWith("data:")) {
- // Save the original URL.
- originalUrlString
- } else {
- // Get the dialog.
- val dialog = dialogFragment.dialog!!
-
- // Get a handle for the dialog URL edit text.
- val dialogUrlEditText = dialog.findViewById<EditText>(R.id.url_edittext)
-
- // Get the URL from the edit text, which may have been modified.
- dialogUrlEditText.text.toString()
- }
-
- // Open the file picker.
- saveUrlActivityResultLauncher.launch(fileNameString)
- }
-
- // Remove the warning that `OnTouchListener()` needs to override `performClick()`, as the only purpose of setting the `OnTouchListener()` is to make it do nothing.
- @SuppressLint("ClickableViewAccessibility")
- private fun initializeApp() {
- // Get a handle for the input method.
- val inputMethodManager = (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager)
-
- // Initialize the color spans for highlighting the URLs.
- initialGrayColorSpan = ForegroundColorSpan(getColor(R.color.gray_500))
- finalGrayColorSpan = ForegroundColorSpan(getColor(R.color.gray_500))
- redColorSpan = ForegroundColorSpan(getColor(R.color.red_text))
-
- // Remove the formatting from the URL edit text when the user is editing the text.
- urlEditText.onFocusChangeListener = View.OnFocusChangeListener { _: View?, hasFocus: Boolean ->
- if (hasFocus) { // The user is editing the URL text box.
- // Remove the syntax highlighting.
- urlEditText.text.removeSpan(redColorSpan)
- urlEditText.text.removeSpan(initialGrayColorSpan)
- urlEditText.text.removeSpan(finalGrayColorSpan)
- } else { // The user has stopped editing the URL text box.
- // Move to the beginning of the string.
- urlEditText.setSelection(0)
-
- // Reapply the syntax highlighting.
- UrlHelper.highlightSyntax(urlEditText, initialGrayColorSpan, finalGrayColorSpan, redColorSpan)
- }
- }
-
- // Set the go button on the keyboard to load the URL in url text box.
- urlEditText.setOnKeyListener { _: View?, keyCode: Int, keyEvent: KeyEvent ->
- // If the event is a key-down event on the `enter` button, load the URL.
- if ((keyEvent.action == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { // The enter key was pressed.
- // Load the URL.
- loadUrlFromTextBox()
-
- // Consume the event.
- return@setOnKeyListener true
- } else { // Some other key was pressed.
- // Do not consume the event.
- return@setOnKeyListener false
- }
- }
-
- // Create an Orbot status broadcast receiver.
- orbotStatusBroadcastReceiver = object : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- // Get the content of the status message.
- orbotStatus = intent.getStringExtra("org.torproject.android.intent.extra.STATUS")!!
-
- // If Privacy Browser is waiting on the proxy, load the website now that Orbot is connected.
- if ((orbotStatus == ProxyHelper.ORBOT_STATUS_ON) && waitingForProxy) {
- // Reset the waiting for proxy status.
- waitingForProxy = false
-
- // Get a list of the current fragments.
- val fragmentList = supportFragmentManager.fragments
-
- // Check each fragment to see if it is a waiting for proxy dialog. Sometimes more than one is displayed.
- for (i in fragmentList.indices) {
- // Get the fragment tag.
- val fragmentTag = fragmentList[i].tag
-
- // Check to see if it is the waiting for proxy dialog.
- if (fragmentTag != null && fragmentTag == getString(R.string.waiting_for_proxy_dialog)) {
- // Dismiss the waiting for proxy dialog.
- (fragmentList[i] as DialogFragment).dismiss()
- }
- }
+ // Get the settings from the cursor.
+ nestedScrollWebView.domainSettingsDatabaseId = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ID))
+ nestedScrollWebView.settings.javaScriptEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_JAVASCRIPT)) == 1
+ nestedScrollWebView.acceptCookies = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.COOKIES)) == 1
+ nestedScrollWebView.settings.domStorageEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_DOM_STORAGE)) == 1
+ // Form data can be removed once the minimum API >= 26.
+ val saveFormData = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_FORM_DATA)) == 1
+ nestedScrollWebView.easyListEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_EASYLIST)) == 1
+ nestedScrollWebView.easyPrivacyEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_EASYPRIVACY)) == 1
+ nestedScrollWebView.fanboysAnnoyanceListEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_FANBOYS_ANNOYANCE_LIST)) == 1
+ nestedScrollWebView.fanboysSocialBlockingListEnabled =
+ currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST)) == 1
+ nestedScrollWebView.ultraListEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ULTRALIST)) == 1
+ nestedScrollWebView.ultraPrivacyEnabled = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.ENABLE_ULTRAPRIVACY)) == 1
+ nestedScrollWebView.blockAllThirdPartyRequests = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.BLOCK_ALL_THIRD_PARTY_REQUESTS)) == 1
+ val userAgentName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.USER_AGENT))
+ val fontSize = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.FONT_SIZE))
+ val swipeToRefreshInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SWIPE_TO_REFRESH))
+ val webViewThemeInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.WEBVIEW_THEME))
+ val wideViewportInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.WIDE_VIEWPORT))
+ val displayWebpageImagesInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.DISPLAY_IMAGES))
+ val pinnedSslCertificate = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.PINNED_SSL_CERTIFICATE)) == 1
+ val pinnedSslIssuedToCName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_TO_COMMON_NAME))
+ val pinnedSslIssuedToOName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_TO_ORGANIZATION))
+ val pinnedSslIssuedToUName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_TO_ORGANIZATIONAL_UNIT))
+ val pinnedSslIssuedByCName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_BY_COMMON_NAME))
+ val pinnedSslIssuedByOName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_BY_ORGANIZATION))
+ val pinnedSslIssuedByUName = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_ISSUED_BY_ORGANIZATIONAL_UNIT))
+ val pinnedSslStartDate = Date(currentDomainSettingsCursor.getLong(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_START_DATE)))
+ val pinnedSslEndDate = Date(currentDomainSettingsCursor.getLong(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.SSL_END_DATE)))
+ val pinnedIpAddresses = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.PINNED_IP_ADDRESSES)) == 1
+ val pinnedHostIpAddresses = currentDomainSettingsCursor.getString(currentDomainSettingsCursor.getColumnIndexOrThrow(DomainsDatabaseHelper.IP_ADDRESSES))