compileSdk 34
defaultConfig {
- minSdk 24
+ minSdk 26
targetSdk 34
versionCode 73
versionName "3.17"
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (Version Code 73)</h3>
- <p>12. Februar 2024 - Mindest-API 24, Ziel-API 34</p>
- <ul>
- <li>Expand the <a href="https://redmine.stoutner.com/issues/717">download provider options</a> to be Privacy Browser, Android’s download manager, and an external app.</li>
- <li>Remove <a href="https://redmine.stoutner.com/issues/1074">wasted space</a> between the navigation drawer icon and the URL bar.</li>
- <li>Add a <a href="https://redmine.stoutner.com/issues/144">scroll to bottom/top entry</a> in the navigation menu.</li>
- <li>Add an option to <a href="https://redmine.stoutner.com/issues/1073">display under camera cutouts</a> in full-screen browsing mode.</li>
- <li>Fix a crash caused by a <a href="https://redmine.stoutner.com/issues/1136">tab sometimes being created without a corresponding page</a>.</li>
- <li>Fix a rare problem caused by the <a href="https://redmine.stoutner.com/issues/1134">incorrect page being set as active</a> after the creation of a new tab.</li>
- <li>Fix the <a href="https://redmine.stoutner.com/issues/747">updating of favorite icons</a> when navigating history.</li>
- <li>Change the default for <a href="https://redmine.stoutner.com/issues/1130">scrolling the app bar to false</a> on new installs.</li>
- <li>Make several <a href="https://redmine.stoutner.com/issues/1156">small</a>
- <a href="https://redmine.stoutner.com/issues/1070">user</a>
- <a href="https://redmine.stoutner.com/issues/1140">interface</a>
- <a href="https://redmine.stoutner.com/issues/1143">improvements</a>.</li>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12. Februar 2024</a> - Mindest-API 24, Ziel-API 34</p>
+ <ul>
+ <li>Optionen für die <a href="https://redmine.stoutner.com/issues/717">Download Provider</a> erweitert, sodass nun Privacy Browser, Androids Download Manager oder eine externe App gewählt werden kann.</li>
+ <li><a href="https://redmine.stoutner.com/issues/1074">Verschwendeter Platz</a> zwischen dem Navigations-Menü-Icon und der URL-Leiste entfernt.</li>
+ <li>Neuer Eintrag für <a href="https://redmine.stoutner.com/issues/144">"Nach oben/unten scrollen"</a> im Navigations-Menü hinzugefügt.</li>
+ <li>Option für <a href="https://redmine.stoutner.com/issues/1073">Anzeige unter Kamera-Ausschnitt</a> im Vollbild-Modus hinzugefügt.</li>
+ <li>Fehler behoben, durch den gelegentlich <a href="https://redmine.stoutner.com/issues/1136">Tabs ohne entsprechende Seiten</a> geöffnet wurden.</li>
+ <li>Selten auftretender Fehler behoben, durch welchen nach der Erstellung neuer Tabs <a href="https://redmine.stoutner.com/issues/1134">falsche Seiten als aktiv gesetzt</a> wurden.</li>
+ <li>Fehler beim <a href="https://redmine.stoutner.com/issues/747">Aktualisieren von Favoriten-Icons</a> beim Navigieren im Verlauf behoben.</li>
+ <li>Vorgabe für das <a href="https://redmine.stoutner.com/issues/1130">Scrollen der App-Leiste</a> bei Neu-Installation deaktiviert.</li>
+ <li>Diverse <a href="https://redmine.stoutner.com/issues/1156">kleine</a>
+ <a href="https://redmine.stoutner.com/issues/1070">Verbesserungen</a>
+ <a href="https://redmine.stoutner.com/issues/1140">an der Benutzer-</a><a href="https://redmine.stoutner.com/issues/1143">Oberfläche</a>.</li>
<li>Aktualisierte deutsche Übersetzung von Bernhard G. Keller.</li>
</ul>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (version code 73)</h3>
- <p>12 February 2024 - minimum API 24, target API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 February 2024</a> - minimum API 24, target API 34</p>
<ul>
<li>Expand the <a href="https://redmine.stoutner.com/issues/717">download provider options</a> to be Privacy Browser, Android’s download manager, and an external app.</li>
<li>Remove <a href="https://redmine.stoutner.com/issues/1074">wasted space</a> between the navigation drawer icon and the URL bar.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (código de versión 73)</h3>
- <p>12 de febrero de 2024 - API mínimo 24, API objetivo 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 de febrero de 2024</a> - API mínimo 24, API objetivo 34</p>
<ul>
<li>Ampliar las <a href="https://redmine.stoutner.com/issues/717">opciones del proveedor de descargas</a> para que sean Navegador Privado, el gestor de descargas de Android, y una app externa.</li>
<li>Eliminar <a href="https://redmine.stoutner.com/issues/1074">el espacio desperdiciado</a> entre el icono del cajón de navegación y la barra URL.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
||om.aopa.org^
||om.burberry.com^
||om.cbsi.com^
-||om.churchofjesuschrist.org^
||om.cyberrentals.com^
||om.dowjoneson.com^
||om.escapehomes.com^
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (version du code 73)</h3>
- <p>12 Février 2024 - API minimale : 24, API optimale : 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 Février 2024</a> - API minimale : 24, API optimale : 34</p>
<ul>
<li>Étendre les <a href="https://redmine.stoutner.com/issues/717">options du fournisseur de téléchargement</a> pour inclure Privacy Browser,
le gestionnaire de téléchargement d'Android et une application externe.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (versione codice 73)</h3>
- <p>12 Febbraio 2024 - minima API 24, target API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 Febbraio 2024</a> - minima API 24, target API 34</p>
<ul>
<li>Ampliamento delle <a href="https://redmine.stoutner.com/issues/717">opzioni per il provider dei download</a> che può essere Privacy Browser, il download manager di Android o una app esterna.</li>
<li>Rimozione di <a href="https://redmine.stoutner.com/issues/1074">spazio sprecato</a> tra l'icona del cassetto di navigazione e la barra delle URL.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (código de versão 73)</h3>
- <p>12 de fevereiro de 2024 - minimum API 24, target API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 de fevereiro de 2024</a> - minimum API 24, target API 34</p>
<ul>
<li>Expand the <a href="https://redmine.stoutner.com/issues/717">download provider options</a> to be Privacy Browser, Android’s download manager, and an external app.</li>
<li>Remove <a href="https://redmine.stoutner.com/issues/1074">wasted space</a> between the navigation drawer icon and the URL bar.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (код версии 73)</h3>
- <p>12 февраля 2024 года - минимальный API 24, целевой API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 февраля 2024 года</a> - минимальный API 24, целевой API 34</p>
<ul>
<li>Добавлена возможность <a href="https://redmine.stoutner.com/issues/717">выбора следующих вариантов загрузки файлов:</a> Privacy Browser, менеджер загрузок Android и внешнее приложение.</li>
<li>Убрано <a href="https://redmine.stoutner.com/issues/1074">ненужное пространство</a> между значком навигационного панели и строкой URL.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<!--
- Copyright 2020,2022 Soren Stoutner <soren@stoutner.com>.
-
- This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
-
- It is a modified version of `subtitles`, which is part of the Android Material icon set and is released under the Apache License 2.0.
-
- 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 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 Android. If not, see <http://www.gnu.org/licenses/>. -->
-
-<svg
- xmlns="http://www.w3.org/2000/svg"
- viewBox="0 0 24 24"
- id="icon" >
-
- <path
- d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z" />
-</svg>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (version code 73)</h3>
- <p>12 Şubat 2024 - minimum API 24, target API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 Şubat 2024</a> - minimum API 24, target API 34</p>
<ul>
<li>Expand the <a href="https://redmine.stoutner.com/issues/717">download provider options</a> to be Privacy Browser, Android’s download manager, and an external app.</li>
<li>Remove <a href="https://redmine.stoutner.com/issues/1074">wasted space</a> between the navigation drawer icon and the URL bar.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
<body>
<h3><a href="https://www.stoutner.com/privacy-browser-android-3-17/">3.17</a> (version code 73)</h3>
- <p>12 February 2024 - 最低支持API 24, 最高支持API 34</p>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=7a54e6907e74196a4840a2434dd13e2b68a95db4">12 February 2024</a> - 最低支持API 24, 最高支持API 34</p>
<ul>
<li>Expand the <a href="https://redmine.stoutner.com/issues/717">download provider options</a> to be Privacy Browser, Android’s download manager, and an external app.</li>
<li>Remove <a href="https://redmine.stoutner.com/issues/1074">wasted space</a> between the navigation drawer icon and the URL bar.</li>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
<p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
- <p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
<p><svg class="icon"><use href="../shared_images/thumbs_up_down.svg#icon"/></svg> thumbs_up_down.</p>
val javaScriptSpinner = view.findViewById<Spinner>(R.id.javascript_spinner)
val cookiesSpinner = view.findViewById<Spinner>(R.id.cookies_spinner)
val domStorageSpinner = view.findViewById<Spinner>(R.id.dom_storage_spinner)
- val formDataSpinner = view.findViewById<Spinner>(R.id.form_data_spinner) // Form data can be removed once the minimum API >= 26.
val userAgentSpinner = view.findViewById<Spinner>(R.id.user_agent_spinner)
val customUserAgentEditText = view.findViewById<EditText>(R.id.custom_user_agent_edittext)
val easyListSpinner = view.findViewById<Spinner>(R.id.easylist_spinner)
val javaScriptInt = javaScriptSpinner.selectedItemPosition
val cookiesInt = cookiesSpinner.selectedItemPosition
val domStorageInt = domStorageSpinner.selectedItemPosition
- val formDataInt = formDataSpinner.selectedItemPosition // Form data can be removed once the minimum API >= 26.
val userAgentSwitchPosition = userAgentSpinner.selectedItemPosition
val easyListInt = easyListSpinner.selectedItemPosition
val easyPrivacyInt = easyPrivacySpinner.selectedItemPosition
fontSizeInt = customFontSizeEditText.text.toString().toInt()
// Save the domain settings.
- domainsDatabaseHelper.updateDomain(currentDomainDatabaseId, domainNameString, javaScriptInt, cookiesInt, domStorageInt, formDataInt, userAgentName, easyListInt, easyPrivacyInt, fanboysAnnoyanceInt,
+ domainsDatabaseHelper.updateDomain(currentDomainDatabaseId, domainNameString, javaScriptInt, cookiesInt, domStorageInt, userAgentName, easyListInt, easyPrivacyInt, fanboysAnnoyanceInt,
fanboysSocialBlockingInt, ultraListInt, ultraPrivacyInt, blockAllThirdPartyRequestsInt, fontSizeInt, swipeToRefreshInt, webViewThemeInt, wideViewportInt, displayWebpageImagesInt,
pinnedSslCertificate, pinnedIpAddress)
/*
- * Copyright 2019-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2019-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
}
}
- // Initialize the file name string from the file URI last path segment.
- var fileNameString = fileUri.lastPathSegment
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
+ // Move to the fist row.
+ contentResolverCursor.moveToFirst()
- // Move to the fist row.
- contentResolverCursor.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- }
+ // Close the cursor.
+ contentResolverCursor.close()
// Display a snackbar with the saved logcat information.
Snackbar.make(logcatTextView, getString(R.string.saved, fileNameString), Snackbar.LENGTH_SHORT).show()
import android.webkit.WebStorage
import android.webkit.WebView
import android.webkit.WebViewClient
-import android.webkit.WebViewDatabase
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CheckBox
import com.stoutner.privacybrowser.helpers.ENABLE_EASYPRIVACY
import com.stoutner.privacybrowser.helpers.ENABLE_FANBOYS_ANNOYANCE_LIST
import com.stoutner.privacybrowser.helpers.ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST
-import com.stoutner.privacybrowser.helpers.ENABLE_FORM_DATA
import com.stoutner.privacybrowser.helpers.ENABLE_JAVASCRIPT
import com.stoutner.privacybrowser.helpers.ENABLE_ULTRAPRIVACY
import com.stoutner.privacybrowser.helpers.ENABLED
private lateinit var optionsClearCookiesMenuItem: MenuItem
private lateinit var optionsClearDataMenuItem: MenuItem
private lateinit var optionsClearDomStorageMenuItem: MenuItem
- private lateinit var optionsClearFormDataMenuItem: MenuItem
private lateinit var optionsCookiesMenuItem: MenuItem
private lateinit var optionsDarkWebViewMenuItem: MenuItem
private lateinit var optionsDisplayImagesMenuItem: MenuItem
private lateinit var optionsProxyNoneMenuItem: MenuItem
private lateinit var optionsProxyTorMenuItem: MenuItem
private lateinit var optionsRefreshMenuItem: MenuItem
- private lateinit var optionsSaveFormDataMenuItem: MenuItem
private lateinit var optionsSwipeToRefreshMenuItem: MenuItem
private lateinit var optionsUltraListMenuItem: MenuItem
private lateinit var optionsUltraPrivacyMenuItem: MenuItem
private var defaultEasyPrivacy = true
private var defaultFanboysAnnoyanceList = true
private var defaultFanboysSocialBlockingList = true
- private var defaultFormData = false // Form data can be removed once the minimum API >= 26.
private var defaultProgressViewEndOffset = 0
private var defaultProgressViewStartOffset = 0
private var defaultJavaScript = false
private val saveWebpageArchiveActivityResultLauncher = registerForActivityResult<String, Uri>(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) {
- // Initialize the file name string from the file URI last path segment.
- var fileNameString = fileUri.lastPathSegment
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
+ // Move to the fist row.
+ contentResolverCursor.moveToFirst()
- // Move to the fist row.
- contentResolverCursor.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- }
+ // Close the cursor.
+ contentResolverCursor.close()
// Use a coroutine to save the file.
CoroutineScope(Dispatchers.Main).launch {
val optionsBookmarksMenuItem = menu.findItem(R.id.bookmarks)
optionsCookiesMenuItem = menu.findItem(R.id.cookies)
optionsDomStorageMenuItem = menu.findItem(R.id.dom_storage)
- optionsSaveFormDataMenuItem = menu.findItem(R.id.save_form_data) // Form data can be removed once the minimum API >= 26.
optionsClearDataMenuItem = menu.findItem(R.id.clear_data)
optionsClearCookiesMenuItem = menu.findItem(R.id.clear_cookies)
optionsClearDomStorageMenuItem = menu.findItem(R.id.clear_dom_storage)
- optionsClearFormDataMenuItem = menu.findItem(R.id.clear_form_data) // Form data can be removed once the minimum API >= 26.
optionsEasyListMenuItem = menu.findItem(R.id.easylist)
optionsEasyPrivacyMenuItem = menu.findItem(R.id.easyprivacy)
optionsFanboysAnnoyanceListMenuItem = menu.findItem(R.id.fanboys_annoyance_list)
// Set the initial status of the privacy icons. `false` does not call `invalidateOptionsMenu` as the last step.
updatePrivacyIcons(false)
- // Only display the form data menu items if the API < 26.
- optionsSaveFormDataMenuItem.isVisible = Build.VERSION.SDK_INT < 26
- optionsClearFormDataMenuItem.isVisible = Build.VERSION.SDK_INT < 26
-
- // Disable the clear form data menu item if the API >= 26 so that the status of the main Clear Data is calculated correctly.
- optionsClearFormDataMenuItem.isEnabled = Build.VERSION.SDK_INT < 26
-
// Set the status of the additional app bar icons. Setting the refresh menu item to `SHOW_AS_ACTION_ALWAYS` makes it appear even on small devices like phones.
if (displayAdditionalAppBarIcons) { // Display the additional icons.
optionsRefreshMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
// Set the title.
optionsRefreshMenuItem.setTitle(R.string.stop)
- // Set the icon if it is displayed in the app bar. Once the minimum API is >= 26, the blue and black icons can be combined with a tint list.
+ // Set the icon if it is displayed in the app bar.
if (displayAdditionalAppBarIcons)
optionsRefreshMenuItem.setIcon(R.drawable.close_blue)
}
// Set the status of the menu item checkboxes.
optionsDomStorageMenuItem.isChecked = currentWebView!!.settings.domStorageEnabled
- @Suppress("DEPRECATION")
- optionsSaveFormDataMenuItem.isChecked = currentWebView!!.settings.saveFormData // Form data can be removed once the minimum API >= 26.
optionsEasyListMenuItem.isChecked = currentWebView!!.easyListEnabled
optionsEasyPrivacyMenuItem.isChecked = currentWebView!!.easyPrivacyEnabled
optionsFanboysAnnoyanceListMenuItem.isChecked = currentWebView!!.fanboysAnnoyanceListEnabled
// Enable Clear DOM Storage if there is any.
optionsClearDomStorageMenuItem.isEnabled = localStorageDirectoryNumberOfFiles > 0 || indexedDBDirectoryNumberOfFiles > 0
- // Enable Clear Form Data is there is any. This can be removed once the minimum API >= 26.
- if (Build.VERSION.SDK_INT < 26) {
- // Get the WebView database.
- val webViewDatabase = WebViewDatabase.getInstance(this)
-
- // Enable the clear form data menu item if there is anything to clear.
- @Suppress("DEPRECATION")
- optionsClearFormDataMenuItem.isEnabled = webViewDatabase.hasFormData()
- }
-
// Enable Clear Data if any of the submenu items are enabled.
- optionsClearDataMenuItem.isEnabled = (optionsClearCookiesMenuItem.isEnabled || optionsClearDomStorageMenuItem.isEnabled || optionsClearFormDataMenuItem.isEnabled)
+ optionsClearDataMenuItem.isEnabled = (optionsClearCookiesMenuItem.isEnabled || optionsClearDomStorageMenuItem.isEnabled)
// Disable Fanboy's Social Blocking List menu item if Fanboy's Annoyance List is checked.
optionsFanboysSocialBlockingListMenuItem.isEnabled = !optionsFanboysAnnoyanceListMenuItem.isChecked
true
}
- R.id.save_form_data -> { // Form data. This can be removed once the minimum API >= 26.
- // Switch the status of saveFormDataEnabled.
- @Suppress("DEPRECATION")
- currentWebView!!.settings.saveFormData = !currentWebView!!.settings.saveFormData
-
- // Update the menu checkbox.
- @Suppress("DEPRECATION")
- menuItem.isChecked = currentWebView!!.settings.saveFormData
-
- // Display a snackbar.
- @Suppress("DEPRECATION")
- if (currentWebView!!.settings.saveFormData)
- Snackbar.make(webViewViewPager2, R.string.form_data_enabled, Snackbar.LENGTH_SHORT).show()
- else
- Snackbar.make(webViewViewPager2, R.string.form_data_disabled, Snackbar.LENGTH_SHORT).show()
-
- // Update the privacy icon.
- updatePrivacyIcons(true)
-
- // Reload the current WebView.
- currentWebView!!.reload()
-
- // Consume the event.
- true
- }
-
R.id.clear_cookies -> { // Clear cookies.
// Create a snackbar.
Snackbar.make(webViewViewPager2, R.string.cookies_deleted, Snackbar.LENGTH_LONG)
true
}
- R.id.clear_form_data -> { // Clear form data. This can be remove once the minimum API >= 26.
- // Create a snackbar.
- Snackbar.make(webViewViewPager2, R.string.form_data_deleted, Snackbar.LENGTH_LONG)
- .setAction(R.string.undo) {} // Everything will be handled by `onDismissed()` below.
- .addCallback(object : Snackbar.Callback() {
- override fun onDismissed(snackbar: Snackbar, event: Int) {
- if (event != DISMISS_EVENT_ACTION) { // The snackbar was dismissed without the undo button being pushed.
- // Get a handle for the webView database.
- val webViewDatabase = WebViewDatabase.getInstance(applicationContext)
-
- // Delete the form data.
- @Suppress("DEPRECATION")
- webViewDatabase.clearFormData()
- }
- }
- })
- .show()
-
- // Consume the event.
- true
- }
-
R.id.easylist -> { // EasyList.
// Toggle the EasyList status.
currentWebView!!.easyListEnabled = !currentWebView!!.easyListEnabled
val wideViewportInt = calculateSettingsInt(currentWebView!!.settings.useWideViewPort, sharedPreferences.getBoolean(getString(R.string.wide_viewport_key), true))
val displayImagesInt = calculateSettingsInt(currentWebView!!.settings.loadsImagesAutomatically, sharedPreferences.getBoolean(getString(R.string.display_webpage_images_key), true))
- // Initialize the form data int.
- var formDataInt = SYSTEM_DEFAULT
-
- // Set the form data int, which can be removed once the minimum API >= 26.
- @Suppress("DEPRECATION")
- if (Build.VERSION.SDK_INT < 26) {
- // Get the form data status.
- val formDataEnabled = currentWebView!!.settings.saveFormData
-
- // Calculate the form data Int.
- formDataInt = calculateSettingsInt(formDataEnabled, sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false))
- }
-
// Get the current user agent string.
val currentUserAgentString = currentWebView!!.settings.userAgentString
LIGHT_THEME
// Create the domain and store the database ID.
- val newDomainDatabaseId = domainsDatabaseHelper!!.addDomain(currentDomain, javaScriptInt, cookiesInt, domStorageInt, formDataInt, userAgentName, easyListInt, easyPrivacyInt,
+ val newDomainDatabaseId = domainsDatabaseHelper!!.addDomain(currentDomain, javaScriptInt, cookiesInt, domStorageInt, userAgentName, easyListInt, easyPrivacyInt,
fanboysAnnoyanceListInt, fanboysSocialBlockingListInt, ultraListInt, ultraPrivacyInt, blockAllThirdPartyRequestsInt, fontSizeInt,
swipeToRefreshInt, webViewThemeInt, wideViewportInt, displayImagesInt)
defaultJavaScript = sharedPreferences.getBoolean(getString(R.string.javascript_key), false)
defaultCookies = sharedPreferences.getBoolean(getString(R.string.cookies_key), false)
defaultDomStorage = sharedPreferences.getBoolean(getString(R.string.dom_storage_key), false)
- defaultFormData = sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false) // Form data can be removed once the minimum API >= 26.
defaultEasyList = sharedPreferences.getBoolean(getString(R.string.easylist_key), true)
defaultEasyPrivacy = sharedPreferences.getBoolean(getString(R.string.easyprivacy_key), true)
defaultFanboysAnnoyanceList = sharedPreferences.getBoolean(getString(R.string.fanboys_annoyance_list_key), true)
val javaScriptInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT))
val cookiesInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(COOKIES))
val domStorageInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE))
- val formDataInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA)) // Form data can be removed once the minimum API >= 26.
val easyListInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_EASYLIST))
val easyPrivacyInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY))
val fanboysAnnoyanceListInt = currentDomainSettingsCursor.getInt(currentDomainSettingsCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST))
DISABLED -> nestedScrollWebView.settings.domStorageEnabled = false
}
- // Apply the form data setting if the API < 26.
- @Suppress("DEPRECATION")
- if (Build.VERSION.SDK_INT < 26) {
- // Set the form data status.
- when (formDataInt) {
- SYSTEM_DEFAULT -> nestedScrollWebView.settings.saveFormData = defaultFormData
- ENABLED -> nestedScrollWebView.settings.saveFormData = true
- DISABLED -> nestedScrollWebView.settings.saveFormData = false
- }
- }
-
// Set the EasyList status.
when (easyListInt) {
SYSTEM_DEFAULT -> nestedScrollWebView.easyListEnabled = defaultEasyList
// Apply the default cookie setting.
cookieManager.setAcceptCookie(nestedScrollWebView.acceptCookies)
- // Apply the form data setting if the API < 26.
- if (Build.VERSION.SDK_INT < 26)
- @Suppress("DEPRECATION")
- nestedScrollWebView.settings.saveFormData = defaultFormData
-
// Apply the default font size setting.
try {
// Try to set the font size from the value in the app settings.
}
}
- // Clear form data if the API < 26.
- if (Build.VERSION.SDK_INT < 26 && (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true))) {
- // Ask the WebView database to clear the form data.
- @Suppress("DEPRECATION")
- WebViewDatabase.getInstance(this).clearFormData()
-
- // Manually delete the form data database, as the WebView database sometimes will not flush its changes to disk before system exit is run.
- try {
- // A string array must be used because the database contains a space and `Runtime.exec` will not otherwise escape the string correctly.
- val deleteWebDataProcess = runtime.exec(arrayOf("rm", "-f", "$privateDataDirectoryString/app_webview/Web Data"))
- val deleteWebDataJournalProcess = runtime.exec(arrayOf("rm", "-f", "$privateDataDirectoryString/app_webview/Web Data-journal"))
-
- // Wait until the processes have finished.
- deleteWebDataProcess.waitFor()
- deleteWebDataJournalProcess.waitFor()
- } catch (exception: Exception) {
- // Do nothing if an error is thrown.
- }
- }
-
// Clear the logcat.
if (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true)) {
try {
/*
- * Copyright 2017-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2017-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
private val saveTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { fileUri ->
// Only save the file if the URI is not null, which happens if the user exited the file picker by pressing back.
if (fileUri != null) {
- // Initialize the file name string from the file URI last path segment.
- var fileNameString = fileUri.lastPathSegment
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = contentResolver.query(fileUri, null, null, null)!!
+ // Move to the first row.
+ contentResolverCursor.moveToFirst()
- // Move to the first row.
- contentResolverCursor.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- }
+ // Close the cursor.
+ contentResolverCursor.close()
try {
// Get the about version string.
/*
- * Copyright 2020-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2020-2022, 2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import android.graphics.Bitmap
import android.graphics.Canvas
import android.net.Uri
-import android.os.Build
import android.provider.OpenableColumns
import android.widget.LinearLayout
// Instantiate a file name string.
val fileNameString: String
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) { // The API >= 26.
- // Get a cursor from the content resolver.
- val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)
- // Get the file display name if the content resolve cursor is not null.
- if (contentResolverCursor != null) { // The content resolve cursor is not null.
- // Move to the first row.
- contentResolverCursor.moveToFirst()
+ // Get the file display name if the content resolve cursor is not null.
+ if (contentResolverCursor != null) { // The content resolve cursor is not null.
+ // Move to the first row.
+ contentResolverCursor.moveToFirst()
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
+ // Get the file name from the cursor.
+ fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Close the cursor.
- contentResolverCursor.close()
- } else { // The content resolve cursor is null.
- // Use the URI last path segment as the file name string.
- fileNameString = fileUri.lastPathSegment.toString()
- }
- } else { // The API is < 26.
+ // Close the cursor.
+ contentResolverCursor.close()
+ } else { // The content resolve cursor is null.
// Use the URI last path segment as the file name string.
fileNameString = fileUri.lastPathSegment.toString()
}
savingImageSnackbar.show()
}
- // Create the about version bitmap. This can be replaced by PixelCopy once the minimum API >= 26.
- // Once the Minimum API >= 26 Bitmap.Config.RBGA_F16 can be used instead of ARGB_8888. The linear layout commands must be run on the UI thread.
- val aboutVersionBitmap = Bitmap.createBitmap(aboutVersionLinearLayout.width, aboutVersionLinearLayout.height, Bitmap.Config.ARGB_8888)
+ // Create an empty bitmap with the dimensions of the linear layout. Once the minimum API >= 33 Bitmap.Config.RGBA_1010102 can be used instead of RBGA_F16.
+ val aboutVersionBitmap = Bitmap.createBitmap(aboutVersionLinearLayout.width, aboutVersionLinearLayout.height, Bitmap.Config.RGBA_F16)
// Create a canvas.
val aboutVersionCanvas = Canvas(aboutVersionBitmap)
// Use the main thread to interact with the linear layout.
withContext(Dispatchers.Main) {
- // Draw the current about version onto the bitmap.
+ // Draw the current about version onto the bitmap. It might be possible to do this with PixelCopy, but I am not sure that would be any better.
aboutVersionLinearLayout.draw(aboutVersionCanvas)
}
val aboutVersionByteArrayOutputStream = ByteArrayOutputStream()
// Convert the bitmap to a PNG. `0` is for lossless compression (the only option for a PNG). This compression takes a long time.
- // Once the minimum API >= 30 this could be replaced with WEBP_LOSSLESS.
+ // Once the minimum API >= 30 this can be replaced with WEBP_LOSSLESS.
aboutVersionBitmap.compress(Bitmap.CompressFormat.PNG, 0, aboutVersionByteArrayOutputStream)
// Create a file creation disposition string.
import android.app.Activity
import android.content.Context
import android.net.Uri
-import android.os.Build
import android.provider.OpenableColumns
import android.util.Base64
import android.webkit.CookieManager
// Use a coroutine to save the URL.
CoroutineScope(Dispatchers.Main).launch {
- // Create a file name string.
- val fileNameString: String
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)!!
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)!!
+ // Move to the first row.
+ contentResolverCursor.moveToFirst()
- // Move to the first row.
- contentResolverCursor.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- } else {
- // Use the file URI last path segment as the file name string.
- fileNameString = fileUri.lastPathSegment!!
- }
+ // Close the cursor.
+ contentResolverCursor.close()
// Get a handle for the no swipe view pager.
val webViewViewPager2 = activity.findViewById<ViewPager2>(R.id.webview_viewpager2)
val inputStream: InputStream = BufferedInputStream(httpUrlConnection.inputStream)
// Initialize the conversion buffer byte array.
- // This is set to a 100,000 bytes so that frequent updating of the snackbar doesn't freeze the interface on download, although `inputStream.read` currently used 8,000 as an upper limit.
+ // This is set to a 50,000 bytes so that frequent updating of the snackbar doesn't freeze the interface on download, although `inputStream.read` currently uses 8,000 as an upper limit.
// <https://redmine.stoutner.com/issues/709>
- val conversionBufferByteArray = ByteArray(100_000)
+ val conversionBufferByteArray = ByteArray(50_000)
// Initialize the longs.
var downloadedBytesCounterLong: Long = 0
}
}
}
-}
\ No newline at end of file
+}
/*
- * Copyright0 2019-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright0 2019-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import android.graphics.Bitmap
import android.graphics.Canvas
import android.net.Uri
-import android.os.Build
import android.provider.OpenableColumns
import com.google.android.material.snackbar.Snackbar
fun save(activity: Activity, fileUri: Uri, nestedScrollWebView: NestedScrollWebView) {
// Use a coroutine to save the webpage image.
CoroutineScope(Dispatchers.Main).launch {
- // Create a file name string.
- val fileNameString: String
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = activity.contentResolver.query(fileUri, null, null, null)
+ // Move to the first row.
+ contentResolverCursor!!.moveToFirst()
- // Move to the first row.
- contentResolverCursor!!.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- } else {
- // Use the file URI last path segment as the file name string.
- fileNameString = fileUri.lastPathSegment!!
- }
+ // Close the cursor.
+ contentResolverCursor.close()
// Create a saving image snackbar.
val savingImageSnackbar = Snackbar.make(nestedScrollWebView, activity.getString(R.string.processing_image, fileNameString), Snackbar.LENGTH_INDEFINITE)
// Display the saving image snackbar.
savingImageSnackbar.show()
- // Create a webpage bitmap. Once the Minimum API >= 26 Bitmap.Config.RBGA_F16 can be used instead of ARGB_8888. The nested scroll WebView commands must be run on the UI thread.
+ // Create a webpage bitmap. Once the Minimum API >= 33 Bitmap.Config.RGBA_1010102 can be used instead of ARGB_8888.
+ // RGBA_F16 can't be used because it produces black output for the part of page not currently visible on the screen.
val webpageBitmap = Bitmap.createBitmap(nestedScrollWebView.getHorizontalScrollRange(), nestedScrollWebView.getVerticalScrollRange(), Bitmap.Config.ARGB_8888)
// Create a canvas.
Snackbar.make(nestedScrollWebView, activity.getString(R.string.error_saving_file, fileNameString, exception), Snackbar.LENGTH_INDEFINITE).show()
}
}
-
}
}
}
-}
\ No newline at end of file
+}
/*
- * Copyright © 2015-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2015-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import java.io.ByteArrayOutputStream
// Define the private class constants.
-private const val SHORTCUT_NAME = "shortcut_name"
-private const val URL_STRING = "url_string"
-private const val FAVORITE_ICON_BYTE_ARRAY = "favorite_icon_byte_array"
+private const val SHORTCUT_NAME = "A"
+private const val URL_STRING = "B"
+private const val FAVORITE_ICON_BYTE_ARRAY = "C"
class CreateHomeScreenShortcutDialog : DialogFragment() {
companion object {
val shortcutName = shortcutNameEditText.text.toString()
val urlString = urlEditText.text.toString()
- // Convert the favorite icon bitmap to an icon. `IconCompat` must be used until the minimum API >= 26.
+ // Convert the favorite icon bitmap to an icon.
val favoriteIcon = IconCompat.createWithBitmap(favoriteIconBitmap)
// Create a shortcut intent.
shortcutInfoBuilder.setIntent(shortcutIntent)
shortcutInfoBuilder.setShortLabel(shortcutName)
- // Add the shortcut to the home screen. `ShortcutManagerCompat` can be switched to `ShortcutManager` once the minimum API >= 26.
+ // Add the shortcut to the home screen.
ShortcutManagerCompat.requestPinShortcut(requireContext(), shortcutInfoBuilder.build(), null)
}
}
\ No newline at end of file
/*
- * Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
+import android.webkit.WebView
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
-import androidx.webkit.WebViewCompat
import com.google.android.material.snackbar.Snackbar
private val saveAboutVersionTextActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { fileUri ->
// Only save the file if the URI is not null, which happens if the user exited the file picker by pressing back.
if (fileUri != null) {
- // Initialize the file name string from the file URI last path segment.
- var fileNameString = fileUri.lastPathSegment
+ // Get a cursor from the content resolver.
+ val contentResolverCursor = requireActivity().contentResolver.query(fileUri, null, null, null)!!
- // Query the exact file name if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get a cursor from the content resolver.
- val contentResolverCursor = requireActivity().contentResolver.query(fileUri, null, null, null)!!
+ // Move to the first row.
+ contentResolverCursor.moveToFirst()
- // Move to the first row.
- contentResolverCursor.moveToFirst()
+ // Get the file name from the cursor.
+ val fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
- // Get the file name from the cursor.
- fileNameString = contentResolverCursor.getString(contentResolverCursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME))
-
- // Close the cursor.
- contentResolverCursor.close()
- }
+ // Close the cursor.
+ contentResolverCursor.close()
try {
// Get the about version string.
val serialNumberLabel = getString(R.string.serial_number)
val signatureAlgorithmLabel = getString(R.string.signature_algorithm)
- // Get the current WebView package info. This can be replaced by the direct call once the minimum API >= 26. <https://developer.android.com/reference/android/webkit/WebView#getCurrentWebViewPackage()>
- val webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(requireContext())!!
+ // Get the current WebView package info.
+ val webViewPackageInfo = WebView.getCurrentWebViewPackage()!!
// Get the device's information and store it in strings.
val brand = Build.BRAND
/*
- * Copyright 2017-2023 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2017-2024 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Configuration
-import android.os.Build
import android.os.Bundle
import android.text.Editable
import android.text.SpannableStringBuilder
import com.stoutner.privacybrowser.helpers.ENABLE_EASYPRIVACY
import com.stoutner.privacybrowser.helpers.ENABLE_FANBOYS_ANNOYANCE_LIST
import com.stoutner.privacybrowser.helpers.ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST
-import com.stoutner.privacybrowser.helpers.ENABLE_FORM_DATA
import com.stoutner.privacybrowser.helpers.ENABLE_JAVASCRIPT
import com.stoutner.privacybrowser.helpers.ENABLE_ULTRAPRIVACY
import com.stoutner.privacybrowser.helpers.FONT_SIZE
val javaScriptDefault = sharedPreferences.getBoolean(getString(R.string.javascript_key), false)
val cookiesDefault = sharedPreferences.getBoolean(getString(R.string.cookies_key), false)
val domStorageDefault = sharedPreferences.getBoolean(getString(R.string.dom_storage_key), false)
- val formDataDefault = sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false) // The form data views can be remove once the minimum API >= 26.
val userAgentDefault = sharedPreferences.getString(getString(R.string.user_agent_key), getString(R.string.user_agent_default_value))
val customUserAgentStringDefault = sharedPreferences.getString(getString(R.string.custom_user_agent_key), getString(R.string.custom_user_agent_default_value))
val easyListDefault = sharedPreferences.getBoolean(getString(R.string.easylist_key), true)
val domStorageImageView = domainSettingsView.findViewById<ImageView>(R.id.dom_storage_imageview)
val domStorageSpinner = domainSettingsView.findViewById<Spinner>(R.id.dom_storage_spinner)
val domStorageTextView = domainSettingsView.findViewById<TextView>(R.id.dom_storage_textview)
- val formDataLinearLayout = domainSettingsView.findViewById<LinearLayout>(R.id.form_data_linearlayout) // The form data views can be remove once the minimum API >= 26.
- val formDataImageView = domainSettingsView.findViewById<ImageView>(R.id.form_data_imageview) // The form data views can be remove once the minimum API >= 26.
- val formDataSpinner = domainSettingsView.findViewById<Spinner>(R.id.form_data_spinner) // The form data views can be remove once the minimum API >= 26.
- val formDataTextView = domainSettingsView.findViewById<TextView>(R.id.form_data_textview) // The form data views can be remove once the minimum API >= 26.
val userAgentLinearLayout = domainSettingsView.findViewById<LinearLayout>(R.id.user_agent_linearlayout)
val userAgentSpinner = domainSettingsView.findViewById<Spinner>(R.id.user_agent_spinner)
val userAgentTextView = domainSettingsView.findViewById<TextView>(R.id.user_agent_textview)
val currentIpAddressesRadioButton = domainSettingsView.findViewById<RadioButton>(R.id.current_ip_addresses_radiobutton)
val currentIpAddressesTextView = domainSettingsView.findViewById<TextView>(R.id.current_ip_addresses_textview)
- // Hide the form data linear layout if the API >= 26.
- if (Build.VERSION.SDK_INT >= 26)
- formDataLinearLayout.visibility = View.GONE
-
// Initialize the database handler.
val domainsDatabaseHelper = DomainsDatabaseHelper(requireContext())
val javaScriptInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT))
val cookiesInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(COOKIES))
val domStorageInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE))
- val formDataInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA)) // Form data can be remove once the minimum API >= 26.
val currentUserAgentName = domainCursor.getString(domainCursor.getColumnIndexOrThrow(USER_AGENT))
val easyListInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(ENABLE_EASYLIST))
val easyPrivacyInt = domainCursor.getInt(domainCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY))
val javaScriptArrayAdapter = ArrayAdapter.createFromResource(context, R.array.javascript_array, R.layout.spinner_item)
val cookiesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.cookies_array, R.layout.spinner_item)
val domStorageArrayAdapter = ArrayAdapter.createFromResource(context, R.array.dom_storage_array, R.layout.spinner_item)
- val formDataArrayAdapter = ArrayAdapter.createFromResource(context, R.array.form_data_array, R.layout.spinner_item) // Form data can be remove once the minimum API >= 26.
val translatedUserAgentArrayAdapter = ArrayAdapter.createFromResource(context, R.array.translated_domain_settings_user_agent_names, R.layout.spinner_item)
val easyListArrayAdapter = ArrayAdapter.createFromResource(context, R.array.easylist_array, R.layout.spinner_item)
val easyPrivacyArrayAdapter = ArrayAdapter.createFromResource(context, R.array.easyprivacy_array, R.layout.spinner_item)
javaScriptArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
cookiesArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
domStorageArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
- formDataArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items) // Form data can be remove once the minimum API >= 26.
translatedUserAgentArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
easyListArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
easyPrivacyArrayAdapter.setDropDownViewResource(R.layout.domain_settings_spinner_dropdown_items)
javaScriptSpinner.adapter = javaScriptArrayAdapter
cookiesSpinner.adapter = cookiesArrayAdapter
domStorageSpinner.adapter = domStorageArrayAdapter
- formDataSpinner.adapter = formDataArrayAdapter // Form data can be remove once the minimum API >= 26.
userAgentSpinner.adapter = translatedUserAgentArrayAdapter
easyListSpinner.adapter = easyListArrayAdapter
easyPrivacySpinner.adapter = easyPrivacyArrayAdapter
javaScriptTextView.setOnClickListener { javaScriptSpinner.performClick() }
cookiesTextView.setOnClickListener { cookiesSpinner.performClick() }
domStorageTextView.setOnClickListener { domStorageSpinner.performClick() }
- formDataTextView.setOnClickListener { formDataSpinner.performClick() } // Form data can be remove once the minimum API >= 26.
userAgentTextView.setOnClickListener { userAgentSpinner.performClick() }
easyListTextView.setOnClickListener { easyListSpinner.performClick() }
easyPrivacyTextView.setOnClickListener { easyPrivacySpinner.performClick() }
javaScriptSpinner.setSelection(javaScriptInt)
cookiesSpinner.setSelection(cookiesInt)
domStorageSpinner.setSelection(domStorageInt)
- formDataSpinner.setSelection(formDataInt)
easyListSpinner.setSelection(easyListInt)
easyPrivacySpinner.setSelection(easyPrivacyInt)
fanboysAnnoyanceListSpinner.setSelection(fanboysAnnoyanceListInt)
populateTextView(javaScriptDefault, javaScriptArrayAdapter, javaScriptTextView)
populateTextView(cookiesDefault, cookiesArrayAdapter, cookiesTextView)
populateTextView(domStorageDefault, domStorageArrayAdapter, domStorageTextView)
- populateTextView(formDataDefault, formDataArrayAdapter, formDataTextView)
populateTextView(easyListDefault, easyListArrayAdapter, easyListTextView)
populateTextView(easyPrivacyDefault, easyPrivacyArrayAdapter, easyPrivacyTextView)
populateTextView(fanboysAnnoyanceListDefault, fanboysAnnoyanceListArrayAdapter, fanboysAnnoyanceListTextView)
// Set the icon and text view settings. Non-standard items are handled individually below.
setIconAndTextViewSettings(cookiesInt, cookiesDefault, cookiesLinearLayout, cookiesImageView, cookiesTextView)
setIconAndTextViewSettings(domStorageInt, domStorageDefault, domStorageLinearLayout, domStorageImageView, domStorageTextView)
- setIconAndTextViewSettings(formDataInt, formDataDefault, formDataLinearLayout, formDataImageView, formDataTextView)
setIconAndTextViewSettings(easyListInt, easyListDefault, easyListLinearLayout, easyListImageView, easyListTextView)
setIconAndTextViewSettings(easyPrivacyInt, easyPrivacyDefault, easyPrivacyLinearLayout, easyPrivacyImageView, easyListTextView)
setIconAndTextViewSettings(fanboysAnnoyanceListInt, fanboysAnnoyanceListDefault, fanboysAnnoyanceListLinearLayout, fanboysAnnoyanceListImageView, fanboysAnnoyanceListTextView)
}
}
- // Set the form data spinner listener. It can be removed once the minimum API >= 26.
- if (Build.VERSION.SDK_INT < 26) {
- formDataSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
- override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
- // Update the icon and the text view settings.
- setIconAndTextViewSettings(position, formDataDefault, formDataLinearLayout, formDataImageView, formDataTextView)
- }
-
- override fun onNothingSelected(parent: AdapterView<*>?) {
- // Do nothing.
- }
- }
- }
-
// Set the user agent spinner listener.
userAgentSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.Preference
-import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
import com.stoutner.privacybrowser.R
private lateinit var clearCookiesPreference: Preference
private lateinit var clearDomStoragePreference: Preference
private lateinit var clearEverythingPreference: Preference
- private lateinit var clearFormDataPreference: Preference // The clear form data preference can be removed once the minimum API >= 26.
private lateinit var clearLogcatPreference: Preference
private lateinit var cookiesPreference: Preference
private lateinit var customUserAgentPreference: Preference
private lateinit var fanboyAnnoyanceListPreference: Preference
private lateinit var fanboySocialBlockingListPreference: Preference
private lateinit var fontSizePreference: Preference
- private lateinit var formDataPreference: Preference // The form data preference can be removed once the minimum API >= 26.
private lateinit var fullScreenBrowsingModePreference: Preference
private lateinit var hideAppBarPreference: Preference
private lateinit var displayUnderCutoutsPreference: Preference
javaScriptPreference = findPreference(getString(R.string.javascript_key))!!
cookiesPreference = findPreference(getString(R.string.cookies_key))!!
domStoragePreference = findPreference(getString(R.string.dom_storage_key))!!
- formDataPreference = findPreference(getString(R.string.save_form_data_key))!! // The form data preference can be removed once the minimum API >= 26.
userAgentPreference = findPreference(getString(R.string.user_agent_key))!!
customUserAgentPreference = findPreference(getString(R.string.custom_user_agent_key))!!
incognitoModePreference = findPreference(getString(R.string.incognito_mode_key))!!
clearEverythingPreference = findPreference(getString(R.string.clear_everything_key))!!
clearCookiesPreference = findPreference(getString(R.string.clear_cookies_key))!!
clearDomStoragePreference = findPreference(getString(R.string.clear_dom_storage_key))!!
- clearFormDataPreference = findPreference(getString(R.string.clear_form_data_key))!! // The clear form data preference can be removed once the minimum API >= 26.
clearLogcatPreference = findPreference(getString(R.string.clear_logcat_key))!!
clearCachePreference = findPreference(getString(R.string.clear_cache_key))!!
homepagePreference = findPreference(getString(R.string.homepage_key))!!
val fullScreenBrowsingMode = sharedPreferences.getBoolean(getString(R.string.full_screen_browsing_mode_key), false)
val clearEverything = sharedPreferences.getBoolean(getString(R.string.clear_everything_key), true)
- // Remove the form data preferences if the API is >= 26 as they no longer do anything.
- if (Build.VERSION.SDK_INT >= 26) {
- // Get handles for the categories.
- val privacyCategory = findPreference<PreferenceCategory>(getString(R.string.privacy_category_key))!!
- val clearAndExitCategory = findPreference<PreferenceCategory>(getString(R.string.clear_and_exit_category_key))!!
-
- // Remove the form data preferences.
- privacyCategory.removePreference(formDataPreference)
- clearAndExitCategory.removePreference(clearFormDataPreference)
- }
-
// Only enable Fanboy's social blocking list preference if Fanboy's annoyance list is disabled.
fanboySocialBlockingListPreference.isEnabled = !fanboyAnnoyanceListEnabled
// Set the status of the clear and exit preferences.
clearCookiesPreference.isEnabled = !clearEverything
clearDomStoragePreference.isEnabled = !clearEverything
- clearFormDataPreference.isEnabled = !clearEverything // Clear form data can be removed once the minimum API is >= 26.
clearLogcatPreference.isEnabled = !clearEverything
clearCachePreference.isEnabled = !clearEverything
domStoragePreference.setIcon(R.drawable.dom_storage_ghosted)
}
- // Set the save form data icon if API < 26. Save form data has no effect on API >= 26.
- if (Build.VERSION.SDK_INT < 26) {
- if (sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false))
- formDataPreference.setIcon(R.drawable.form_data_enabled)
- else
- formDataPreference.setIcon(R.drawable.form_data_disabled)
- }
-
// Set the custom user agent icon.
if (customUserAgentPreference.isEnabled)
customUserAgentPreference.setIcon(R.drawable.custom_user_agent_enabled)
else
clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled)
- // Set the clear form data icon if the API < 26. It has no effect on newer versions of Android.
- if (Build.VERSION.SDK_INT < 26) {
- if (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true))
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled)
- else
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled)
- }
-
// Set the clear logcat icon.
if (clearEverything || sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true))
clearLogcatPreference.setIcon(R.drawable.clear_logcat_enabled)
domStoragePreference.setIcon(R.drawable.dom_storage_disabled)
}
- getString(R.string.save_form_data_key) -> { // Saved form data can be removed once the minimum API >= 26.
- // Update the icon.
- if (sharedPreferences.getBoolean(getString(R.string.save_form_data_key), false))
- formDataPreference.setIcon(R.drawable.form_data_enabled)
- else
- formDataPreference.setIcon(R.drawable.form_data_disabled)
- }
-
getString(R.string.user_agent_key) -> {
// Get the new user agent name.
val newUserAgentName = sharedPreferences.getString(getString(R.string.user_agent_key), getString(R.string.user_agent_default_value))
// Update the status of the clear and exit preferences.
clearCookiesPreference.isEnabled = !newClearEverythingBoolean
clearDomStoragePreference.isEnabled = !newClearEverythingBoolean
- clearFormDataPreference.isEnabled = !newClearEverythingBoolean // Clear form data can be removed once the minimum API >= 26.
clearLogcatPreference.isEnabled = !newClearEverythingBoolean
clearCachePreference.isEnabled = !newClearEverythingBoolean
else
clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled)
- // Update the clear form data preference icon if the API < 26.
- if (Build.VERSION.SDK_INT < 26) {
- if (newClearEverythingBoolean || sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true))
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled)
- else
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled)
- }
-
// Update the clear logcat preference icon.
if (newClearEverythingBoolean || sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true))
clearLogcatPreference.setIcon(R.drawable.clear_logcat_enabled)
clearDomStoragePreference.setIcon(R.drawable.clear_dom_storage_disabled)
}
- getString(R.string.clear_form_data_key) -> {
- // Update the icon.
- if (sharedPreferences.getBoolean(getString(R.string.clear_form_data_key), true))
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_enabled)
- else
- clearFormDataPreference.setIcon(R.drawable.clear_form_data_disabled)
- }
-
getString(R.string.clear_logcat_key) -> {
// Update the icon.
if (sharedPreferences.getBoolean(getString(R.string.clear_logcat_key), true))
import com.stoutner.privacybrowser.R
// Define the class constants.
-private const val SCHEMA_VERSION = 16
+private const val SCHEMA_VERSION = 17
// Define the public database constants.
const val DOMAINS_DATABASE = "domains.db"
const val ENABLE_EASYPRIVACY = "enableeasyprivacy"
const val ENABLE_FANBOYS_ANNOYANCE_LIST = "enablefanboysannoyancelist"
const val ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST = "enablefanboyssocialblockinglist"
-const val ENABLE_FORM_DATA = "enableformdata" // Form data can be removed once the minimum API >= 26.
const val ENABLE_JAVASCRIPT = "enablejavascript"
const val ENABLE_ULTRAPRIVACY = "enableultraprivacy"
const val FONT_SIZE = "fontsize"
"$ENABLE_JAVASCRIPT INTEGER, " +
"$COOKIES INTEGER, " +
"$ENABLE_DOM_STORAGE INTEGER, " +
- "$ENABLE_FORM_DATA INTEGER, " +
"$USER_AGENT TEXT, " +
"$ENABLE_EASYLIST INTEGER, " +
"$ENABLE_EASYPRIVACY INTEGER, " +
val javaScriptDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.javascript_key), false)
val cookiesDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.cookies_key), false)
val domStorageDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.dom_storage_key), false)
- val formDataDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.save_form_data_key), false)
val easyListDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.easylist_key), true)
val easyPrivacyDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.easyprivacy_key), true)
val fanboysAnnoyanceListDefaultValue = sharedPreferences.getBoolean(appContext.getString(R.string.fanboys_annoyance_list_key), true)
val javaScriptColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT)
val cookiesColumnIndex = domainsCursor.getColumnIndexOrThrow(COOKIES)
val domStorageColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE)
- val formDataColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA)
val easyListColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_EASYLIST)
val easyPrivacyColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY)
val fanboysAnnoyanceListColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST)
val javaScriptDomainCurrentValue = domainsCursor.getInt(javaScriptColumnIndex)
val cookiesDomainCurrentValue = domainsCursor.getInt(cookiesColumnIndex)
val domStorageDomainCurrentValue = domainsCursor.getInt(domStorageColumnIndex)
- val formDataDomainCurrentValue = domainsCursor.getInt(formDataColumnIndex)
val easyListDomainCurrentValue = domainsCursor.getInt(easyListColumnIndex)
val easyPrivacyDomainCurrentValue = domainsCursor.getInt(easyPrivacyColumnIndex)
val fanboysAnnoyanceListCurrentValue = domainsCursor.getInt(fanboysAnnoyanceListColumnIndex)
domainContentValues.put(ENABLE_JAVASCRIPT, convertFromSwitchToSpinner(javaScriptDefaultValue, javaScriptDomainCurrentValue))
domainContentValues.put(COOKIES, convertFromSwitchToSpinner(cookiesDefaultValue, cookiesDomainCurrentValue))
domainContentValues.put(ENABLE_DOM_STORAGE, convertFromSwitchToSpinner(domStorageDefaultValue, domStorageDomainCurrentValue))
- domainContentValues.put(ENABLE_FORM_DATA, convertFromSwitchToSpinner(formDataDefaultValue, formDataDomainCurrentValue))
domainContentValues.put(ENABLE_EASYLIST, convertFromSwitchToSpinner(easyListDefaultValue, easyListDomainCurrentValue))
domainContentValues.put(ENABLE_EASYPRIVACY, convertFromSwitchToSpinner(easyPrivacyDefaultValue, easyPrivacyDomainCurrentValue))
domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, convertFromSwitchToSpinner(fanboysAnnoyanceListDefaultValue, fanboysAnnoyanceListCurrentValue))
domainsDatabase.update(DOMAINS_TABLE, domainContentValues, "$ID = $currentDatabaseId", null)
}
+ // Upgrade from schema version 16, first used in Privacy Browser 3.15, to schema version 17, first used in Privacy Browser 3.18.
+ // This upgrade removed `enableformdata`.
+ // SQLite amazingly only added a command to drop a column in version 3.35.0. <https://www.sqlite.org/changes.html>
+ // That will not be supported in Android until the minimum API >= 34. <https://developer.android.com/reference/android/database/sqlite/package-summary>
+ // Although a new table could be created and all the data copied to it, I think I will just leave the `enableformdata` column. It will be wiped out the next time an import is run.
+
// Close the cursor.
domainsCursor.close()
}
fun addDomain(domainName: String): Int {
// Add the domain with default settings.
- return addDomain(domainName, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, appContext.getString(R.string.system_default_user_agent), SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT,
+ return addDomain(domainName, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, appContext.getString(R.string.system_default_user_agent), SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT,
SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT, SYSTEM_DEFAULT)
}
- fun addDomain(domainName: String, javaScriptInt: Int, cookiesInt: Int, domStorageInt: Int, formDataInt: Int, userAgentName: String, easyListInt: Int, easyPrivacyInt: Int, fanboysAnnoyanceListInt: Int,
+ fun addDomain(domainName: String, javaScriptInt: Int, cookiesInt: Int, domStorageInt: Int, userAgentName: String, easyListInt: Int, easyPrivacyInt: Int, fanboysAnnoyanceListInt: Int,
fanboysSocialBlockingListInt: Int, ultraListInt: Int, ultraPrivacyInt: Int, blockAllThirdPartyRequestsInt: Int, fontSizeInt: Int, swipeToRefreshInt: Int, webViewThemeInt: Int,
wideViewportInt: Int, displayImagesInt: Int): Int {
// Instantiate a content values.
domainContentValues.put(ENABLE_JAVASCRIPT, javaScriptInt)
domainContentValues.put(COOKIES, cookiesInt)
domainContentValues.put(ENABLE_DOM_STORAGE, domStorageInt)
- domainContentValues.put(ENABLE_FORM_DATA, formDataInt) // Form data can be removed once the minimum API >= 26.
domainContentValues.put(USER_AGENT, userAgentName)
domainContentValues.put(ENABLE_EASYLIST, easyListInt)
domainContentValues.put(ENABLE_EASYPRIVACY, easyPrivacyInt)
return newDomainDatabaseId
}
- fun updateDomain(databaseId: Int, domainName: String, javaScript: Int, cookies: Int, domStorage: Int, formData: Int, userAgent: String, easyList: Int, easyPrivacy: Int, fanboysAnnoyance: Int,
+ fun updateDomain(databaseId: Int, domainName: String, javaScript: Int, cookies: Int, domStorage: Int, userAgent: String, easyList: Int, easyPrivacy: Int, fanboysAnnoyance: Int,
fanboysSocialBlocking: Int, ultraList: Int, ultraPrivacy: Int, blockAllThirdPartyRequests: Int, fontSize: Int, swipeToRefresh: Int, webViewTheme: Int, wideViewport: Int, displayImages: Int,
pinnedSslCertificate: Boolean, pinnedIpAddresses: Boolean) {
domainContentValues.put(ENABLE_JAVASCRIPT, javaScript)
domainContentValues.put(COOKIES, cookies)
domainContentValues.put(ENABLE_DOM_STORAGE, domStorage)
- domainContentValues.put(ENABLE_FORM_DATA, formData) // Form data can be removed once the minimum API >= 26.
domainContentValues.put(USER_AGENT, userAgent)
domainContentValues.put(ENABLE_EASYLIST, easyList)
domainContentValues.put(ENABLE_EASYPRIVACY, easyPrivacy)
import java.util.Date
// Define the public constants.
-const val IMPORT_EXPORT_SCHEMA_VERSION = 18
+const val IMPORT_EXPORT_SCHEMA_VERSION = 19
const val EXPORT_SUCCESSFUL = "A"
const val IMPORT_SUCCESSFUL = "B"
private const val CLEAR_COOKIES = "clear_cookies"
private const val CLEAR_DOM_STORAGE = "clear_dom_storage"
private const val CLEAR_EVERYTHING = "clear_everything"
-private const val CLEAR_FORM_DATA = "clear_form_data" // Clear form data can be removed once the minimum API >= 26.
private const val CLEAR_LOGCAT = "clear_logcat"
private const val CUSTOM_USER_AGENT = "custom_user_agent"
private const val DISPLAY_ADDITIONAL_APP_BAR_ICONS = "display_additional_app_bar_icons"
private const val PREFERENCES_USER_AGENT = "user_agent"
private const val PROXY = "proxy"
private const val PROXY_CUSTOM_URL = "proxy_custom_url"
-private const val SAVE_FORM_DATA = "save_form_data"
private const val SEARCH = "search"
private const val SEARCH_CUSTOM_URL = "search_custom_url"
private const val SCROLL_APP_BAR = "scroll_app_bar"
}
// Upgrade from schema version 15, first used in Privacy Browser 3.11, to schema version 16, first used in Privacy Browser 3.12.
- // This upgrade removed the `x_requested_with_header` from the domains and preferences tables.
+ // This upgrade removed `x_requested_with_header` from the domains and preferences tables.
// There is no need to delete the columns as they will simply be ignored by the import.
// Upgrade from schema version 16, first used in Privacy Browser 3.12, to schema version 17, first used in Privacy Browser 3.15.
if (importDatabaseVersion < 17) {
+ // This upgrade removed `parentfolder` from the Bookmarks table.
+ // There is no need to delete the column as they will simply be ignored by the import.
+
// Add the folder ID column.
importDatabase.execSQL("ALTER TABLE $BOOKMARKS_TABLE ADD COLUMN $FOLDER_ID INTEGER")
// Close the bookmarks cursor.
bookmarksCursor.close()
- // This upgrade removed the old `parentfolder` string column.
- // SQLite amazingly only added a command to drop a column in version 3.35.0. <https://www.sqlite.org/changes.html>
- // It will be a while before that is supported in Android. <https://developer.android.com/reference/android/database/sqlite/package-summary>
- // Although a new table could be created and all the data copied to it, I think I will just leave the old parent folder column. It will be wiped out the next time an import is run.
+ // Get the current switch default values.
+ val javaScriptDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.javascript_key), false)
+ val cookiesDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.cookies_key), false)
+ val domStorageDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.dom_storage_key), false)
+ val easyListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.easylist_key), true)
+ val easyPrivacyDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.easyprivacy_key), true)
+ val fanboysAnnoyanceListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.fanboys_annoyance_list_key), true)
+ val fanboysSocialBlockingListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.fanboys_social_blocking_list), true)
+ val ultraListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.ultralist_key), true)
+ val ultraPrivacyDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.ultraprivacy_key), true)
+ val blockAllThirdPartyRequestsDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.block_all_third_party_requests_key), false)
+
+ // Get a domains cursor.
+ val importDomainsConversionCursor = importDatabase.rawQuery("SELECT * FROM $DOMAINS_TABLE", null)
+
+ // Get the domains column indexes.
+ val javaScriptColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT)
+ val cookiesColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(COOKIES)
+ val domStorageColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE)
+ val easyListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_EASYLIST)
+ val easyPrivacyColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY)
+ val fanboysAnnoyanceListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST)
+ val fanboysSocialBlockingListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST)
+ val ultraListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ULTRALIST)
+ val ultraPrivacyColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_ULTRAPRIVACY)
+ val blockAllThirdPartyRequestsColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(BLOCK_ALL_THIRD_PARTY_REQUESTS)
+
+ // Convert the domain from the switch booleans to the spinner integers.
+ for (i in 0 until importDomainsConversionCursor.count) {
+ // Move to the current record.
+ importDomainsConversionCursor.moveToPosition(i)
+
+ // Get the domain current values.
+ val javaScriptDomainCurrentValue = importDomainsConversionCursor.getInt(javaScriptColumnIndex)
+ val cookiesDomainCurrentValue = importDomainsConversionCursor.getInt(cookiesColumnIndex)
+ val domStorageDomainCurrentValue = importDomainsConversionCursor.getInt(domStorageColumnIndex)
+ val easyListDomainCurrentValue = importDomainsConversionCursor.getInt(easyListColumnIndex)
+ val easyPrivacyDomainCurrentValue = importDomainsConversionCursor.getInt(easyPrivacyColumnIndex)
+ val fanboysAnnoyanceListCurrentValue = importDomainsConversionCursor.getInt(fanboysAnnoyanceListColumnIndex)
+ val fanboysSocialBlockingListCurrentValue = importDomainsConversionCursor.getInt(fanboysSocialBlockingListColumnIndex)
+ val ultraListCurrentValue = importDomainsConversionCursor.getInt(ultraListColumnIndex)
+ val ultraPrivacyCurrentValue = importDomainsConversionCursor.getInt(ultraPrivacyColumnIndex)
+ val blockAllThirdPartyRequestsCurrentValue = importDomainsConversionCursor.getInt(blockAllThirdPartyRequestsColumnIndex)
+
+ // Instantiate a domain content values.
+ val domainContentValues = ContentValues()
+
+ // Populate the domain content values.
+ domainContentValues.put(ENABLE_JAVASCRIPT, convertFromSwitchToSpinner(javaScriptDefaultValue, javaScriptDomainCurrentValue))
+ domainContentValues.put(COOKIES, convertFromSwitchToSpinner(cookiesDefaultValue, cookiesDomainCurrentValue))
+ domainContentValues.put(ENABLE_DOM_STORAGE, convertFromSwitchToSpinner(domStorageDefaultValue, domStorageDomainCurrentValue))
+ domainContentValues.put(ENABLE_EASYLIST, convertFromSwitchToSpinner(easyListDefaultValue, easyListDomainCurrentValue))
+ domainContentValues.put(ENABLE_EASYPRIVACY, convertFromSwitchToSpinner(easyPrivacyDefaultValue, easyPrivacyDomainCurrentValue))
+ domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, convertFromSwitchToSpinner(fanboysAnnoyanceListDefaultValue, fanboysAnnoyanceListCurrentValue))
+ domainContentValues.put(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST, convertFromSwitchToSpinner(fanboysSocialBlockingListDefaultValue, fanboysSocialBlockingListCurrentValue))
+ domainContentValues.put(ULTRALIST, convertFromSwitchToSpinner(ultraListDefaultValue, ultraListCurrentValue))
+ domainContentValues.put(ENABLE_ULTRAPRIVACY, convertFromSwitchToSpinner(ultraPrivacyDefaultValue, ultraPrivacyCurrentValue))
+ domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, convertFromSwitchToSpinner(blockAllThirdPartyRequestsDefaultValue, blockAllThirdPartyRequestsCurrentValue))
+
+ // Get the current database ID.
+ val currentDatabaseId = importDomainsConversionCursor.getInt(importDomainsConversionCursor.getColumnIndexOrThrow(ID))
+
+ // Update the row for the specified database ID.
+ importDatabase.update(DOMAINS_TABLE, domainContentValues, "$ID = $currentDatabaseId", null)
+ }
+
+ // Close the cursor.
+ importDomainsConversionCursor.close()
}
// Upgrade from schema version 17, first used in Privacy Browser 3.15, to schema version 18, first used in Privacy Browser 3.17.
val displayUnderCutouts = sharedPreferences.getBoolean(DISPLAY_UNDER_CUTOUTS, false)
// Populate the preferences table with the current display under cutouts value.
- // This can switch to using the variables directly once the API >= 30. <https://www.sqlite.org/datatype3.html#boolean_datatype>
+ // This can switch to using the variables directly once the minimum API >= 30. <https://www.sqlite.org/datatype3.html#boolean_datatype>
// <https://developer.android.com/reference/android/database/sqlite/package-summary>
if (displayUnderCutouts)
importDatabase.execSQL("UPDATE $PREFERENCES_TABLE SET $DISPLAY_UNDER_CUTOUTS = 1")
importDatabase.execSQL("UPDATE $PREFERENCES_TABLE SET $DOWNLOAD_PROVIDER = '${downloadProviderEntryValuesStringArray[0]}'")
}
+ // Upgrade from schema version 18, first used in Privacy Browser 3.17, to schema version 19, first used in Privacy Browser 3.18.
+ // This upgrade removed `enableformdata` from the Domains table and `save_form_data` and `clear_form_data` from the Preferences table.
+ // There is no need to delete the columns as they will simply be ignored by the import.
+
+
/* End of database upgrade logic. */
importBookmarksCursor.moveToNext()
}
- // Upgrade from schema version 16, first used in Privacy Browser 3.12, to schema version 17, first used in Privacy Browser 3.15.
- if (importDatabaseVersion < 16) {
- // Get the current switch default values.
- val javaScriptDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.javascript_key), false)
- val cookiesDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.cookies_key), false)
- val domStorageDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.dom_storage_key), false)
- val formDataDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.save_form_data_key), false)
- val easyListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.easylist_key), true)
- val easyPrivacyDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.easyprivacy_key), true)
- val fanboysAnnoyanceListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.fanboys_annoyance_list_key), true)
- val fanboysSocialBlockingListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.fanboys_social_blocking_list), true)
- val ultraListDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.ultralist_key), true)
- val ultraPrivacyDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.ultraprivacy_key), true)
- val blockAllThirdPartyRequestsDefaultValue = sharedPreferences.getBoolean(context.getString(R.string.block_all_third_party_requests_key), false)
-
- // Get a domains cursor.
- val importDomainsConversionCursor = importDatabase.rawQuery("SELECT * FROM $DOMAINS_TABLE", null)
-
- // Get the domains column indexes.
- val javaScriptColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT)
- val cookiesColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(COOKIES)
- val domStorageColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE)
- val formDataColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA)
- val easyListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_EASYLIST)
- val easyPrivacyColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY)
- val fanboysAnnoyanceListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST)
- val fanboysSocialBlockingListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST)
- val ultraListColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ULTRALIST)
- val ultraPrivacyColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(ENABLE_ULTRAPRIVACY)
- val blockAllThirdPartyRequestsColumnIndex = importDomainsConversionCursor.getColumnIndexOrThrow(BLOCK_ALL_THIRD_PARTY_REQUESTS)
-
- // Convert the domain from the switch booleans to the spinner integers.
- for (i in 0 until importDomainsConversionCursor.count) {
- // Move to the current record.
- importDomainsConversionCursor.moveToPosition(i)
-
- // Get the domain current values.
- val javaScriptDomainCurrentValue = importDomainsConversionCursor.getInt(javaScriptColumnIndex)
- val cookiesDomainCurrentValue = importDomainsConversionCursor.getInt(cookiesColumnIndex)
- val domStorageDomainCurrentValue = importDomainsConversionCursor.getInt(domStorageColumnIndex)
- val formDataDomainCurrentValue = importDomainsConversionCursor.getInt(formDataColumnIndex)
- val easyListDomainCurrentValue = importDomainsConversionCursor.getInt(easyListColumnIndex)
- val easyPrivacyDomainCurrentValue = importDomainsConversionCursor.getInt(easyPrivacyColumnIndex)
- val fanboysAnnoyanceListCurrentValue = importDomainsConversionCursor.getInt(fanboysAnnoyanceListColumnIndex)
- val fanboysSocialBlockingListCurrentValue = importDomainsConversionCursor.getInt(fanboysSocialBlockingListColumnIndex)
- val ultraListCurrentValue = importDomainsConversionCursor.getInt(ultraListColumnIndex)
- val ultraPrivacyCurrentValue = importDomainsConversionCursor.getInt(ultraPrivacyColumnIndex)
- val blockAllThirdPartyRequestsCurrentValue = importDomainsConversionCursor.getInt(blockAllThirdPartyRequestsColumnIndex)
-
- // Instantiate a domain content values.
- val domainContentValues = ContentValues()
-
- // Populate the domain content values.
- domainContentValues.put(ENABLE_JAVASCRIPT, convertFromSwitchToSpinner(javaScriptDefaultValue, javaScriptDomainCurrentValue))
- domainContentValues.put(COOKIES, convertFromSwitchToSpinner(cookiesDefaultValue, cookiesDomainCurrentValue))
- domainContentValues.put(ENABLE_DOM_STORAGE, convertFromSwitchToSpinner(domStorageDefaultValue, domStorageDomainCurrentValue))
- domainContentValues.put(ENABLE_FORM_DATA, convertFromSwitchToSpinner(formDataDefaultValue, formDataDomainCurrentValue))
- domainContentValues.put(ENABLE_EASYLIST, convertFromSwitchToSpinner(easyListDefaultValue, easyListDomainCurrentValue))
- domainContentValues.put(ENABLE_EASYPRIVACY, convertFromSwitchToSpinner(easyPrivacyDefaultValue, easyPrivacyDomainCurrentValue))
- domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, convertFromSwitchToSpinner(fanboysAnnoyanceListDefaultValue, fanboysAnnoyanceListCurrentValue))
- domainContentValues.put(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST, convertFromSwitchToSpinner(fanboysSocialBlockingListDefaultValue, fanboysSocialBlockingListCurrentValue))
- domainContentValues.put(ULTRALIST, convertFromSwitchToSpinner(ultraListDefaultValue, ultraListCurrentValue))
- domainContentValues.put(ENABLE_ULTRAPRIVACY, convertFromSwitchToSpinner(ultraPrivacyDefaultValue, ultraPrivacyCurrentValue))
- domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, convertFromSwitchToSpinner(blockAllThirdPartyRequestsDefaultValue, blockAllThirdPartyRequestsCurrentValue))
-
- // Get the current database ID.
- val currentDatabaseId = importDomainsConversionCursor.getInt(importDomainsConversionCursor.getColumnIndexOrThrow(ID))
-
- // Update the row for the specified database ID.
- importDatabase.update(DOMAINS_TABLE, domainContentValues, "$ID = $currentDatabaseId", null)
- }
-
- // Close the cursor.
- importDomainsConversionCursor.close()
- }
-
// Close the bookmarks cursor and database.
importBookmarksCursor.close()
bookmarksDatabaseHelper.close()
val domainJavaScriptColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT)
val domainCookiesColumnIndex = importDomainsCursor.getColumnIndexOrThrow(COOKIES)
val domainDomStorageColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE)
- val domainFormDataColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA) // Form data can be removed once the minimum API >= 26.
val domainEasyListColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_EASYLIST)
val domainEasyPrivacyColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY)
val domainFanboysAnnoyanceListColumnIndex = importDomainsCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST)
domainContentValues.put(ENABLE_JAVASCRIPT, importDomainsCursor.getInt(domainJavaScriptColumnIndex))
domainContentValues.put(COOKIES, importDomainsCursor.getInt(domainCookiesColumnIndex))
domainContentValues.put(ENABLE_DOM_STORAGE, importDomainsCursor.getInt(domainDomStorageColumnIndex))
- domainContentValues.put(ENABLE_FORM_DATA, importDomainsCursor.getInt(domainFormDataColumnIndex)) // Form data can be removed once the minimum API >= 26.
domainContentValues.put(ENABLE_EASYLIST, importDomainsCursor.getInt(domainEasyListColumnIndex))
domainContentValues.put(ENABLE_EASYPRIVACY, importDomainsCursor.getInt(domainEasyPrivacyColumnIndex))
domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, importDomainsCursor.getInt(domainFanboysAnnoyanceListColumnIndex))
.putBoolean(JAVASCRIPT, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(JAVASCRIPT)) == 1)
.putBoolean(COOKIES, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(COOKIES)) == 1)
.putBoolean(DOM_STORAGE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(DOM_STORAGE)) == 1)
- .putBoolean(SAVE_FORM_DATA, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(SAVE_FORM_DATA)) == 1) // Save form data can be removed once the minimum API >= 26.
.putString(PREFERENCES_USER_AGENT, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndexOrThrow(PREFERENCES_USER_AGENT)))
.putString(CUSTOM_USER_AGENT, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndexOrThrow(CUSTOM_USER_AGENT)))
.putBoolean(INCOGNITO_MODE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(INCOGNITO_MODE)) == 1)
.putBoolean(CLEAR_EVERYTHING, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_EVERYTHING)) == 1)
.putBoolean(CLEAR_COOKIES, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_COOKIES)) == 1)
.putBoolean(CLEAR_DOM_STORAGE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_DOM_STORAGE)) == 1)
- .putBoolean(CLEAR_FORM_DATA, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_FORM_DATA)) == 1) // Clear form data can be removed once the minimum API >= 26.
.putBoolean(CLEAR_LOGCAT, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_LOGCAT)) == 1)
.putBoolean(CLEAR_CACHE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_CACHE)) == 1)
.putString(HOMEPAGE, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndexOrThrow(HOMEPAGE)))
val domainJavaScriptColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_JAVASCRIPT)
val domainCookiesColumnIndex = domainsCursor.getColumnIndexOrThrow(COOKIES)
val domainDomStorageColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_DOM_STORAGE)
- val domainFormDataColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_FORM_DATA) // Form data can be removed once the minimum API >= 26.
val domainEasyListColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_EASYLIST)
val domainEasyPrivacyColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_EASYPRIVACY)
val domainFanboysAnnoyanceListColumnIndex = domainsCursor.getColumnIndexOrThrow(ENABLE_FANBOYS_ANNOYANCE_LIST)
domainContentValues.put(ENABLE_JAVASCRIPT, domainsCursor.getInt(domainJavaScriptColumnIndex))
domainContentValues.put(COOKIES, domainsCursor.getInt(domainCookiesColumnIndex))
domainContentValues.put(ENABLE_DOM_STORAGE, domainsCursor.getInt(domainDomStorageColumnIndex))
- domainContentValues.put(ENABLE_FORM_DATA, domainsCursor.getInt(domainFormDataColumnIndex)) // Form data can be removed once the minimum API >= 26.
domainContentValues.put(ENABLE_EASYLIST, domainsCursor.getInt(domainEasyListColumnIndex))
domainContentValues.put(ENABLE_EASYPRIVACY, domainsCursor.getInt(domainEasyPrivacyColumnIndex))
domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, domainsCursor.getInt(domainFanboysAnnoyanceListColumnIndex))
"$JAVASCRIPT BOOLEAN, " +
"$COOKIES BOOLEAN, " +
"$DOM_STORAGE BOOLEAN, " +
- "$SAVE_FORM_DATA BOOLEAN, " +
"$PREFERENCES_USER_AGENT TEXT, " +
"$CUSTOM_USER_AGENT TEXT, " +
"$INCOGNITO_MODE BOOLEAN, " +
"$CLEAR_EVERYTHING BOOLEAN, " +
"$CLEAR_COOKIES BOOLEAN, " +
"$CLEAR_DOM_STORAGE BOOLEAN, " +
- "$CLEAR_FORM_DATA BOOLEAN, " +
"$CLEAR_LOGCAT BOOLEAN, " +
"$CLEAR_CACHE BOOLEAN, " +
"$HOMEPAGE TEXT, " +
preferencesContentValues.put(JAVASCRIPT, sharedPreferences.getBoolean(JAVASCRIPT, false))
preferencesContentValues.put(COOKIES, sharedPreferences.getBoolean(COOKIES, false))
preferencesContentValues.put(DOM_STORAGE, sharedPreferences.getBoolean(DOM_STORAGE, false))
- preferencesContentValues.put(SAVE_FORM_DATA, sharedPreferences.getBoolean(SAVE_FORM_DATA, false)) // Save form data can be removed once the minimum API >= 26.
preferencesContentValues.put(PREFERENCES_USER_AGENT, sharedPreferences.getString(PREFERENCES_USER_AGENT, context.getString(R.string.user_agent_default_value)))
preferencesContentValues.put(CUSTOM_USER_AGENT, sharedPreferences.getString(CUSTOM_USER_AGENT, context.getString(R.string.custom_user_agent_default_value)))
preferencesContentValues.put(INCOGNITO_MODE, sharedPreferences.getBoolean(INCOGNITO_MODE, false))
preferencesContentValues.put(CLEAR_EVERYTHING, sharedPreferences.getBoolean(CLEAR_EVERYTHING, true))
preferencesContentValues.put(CLEAR_COOKIES, sharedPreferences.getBoolean(CLEAR_COOKIES, true))
preferencesContentValues.put(CLEAR_DOM_STORAGE, sharedPreferences.getBoolean(CLEAR_DOM_STORAGE, true))
- preferencesContentValues.put(CLEAR_FORM_DATA, sharedPreferences.getBoolean(CLEAR_FORM_DATA, true)) // Clear form data can be removed once the minimum API >= 26.
preferencesContentValues.put(CLEAR_LOGCAT, sharedPreferences.getBoolean(CLEAR_LOGCAT, true))
preferencesContentValues.put(CLEAR_CACHE, sharedPreferences.getBoolean(CLEAR_CACHE, true))
preferencesContentValues.put(HOMEPAGE, sharedPreferences.getString(HOMEPAGE, context.getString(R.string.homepage_default_value)))
+++ /dev/null
-<!-- This file comes from the Android Material icon set, where it is called `info_outline`. It is released under the Apache License 2.0. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24" >
-
- <path
- android:fillColor="@color/icon"
- android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z" />
-</vector>
<path
android:fillColor="@color/blue_icon"
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z" />
-</vector>
\ No newline at end of file
+</vector>
+++ /dev/null
-<!-- This file comes from the Android Material icon set, where it is called `subtitles`. It is released under the Apache License 2.0. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24"
- android:autoMirrored="true" >
-
- <path
- android:fillColor="@color/red_icon"
- android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z"/>
-</vector>
+++ /dev/null
-<!-- This file comes from the Android Material icon set, where it is called `subtitles`. It is released under the Apache License 2.0. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24"
- android:autoMirrored="true" >
-
- <path
- android:fillColor="@color/blue_icon"
- android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z"/>
-</vector>
\ No newline at end of file
+++ /dev/null
-<!-- This file comes from the Android Material icon set, where it is called `subtitles`. It is released under the Apache License 2.0. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24"
- android:autoMirrored="true" >
-
- <path
- android:fillColor="@color/disabled_icon"
- android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z"/>
-</vector>
\ No newline at end of file
+++ /dev/null
-<!-- This file comes from the Android Material icon set, where it is called `subtitles`. It is released under the Apache License 2.0. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24"
- android:autoMirrored="true" >
-
- <path
- android:fillColor="@color/yellow_900"
- android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z"/>
-</vector>
\ No newline at end of file
+++ /dev/null
-<!--
- Copyright 2017,2022 Soren Stoutner <soren@stoutner.com>.
-
- This file is derived from elements of `folder` and `exit_to_app`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
-
- This file is part of Privacy Browser Android <https://www.stoutner.com/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
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- 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 Android. If not, see <http://www.gnu.org/licenses/>. -->
-
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24"
- android:autoMirrored="true" >
-
- <path
- android:fillColor="@color/icon"
- android:pathData="M4,4C2.9,4 2.01,4.9 2.01,6L2,18C2,19.1 2.9,20 4,20L20,20C21.1,20 22,19.1 22,18L22,8C22,6.9 21.1,6 20,6L12,6L10,4L4,4zM13.75,7.83L18.75,12.83L13.75,17.83L12.34,16.421L14.92,13.83L5.25,13.83L5.25,11.83L14.92,11.83L12.34,9.24L13.75,7.83z" />
-</vector>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2017-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2017-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:textSize="13sp" />
</LinearLayout>
- <!-- Form Data. This may be removed one the minimum API >= 26. -->
- <LinearLayout
- android:id="@+id/form_data_linearlayout"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:padding="12dp" >
-
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/form_data" />
-
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:orientation="horizontal" >
-
- <ImageView
- android:id="@+id/form_data_imageview"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="1dp"
- android:layout_marginEnd="10dp"
- android:layout_gravity="center_vertical"
- android:src="@drawable/form_data_enabled"
- app:tint="@color/yellow_icon_selector"
- android:contentDescription="@string/form_data" />
-
- <Spinner
- android:id="@+id/form_data_spinner"
- android:layout_height="wrap_content"
- android:layout_width="match_parent" />
- </LinearLayout>
-
- <TextView
- android:id="@+id/form_data_textview"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_marginStart="45dp"
- android:layout_marginEnd="36dp"
- android:textSize="13sp" />
- </LinearLayout>
-
<!-- User Agent. -->
<LinearLayout
android:id="@+id/user_agent_linearlayout"
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:imeOptions="actionGo"
android:inputType="number"
android:selectAllOnFocus="true"
- android:importantForAutofill="no"
- tools:targetApi="26" />
+ android:importantForAutofill="no" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:imeOptions="actionGo"
android:inputType="number"
android:selectAllOnFocus="true"
- android:importantForAutofill="no"
- tools:targetApi="26" />
+ android:importantForAutofill="no" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal" >
android:layout_width="match_parent"
android:orientation="horizontal" >
- <!-- `android:imeOptions="actionGo"` sets the keyboard to have a go key instead of a new line key. `android:inputType="textUri"` disables spell check in the `EditText`.
- `android:autofillHints` only applies to API >= 26. `tools:ignore="UnusedAttribute"` removes the lint warning. -->
+ <!-- `android:imeOptions="actionGo"` sets the keyboard to have a go key instead of a new line key. `android:inputType="textUri"` disables spell check in the `EditText`. -->
<EditText
android:id="@+id/url_edittext"
android:layout_height="wrap_content"
android:imeOptions="actionGo"
android:inputType="textUri"
android:selectAllOnFocus="true"
- android:autofillHints=""
- tools:ignore="UnusedAttribute" />
+ android:autofillHints="" />
</RelativeLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2015-2017,2020,2022-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2015-2017, 2020, 2022-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:orderInCategory="20"
app:showAsAction="ifRoom" />
- <!-- `android:iconTint` can be used once API >= 26 instead of including a separate drawable for each theme. -->
<item
android:id="@+id/move_to_folder"
android:title="@string/move_to_folder"
android:orderInCategory="30"
- android:icon="@drawable/move_to_folder"
+ android:icon="@drawable/move_to_folder_blue"
+ android:iconTint="@color/icon"
app:showAsAction="ifRoom" />
<item
android:icon="@drawable/edit"
app:showAsAction="ifRoom" />
- <!-- `android:iconTint` can be used once API >= 26 instead of including a separate drawable for each theme. -->
<item
android:id="@+id/delete_bookmark"
android:title="@string/delete"
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright © 2019-2020,2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2019-2020, 2022, 2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:icon="@drawable/select_all"
app:showAsAction="ifRoom" />
- <!-- `android:iconTint` can be used once API >= 26 instead of including a separate drawable for each theme. -->
<item
android:id="@+id/delete"
android:title="@string/delete"
android:orderInCategory="20"
android:icon="@drawable/delete"
app:showAsAction="ifRoom" />
-</menu>
\ No newline at end of file
+</menu>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright © 2017,2020,2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2017, 2020, 2022, 2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
- <!-- `android:iconTint` can be used once API >= 26 instead of including a separate drawable for each theme. -->
<item
android:id="@+id/delete_domain"
android:title="@string/delete"
android:orderInCategory="10"
android:icon="@drawable/delete"
app:showAsAction="ifRoom" />
-</menu>
\ No newline at end of file
+</menu>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2018,2022-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2018, 2022-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:id="@+id/copy_headers"
android:title="@string/copy_string"
android:orderInCategory="10"
- android:icon="@drawable/copy"
app:showAsAction="never" />
<item
android:id="@+id/share_headers"
android:title="@string/share"
android:orderInCategory="20"
- android:icon="@drawable/share"
app:showAsAction="never" />
<item
android:id="@+id/save_headers"
android:title="@string/save"
android:orderInCategory="30"
- android:icon="@drawable/save"
app:showAsAction="never" />
<item
android:id="@+id/about_view_headers"
android:title="@string/about"
android:orderInCategory="40"
- android:icon="@drawable/about"
app:showAsAction="never" />
</menu>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2016-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2016-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
<item
android:id="@+id/about"
android:title="@string/about"
- android:icon="@drawable/about"
+ android:icon="@drawable/about_blue"
android:orderInCategory="10" />
<item
<item
android:id="@+id/about"
android:title="@string/about"
- android:icon="@drawable/about"
+ android:icon="@drawable/about_blue"
android:orderInCategory="160" />
</group>
</menu>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2015-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2015-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
android:checkable="true"
app:showAsAction="never" />
- <item
- android:id="@+id/save_form_data"
- android:title="@string/form_data"
- android:orderInCategory="700"
- android:checkable="true"
- app:showAsAction="never" />
-
<item
android:id="@+id/clear_data"
android:title="@string/clear_data"
- android:orderInCategory="800"
+ android:orderInCategory="700"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/clear_cookies"
android:title="@string/clear_cookies"
- android:orderInCategory="810"
+ android:orderInCategory="710"
app:showAsAction="never" />
<item
android:id="@+id/clear_dom_storage"
android:title="@string/clear_dom_storage"
- android:orderInCategory="820"
- app:showAsAction="never" />
-
- <item
- android:id="@+id/clear_form_data"
- android:title="@string/clear_form_data"
- android:orderInCategory="830"
+ android:orderInCategory="720"
app:showAsAction="never" />
</menu>
</item>
<item
android:id="@+id/filterlists"
android:title="@string/filterlists"
- android:orderInCategory="900"
+ android:orderInCategory="800"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/easylist"
android:title="@string/easylist"
- android:orderInCategory="910"
+ android:orderInCategory="810"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/easyprivacy"
android:title="@string/easyprivacy"
- android:orderInCategory="920"
+ android:orderInCategory="820"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/fanboys_annoyance_list"
android:title="@string/options_fanboys_annoyance_list"
- android:orderInCategory="930"
+ android:orderInCategory="830"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/fanboys_social_blocking_list"
android:title="@string/options_fanboys_social_blocking_list"
- android:orderInCategory="940"
+ android:orderInCategory="840"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/ultralist"
android:title="@string/ultralist"
- android:orderInCategory="950"
+ android:orderInCategory="850"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/ultraprivacy"
android:title="@string/ultraprivacy"
- android:orderInCategory="960"
+ android:orderInCategory="860"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/block_all_third_party_requests"
android:title="@string/options_block_all_third_party_requests"
- android:orderInCategory="970"
+ android:orderInCategory="870"
android:checkable="true"
app:showAsAction="never" />
</menu>
<item
android:id="@+id/proxy"
android:title="@string/proxy"
- android:orderInCategory="1000"
+ android:orderInCategory="900"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/proxy_none"
android:title="@string/proxy_none"
- android:orderInCategory="1010"
+ android:orderInCategory="910"
app:showAsAction="never" />
<item
android:id="@+id/proxy_tor"
android:title="@string/proxy_tor"
- android:orderInCategory="1020"
+ android:orderInCategory="920"
app:showAsAction="never" />
<item
android:id="@+id/proxy_i2p"
android:title="@string/proxy_i2p"
- android:orderInCategory="1030"
+ android:orderInCategory="930"
app:showAsAction="never" />
<item
android:id="@+id/proxy_custom"
android:title="@string/proxy_custom"
- android:orderInCategory="1040"
+ android:orderInCategory="940"
app:showAsAction="never" />
</group>
</menu>
<item
android:id="@+id/page"
android:title="@string/page"
- android:orderInCategory="1100"
+ android:orderInCategory="1000"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/user_agent"
android:title="@string/options_user_agent"
- android:orderInCategory="1110"
+ android:orderInCategory="1010"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/user_agent_privacy_browser"
android:title="@string/user_agent_privacy_browser"
- android:orderInCategory="1111"
+ android:orderInCategory="1011"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_webview_default"
android:title="@string/user_agent_webview_default"
- android:orderInCategory="1112"
+ android:orderInCategory="1012"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_firefox_on_android"
android:title="@string/user_agent_firefox_on_android"
- android:orderInCategory="1113"
+ android:orderInCategory="1013"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_chrome_on_android"
android:title="@string/user_agent_chrome_on_android"
- android:orderInCategory="1114"
+ android:orderInCategory="1014"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_safari_on_ios"
android:title="@string/user_agent_safari_on_ios"
- android:orderInCategory="1115"
+ android:orderInCategory="1015"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_firefox_on_linux"
android:title="@string/user_agent_firefox_on_linux"
- android:orderInCategory="1116"
+ android:orderInCategory="1016"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_chromium_on_linux"
android:title="@string/user_agent_chromium_on_linux"
- android:orderInCategory="1117"
+ android:orderInCategory="1017"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_firefox_on_windows"
android:title="@string/user_agent_firefox_on_windows"
- android:orderInCategory="1118"
+ android:orderInCategory="1018"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_chrome_on_windows"
android:title="@string/user_agent_chrome_on_windows"
- android:orderInCategory="1119"
+ android:orderInCategory="1019"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_edge_on_windows"
android:title="@string/user_agent_edge_on_windows"
- android:orderInCategory="1120"
+ android:orderInCategory="1020"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_safari_on_macos"
android:title="@string/user_agent_safari_on_macos"
- android:orderInCategory="1121"
+ android:orderInCategory="1021"
app:showAsAction="never" />
<item
android:id="@+id/user_agent_custom"
android:title="@string/user_agent_custom"
- android:orderInCategory="1122"
+ android:orderInCategory="1022"
app:showAsAction="never" />
</group>
</menu>
<item
android:id="@+id/swipe_to_refresh"
android:title="@string/swipe_to_refresh_options_menu"
- android:orderInCategory="1130"
+ android:orderInCategory="1030"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/wide_viewport"
android:title="@string/wide_viewport"
- android:orderInCategory="1140"
+ android:orderInCategory="1040"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/display_images"
android:title="@string/display_images"
- android:orderInCategory="1150"
+ android:orderInCategory="1050"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/dark_webview"
android:title="@string/dark_webview"
- android:orderInCategory="1160"
+ android:orderInCategory="1060"
android:checkable="true"
app:showAsAction="never" />
<item
android:id="@+id/font_size"
android:title="@string/font_size"
- android:orderInCategory="1170"
+ android:orderInCategory="1070"
app:showAsAction="never" />
<item
android:id="@+id/find_on_page"
android:title="@string/find_on_page"
- android:orderInCategory="1180"
+ android:orderInCategory="1080"
app:showAsAction="never|collapseActionView" />
<item
android:id="@+id/print"
android:title="@string/print"
- android:orderInCategory="1190"
+ android:orderInCategory="1090"
app:showAsAction="never" />
<item
android:id="@+id/save"
android:title="@string/save"
- android:orderInCategory="1200"
+ android:orderInCategory="1100"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/save_url"
android:title="@string/save_url"
- android:orderInCategory="1201"
+ android:orderInCategory="1101"
app:showAsAction="never" />
<item
android:id="@+id/save_archive"
android:title="@string/save_archive"
- android:orderInCategory="1202"
+ android:orderInCategory="1102"
app:showAsAction="never" />
<item
android:id="@+id/save_image"
android:title="@string/save_image"
- android:orderInCategory="1203"
+ android:orderInCategory="1103"
app:showAsAction="never" />
</menu>
</item>
<item
android:id="@+id/add_to_homescreen"
android:title="@string/add_to_home_screen"
- android:orderInCategory="1210"
+ android:orderInCategory="1110"
app:showAsAction="never" />
<item
android:id="@+id/view_source"
android:title="@string/view_source"
- android:orderInCategory="1220"
+ android:orderInCategory="1120"
app:showAsAction="never" />
<item
android:id="@+id/view_headers"
android:title="@string/view_headers"
- android:orderInCategory="1230"
+ android:orderInCategory="1130"
app:showAsAction="never" />
</menu>
</item>
<item
android:id="@+id/share"
android:title="@string/share"
- android:orderInCategory="1300"
+ android:orderInCategory="1200"
app:showAsAction="never" >
<menu>
<item
android:id="@+id/share_message"
android:title="@string/share_message"
- android:orderInCategory="1310"
+ android:orderInCategory="1210"
app:showAsAction="never" />
<item
android:id="@+id/share_url"
android:title="@string/share_url"
- android:orderInCategory="1320"
+ android:orderInCategory="1220"
app:showAsAction="never" />
<item
android:id="@+id/open_with_app"
android:title="@string/open_with_app"
- android:orderInCategory="1330"
+ android:orderInCategory="1230"
app:showAsAction="never" />
<item
android:id="@+id/open_with_browser"
android:title="@string/open_with_browser"
- android:orderInCategory="1340"
+ android:orderInCategory="1240"
app:showAsAction="never" />
</menu>
</item>
<item
android:id="@+id/add_or_edit_domain"
android:title="@string/add_domain_settings"
- android:orderInCategory="1400"
+ android:orderInCategory="1300"
app:showAsAction="never" />
</menu>
<string name="cookies_disabled">Cookies deaktiviert</string>
<string name="dom_storage_enabled">DOM-Speicher aktiviert</string>
<string name="dom_storage_disabled">DOM-Speicher deaktiviert</string>
- <string name="form_data_enabled">Formulardaten aktiviert</string>
- <string name="form_data_disabled">Formulardaten deaktiviert</string>
<string name="cookies_deleted">Cookies gelöscht</string>
<string name="dom_storage_deleted">DOM-Speicher gelöscht</string>
- <string name="form_data_deleted">Formulardaten gelöscht</string>
<string name="open_navigation_drawer">Navigationspanel öffnen</string>
<string name="close_navigation_drawer">Navigationspanel schließen</string>
<string name="pin_drawer">Menü anpinnen</string>
<string name="stop">Stop</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">DOM-Speicher</string>
- <string name="form_data">Formulardaten</string>
<string name="clear_data">Daten löschen</string>
<string name="clear_cookies">Cookies löschen</string>
<string name="clear_dom_storage">DOM-Speicher löschen</string>
- <string name="clear_form_data">Formulardaten löschen</string>
<string name="options_fanboys_annoyance_list">Fanboy’s Annoyance Sperrliste</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking Sperrliste</string>
<string name="options_block_all_third_party_requests">Alle Zugriffe auf Dritt-Anbieter-Inhalte blockieren</string>
<item>DOM-Speicher aktiviert</item>
<item>DOM-Speicher deaktiviert</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>Systemeinstellung</item>
- <item>Formulardaten aktiviert</item>
- <item>Formulardaten deaktiviert</item>
- </string-array>
<string-array name="easylist_array">
<item>Systemeinstellung</item>
<item>EasyList aktiviert</item>
Sind Cookies im aktiven Tab aktiviert, sind diese auch für alle Netzwerk-Anfragen anderer Tabs im Hintergrund aktiviert.</string>
<string name="dom_storage_preference">DOM-Speicher</string>
<string name="dom_storage_preference_summary">JavaScript muss aktiviert sein, damit der DOM-(Document Object Model)-Speicher funktioniert.</string>
- <string name="save_form_data_preference">Formulardaten</string>
- <string name="save_form_data_preference_summary">Mit gespeicherten Formulardaten können Formularfelder auf Websites automatisch ausgefüllt werden.</string>
<string name="user_agent">User Agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="display_under_cutouts_summary">Zeigt die Internetseite unterhalb von Ausschnitten wie etwa Kamera-Einbuchtungen.
Ist diese Option aktiv, wrd Privacy Browser auch unterhalb der Tastatur dargestellt. Das Ändern dieser Einstellung startet Privacy Browser neu.</string>
<string name="clear_everything">Alles löschen</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Löscht Cookies, DOM-Storage, Formular-Daten, das Logcat Systemlogbuch und den WebView-Cache, sowie die gesamten “app_webview”- und “cache”-Ordner.</string>
+ <string name="clear_everything_summary">Löscht Cookies, DOM-Storage, das Logcat Systemlogbuch und den WebView-Cache, sowie die gesamten “app_webview”- und “cache”-Ordner.</string>
<string name="clear_cookies_preference">Cookies löschen</string>
<string name="clear_cookies_summary">Löscht Cookies.</string>
<string name="clear_dom_storage_preference">DOM Storage löschen</string>
<string name="clear_dom_storage_summary">Löscht DOM storage (aka Web Storage oder Supercookies).</string>
- <string name="clear_form_data_preference">Formulardaten löschen</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Löscht in Formulare eingegebene Daten.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Logcat leeren</string>
<string name="clear_logcat_summary">Leert das Logcat Systemlogbuch.</string>
<string name="clear_cache">Cache löschen</string>
<string name="cookies_disabled">Cookies deshabilitadas</string>
<string name="dom_storage_enabled">Almacenamiento DOM habilitado</string>
<string name="dom_storage_disabled">Almacenamiento DOM deshabilitado</string>
- <string name="form_data_enabled">Datos de formulario habilitados</string>
- <string name="form_data_disabled">Datos de formulario deshabilitados</string>
<string name="cookies_deleted">Cookies borradas</string>
<string name="dom_storage_deleted">Almacenamiento DOM borrado</string>
- <string name="form_data_deleted">Datos de formulario borrado</string>
<string name="open_navigation_drawer">Abrir la caja de navegación</string>
<string name="close_navigation_drawer">Cerrar la caja de navegación</string>
<string name="pin_drawer">Fijar el cajón</string>
<string name="stop">Parar</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">Almacenamiento DOM</string>
- <string name="form_data">Datos de formulario</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">Borrar datos</string>
<string name="clear_cookies">Borrar cookies</string>
<string name="clear_dom_storage">Borrar almacenamiento DOM</string>
- <string name="clear_form_data">Borrar datos de formulario</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Lista molesta de Fanboy</string>
<string name="options_fanboys_social_blocking_list">Lista de bloqueo social de Fanboy</string>
<string name="options_block_all_third_party_requests">Bloquear todas las solicitudes de terceros</string>
<item>Almacenamiento DOM habilitado</item>
<item>Almacenamiento DOM deshabilitado</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>Por defecto del sistema</item>
- <item>Datos de formulario habilitados</item>
- <item>Datos de formulario deshabilitados</item>
- </string-array>
<string-array name="easylist_array">
<item>Por defecto del sistema</item>
<item>EasyList habilitada</item>
Cuando la pestaña activa tiene las cookies habilitadas, cualquier solicitud de red realizada en segundo plano por otra pestaña también tiene las cookies habilitadas.</string>
<string name="dom_storage_preference">Almacenamiento DOM</string>
<string name="dom_storage_preference_summary">JavaScript debe estar activado para que el almacenamiento del Modelo de Objetos del Documento funcione.</string>
- <string name="save_form_data_preference">Datos de formulario</string>
- <string name="save_form_data_preference_summary">Los datos de formularios guardados pueden rellenar automáticamente las casillas o campos de las webs.</string>
<string name="user_agent">Agente de usuario</string>
<string-array name="translated_user_agent_names">
<item>Navegador Privado</item>
<string name="display_under_cutouts_summary">Mostrar el sitio web bajo los recortes, como las muescas de la cámara. Cuando está opción está activada, Navegador Privado también se dibujará bajo el teclado.
Al cambiar esta configuración se reiniciará Navegador Privado.</string>
<string name="clear_everything">Borrar todo</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, datos de formulario, el logcat y la caché de WebView.
- A continuación borra manualmente los directorios “app_webview” y “cache”.</string>
+ <string name="clear_everything_summary">Borra cookies, almacenamiento DOM, el logcat y la caché de WebView. A continuación borra manualmente los directorios “app_webview” y “cache”.</string>
<string name="clear_cookies_preference">Borrar cookies</string>
<string name="clear_cookies_summary">Borra las cookies.</string>
<string name="clear_dom_storage_preference">Borrar almacenamiento DOM</string>
<string name="clear_dom_storage_summary">Borra el almacenamiento DOM.</string>
- <string name="clear_form_data_preference">Borrar datos de formulario</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Borra los datos de formulario.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Borrar logcat</string>
<string name="clear_logcat_summary">Borra el logcat.</string>
<string name="clear_cache">Borrar caché</string>
<string name="cookies_disabled">Cookies désactivés</string>
<string name="dom_storage_enabled">Stockage du DOM activé</string>
<string name="dom_storage_disabled">Stockage du DOM désactivé</string>
- <string name="form_data_enabled">Données de formulaires activé</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="form_data_disabled">Données de formulaires désactivé</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="cookies_deleted">Cookies supprimés</string>
<string name="dom_storage_deleted">Stockage du DOM supprimé</string>
- <string name="form_data_deleted">Données de formulaires supprimées</string>
<string name="open_navigation_drawer">Ouvrir le panneau de navigation</string>
<string name="close_navigation_drawer">Fermer le panneau de navigation</string>
<string name="pin_drawer">Épingler le panneau</string>
<string name="stop">Stop</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">Stockage DOM</string>
- <string name="form_data">Formulaire de données</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">Effacer les données</string>
<string name="clear_cookies">Effacer les cookies</string>
<string name="clear_dom_storage">Effacer le stockage du DOM</string>
- <string name="clear_form_data">Effacer les données de formulaire</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Fanboy’s Annoyance List</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking List</string>
<string name="options_block_all_third_party_requests">Bloquer toutes les requêtes tierces parties</string>
<item>Stockage du DOM activé</item>
<item>Stockage du DOM désactivé</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>Valeur système</item>
- <item>Données de formulaire activées</item>
- <item>Données de formulaire désactivées</item>
- </string-array>
<string-array name="easylist_array">
<item>Valeur système</item>
<item>EasyList activé</item>
toute requête réseau effectuée en arrière-plan par un autre onglet a également les cookies activés.</string>
<string name="dom_storage_preference">Stockage du DOM</string>
<string name="dom_storage_preference_summary">JavaScript doit être activé pour que le stockage du Document Object Model fonctionne.</string>
- <string name="save_form_data_preference">Formulaire de données</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="save_form_data_preference_summary">Les formulaires de données sauvegardés peuvent remplir automatiquement des champs sur les sites web.</string>
<string name="user_agent">User agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="display_under_cutouts_summary">Affiche le site web sous les éléments découpés, tels que les encoches d\'appareil photo.
Lorsque ce paramètre est activé, Privacy Browser sera également affiché sous le clavier. La modification de ce paramètre entraînera le redémarrage de Privacy Browser.</string>
<string name="clear_everything">Tout effacer</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Efface les cookies, le stockage DOM, les données de formulaire, le logcat et le cache de WebView.
- Supprime ensuite manuellement les répertoires entiers «app_webview» et «cache».</string>
+ <string name="clear_everything_summary">Efface les cookies, le stockage DOM, le logcat et le cache de WebView. Supprime ensuite manuellement les répertoires entiers «app_webview» et «cache».</string>
<string name="clear_cookies_preference">Effacer les cookies</string>
<string name="clear_cookies_summary">Efface les cookies.</string>
<string name="clear_dom_storage_preference">Effacer le stockage DOM</string>
<string name="clear_dom_storage_summary">Efface le stockage du DOM.</string>
- <string name="clear_form_data_preference">Effacer les données de formulaire</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Efface les données de formulaire.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Vider logcat</string>
<string name="clear_logcat_summary">Vide le logcat.</string>
<string name="clear_cache">Effacer cache</string>
<string name="cookies_disabled">Cookies disabilitati</string>
<string name="dom_storage_enabled">DOM Storage abilitato</string>
<string name="dom_storage_disabled">DOM Storage disabilitato</string>
- <string name="form_data_enabled">Dati dei Moduli abilitati</string>
- <string name="form_data_disabled">Dati dei Moduli disabilitati</string>
<string name="cookies_deleted">Cookies eliminati</string>
<string name="dom_storage_deleted">DOM Storage eliminato</string>
- <string name="form_data_deleted">Dati dei Moduli eliminati</string>
<string name="open_navigation_drawer">Apri il menu di navigazione</string>
<string name="close_navigation_drawer">Chiudi il menu di navigazione</string>
<string name="pin_drawer">Fissa il cassetto</string>
<string name="stop">Stop</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">DOM storage</string>
- <string name="form_data">Dati dei moduli</string>
<string name="clear_data">Elimina dati</string>
<string name="clear_cookies">Elimina cookies</string>
<string name="clear_dom_storage">Elimina DOM storage</string>
- <string name="clear_form_data">Elimina dati dei moduli</string>
<string name="options_fanboys_annoyance_list">Fanboy’s annoyance list</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s social blocking list</string>
<string name="options_block_all_third_party_requests">Blocca tutte le richieste di Terze Parti</string>
<item>DOM storage abilitato</item>
<item>DOM storage disabilitato</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>Default di Sistema</item>
- <item>Dati dei Form abilitati</item>
- <item>Dati dei Form disabilitati</item>
- </string-array>
<string-array name="easylist_array">
<item>Default di Sistema</item>
<item>EasyList abilitata</item>
Quando la scheda attiva ha i cookies abilitati, anche ogni altra richiesta di rete effettuata in background da altre schede ha i cookies abilitati.</string>
<string name="dom_storage_preference">DOM Storage</string>
<string name="dom_storage_preference_summary">JavaScript deve essere abilitato per permettere il funzionamento del Document Object Model storage.</string>
- <string name="save_form_data_preference">Dati dei moduli</string>
- <string name="save_form_data_preference_summary">I dati dei moduli salvati permettono di auto-compilare i campi dei moduli nei siti web.</string>
<string name="user_agent">User agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="display_under_cutouts_summary">Visualizza il sito web sotto i ritagli dello schermo come quello della fotocamera.
Quando questa opzione è abilitata, Privacy Browser sarà anche visualizzato sotto alla tastiera. La modifica di questa impostazione provoca il riavvio di Privacy Browser.</string>
<string name="clear_everything">Elimina tutto</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Cancella i cookies, il DOM storage, i dati dei moduli, il logcat e la cache di WebView. Cancella completamente le cartelle “app_webview” e “cache”.</string>
+ <string name="clear_everything_summary">Cancella i cookies, il DOM storage, il logcat e la cache di WebView. Cancella completamente le cartelle “app_webview” e “cache”.</string>
<string name="clear_cookies_preference">Elimina i cookie</string>
<string name="clear_cookies_summary">Cancella i cookies.</string>
<string name="clear_dom_storage_preference">Elimina il DOM storage</string>
<string name="clear_dom_storage_summary">Cancella solo il DOM storage.</string>
- <string name="clear_form_data_preference">Elimina i dati dei moduli</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Cancella solo i dati dei moduli.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Elimina il logcat</string>
<string name="clear_logcat_summary">Cancella il logcat.</string>
<string name="clear_cache">Elimina la cache</string>
<string name="cookies_disabled">Cookies desativados</string>
<string name="dom_storage_enabled">Armazenamento DOM ativado</string>
<string name="dom_storage_disabled">Armazenamento DOM desativado</string>
- <string name="form_data_enabled">Dados de formulário habilitados</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="form_data_disabled">Dados de formulário desabilitados</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="cookies_deleted">Cookies excluídos</string>
<string name="dom_storage_deleted">Armazenamento DOM excluído</string>
- <string name="form_data_deleted">Dados do formulário excluídos</string>
<string name="open_navigation_drawer">Abrir a caixa de navegação</string>
<string name="close_navigation_drawer">Fechar a caixa de navegação</string>
<string name="unrecognized_url">URL desconhecida:\u0020 %1$s</string>
<string name="stop">Parar</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">Armazenamento DOM</string>
- <string name="form_data">Dados do formulário</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">Limpar dados</string>
<string name="clear_cookies">Limpar Cookies</string>
<string name="clear_dom_storage">Limpar Armazenamento DOM</string>
- <string name="clear_form_data">Clear Form Data</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Lista de Aborrecimento Fanboy’s</string>
<string name="options_fanboys_social_blocking_list">Lista de bloqueio social Fanboy’s</string>
<string name="options_block_all_third_party_requests">Bloquear todas as solicitações de terceiros</string>
Quando a guia ativa tem cookies habilitados, qualquer solicitação de rede feita em segundo plano por outra guia também tem cookies habilitados.</string>
<string name="dom_storage_preference">Armazenamento DOM</string>
<string name="dom_storage_preference_summary">O JavaScript deve estar habilitado para que o armazenamento do Document Object Model funcione.</string>
- <string name="save_form_data_preference">Dados do formulário</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="save_form_data_preference_summary">Dados de formulário salvos podem preencher campos automaticamente em sites.</string>
- <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="user_agent">Agente do usuário</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="hide_app_bar">Ocultar a barra de aplicativos</string>
<string name="hide_app_bar_summary">Oculte a barra de aplicativos que contém o URL.</string>
<string name="clear_everything">Limpar tudo</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Limpa cookies, armazenamento DOM, dados de formulário e cache do WebView. Em seguida, exclui manualmente todos os diretórios “app_webview” e “cache”.</string>
+ <string name="clear_everything_summary">Limpa cookies, armazenamento DOM, e cache do WebView. Em seguida, exclui manualmente todos os diretórios “app_webview” e “cache”.</string>
<string name="clear_cookies_preference">Limpar cookies</string>
<string name="clear_cookies_summary">Limpar os cookies.</string>
<string name="clear_dom_storage_preference">Limpar armazenamento DOM</string>
<string name="clear_dom_storage_summary">Limpa o armazenamento DOM.</string>
- <string name="clear_form_data_preference">Limpar dados do formulário</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Limpa os dados do formulário.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Limpar Logcat</string>
<string name="clear_logcat_summary">Limpar os Logcats.</string>
<string name="clear_cache">Limpar cache</string>
<string name="cookies_disabled">Cookie отключены</string>
<string name="dom_storage_enabled">DOM-хранилище включено</string>
<string name="dom_storage_disabled">DOM-хранилище отключено</string>
- <string name="form_data_enabled">Данные формы включены</string>
- <string name="form_data_disabled">Данные формы отключены</string>
<string name="cookies_deleted">Файлы cookie удалены</string>
<string name="dom_storage_deleted">DOM-хранилище удалено</string>
- <string name="form_data_deleted">Данные формы удалены</string>
<string name="open_navigation_drawer">Открыть панель навигации</string>
<string name="close_navigation_drawer">Закрыть панель навигации</string>
<string name="pin_drawer">Закрепить панель</string>
<string name="stop">Остановить</string>
<string name="cookies">Cookie</string>
<string name="dom_storage">DOM-хранилище</string>
- <string name="form_data">Данные формы</string>
<string name="clear_data">Очистить данные</string>
<string name="clear_cookies">Очистить cookie</string>
<string name="clear_dom_storage"> Очистить DOM-хранилище</string>
- <string name="clear_form_data">Очистить данные формы</string>
<string name="options_fanboys_annoyance_list">Fanboy’s annoyance list</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s social blocking list</string>
<string name="options_block_all_third_party_requests">Блокировать все сторонние запросы</string>
<item>DOM-хранилище включено</item>
<item>DOM-хранилище отключено</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>По умолчанию</item>
- <item>Данные форм включены</item>
- <item>Данные форм отключены</item>
- </string-array>
<string-array name="easylist_array">
<item>По умолчанию</item>
<item>EasyList включен</item>
Включение cookie на активной вкладке также приведет к их включению и на фоновых вкладках для выполняемых сетевых запросов.</string>
<string name="dom_storage_preference">DOM-хранилище</string>
<string name="dom_storage_preference_summary">Для работы DOM-хранилища необходимо включить JavaScript.</string>
- <string name="save_form_data_preference">Сохранение данных формы</string>
- <string name="save_form_data_preference_summary">Сохраненные данные формы могут автоматически заполнять поля на веб-сайтах.</string>
<string name="user_agent">User agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="display_under_cutouts_summary">Отрисовывать сайт под вырезами, например, под камерой. Если эта опция включена, Privacy Browser также будет отображаться под клавиатурой.
Изменение этой настройки приведет к перезапуску Privacy Browser.</string>
<string name="clear_everything">Очистить все</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Очищает cookie, DOM-хранилище, данные форм, logcat и кэш WebView. После этого вручную удаляет каталоги "app_webview" и "cache".</string>
+ <string name="clear_everything_summary">Очищает cookie, DOM-хранилище, logcat и кэш WebView. После этого вручную удаляет каталоги "app_webview" и "cache".</string>
<string name="clear_cookies_preference">Очистить cookie</string>
<string name="clear_cookies_summary">Очищает cookie.</string>
<string name="clear_dom_storage_preference">Очистить DOM-хранилище</string>
<string name="clear_dom_storage_summary">Очищает DOM-хранилище.</string>
- <string name="clear_form_data_preference">Очистка данных формы</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Очищает данные формы.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Очистить logcat</string>
<string name="clear_logcat_summary">Очищает logcat.</string>
<string name="clear_cache">Очистить кэш</string>
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright 2015-2023 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2015-2024 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
<string name="javascript_disabled">JavaScript devre dışı</string>
<string name="dom_storage_enabled">DOM Depolama etkin</string>
<string name="dom_storage_disabled">DOM Depolama devre dışı</string>
- <string name="form_data_enabled">Form Verisi etkin</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="form_data_disabled">Form Verisi devre dışı</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="cookies_deleted">Çerezler silindi</string>
<string name="dom_storage_deleted">DOM Depolama silindi</string>
- <string name="form_data_deleted">Form Verisi silindi</string>
<string name="open_navigation_drawer">Gezinti Menüsünü aç</string>
<string name="close_navigation_drawer">Gezinti Menüsünü kapa</string>
<string name="unrecognized_url">Onaylanmamış URL:\u0020 %1$s</string>
<string name="refresh">Yenile</string>
<string name="stop">Dur</string>
<string name="dom_storage">DOM Depolama</string>
- <string name="form_data">Form Verisi</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">Veriyi temizle</string>
<string name="clear_cookies">Çerezleri temizle</string>
<string name="clear_dom_storage">DOM Depolamayı temizle</string>
- <string name="clear_form_data">Form Verisini temizle</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Fanboy’s Annoyance List</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking List</string>
<string name="options_block_all_third_party_requests">Tüm Üçüncü Taraf İstekleri engelle</string>
<string name="privacy">Gizlilik</string>
<string name="javascript_preference_summary">JavaScript, web sitelerin cihazdaki programları (scriptler) çalıştırmasına izin verir.</string>
<string name="dom_storage_preference">DOM depolama</string>
- <string name="save_form_data_preference">Form verisi</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="save_form_data_preference_summary">Kaydedilen form verisi, web sitelerdeki boşlukları otomatik olarak dolduracaktır.</string>
<string name="user_agent">Kullanıcı aracısı</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="hide_app_bar">Uygulama çubuğunu gizle</string>
<string name="hide_app_bar_summary">URL içeren uygulama çubuğunu gizler.</string>
<string name="clear_everything">Her şeyi temizle</string>
- <string name="clear_everything_summary">Çerezleri, DOM depolamayı, form verisini ve WebView ön belleğini temizler. Sonrasında, manuel olarak bütün “app_webview” ve “cache” dizinlerini siler.</string>
+ <string name="clear_everything_summary">Çerezleri, DOM depolamayı, ve WebView ön belleğini temizler. Sonrasında, manuel olarak bütün “app_webview” ve “cache” dizinlerini siler.</string>
<string name="clear_cookies_preference">Çerezleri temizle</string>
<string name="clear_dom_storage_preference">DOM Depolamayı temizle</string>
<string name="clear_dom_storage_summary">DOM Depolamayı temizler.</string>
- <string name="clear_form_data_preference">Form verisini temizle</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Form verisini temizler.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_cache">Önbelleği temizle</string>
<string name="clear_cache_summary">WebView önbelleğini temizler.</string>
<string name="general">Genel</string>
<string name="cookies_disabled">关闭 Cookies</string>
<string name="dom_storage_enabled">开启 DOM 储存</string>
<string name="dom_storage_disabled">关闭 DOM 储存</string>
- <string name="form_data_enabled">启用表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="form_data_disabled">关闭表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="cookies_deleted">删除 Cookies</string>
<string name="dom_storage_deleted">删除 DOM 储存</string>
- <string name="form_data_deleted">删除表单数据</string>
<string name="open_navigation_drawer">打开导航栏</string>
<string name="close_navigation_drawer">关闭导航栏</string>
<string name="pin_drawer">引脚栏</string>
<string name="stop">暂停</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">DOM 储存</string>
- <string name="form_data">表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">清空数据</string>
<string name="clear_cookies">清空 Cookies</string>
<string name="clear_dom_storage">清空 DOM 储存</string>
- <string name="clear_form_data">清楚表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Fanboy’s Annoyance List</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking List</string>
<string name="options_block_all_third_party_requests">阻止所有第三方请求</string>
<string name="cookies_preference_summary">Cookies 是应用程序级的设置,当活动的页面允许cookies,后台的其他请求网络的页面也允许cookies.</string>
<string name="dom_storage_preference">DOM 储存</string>
<string name="dom_storage_preference_summary">JavaScript 必须启用,DOM才能工作.</string>
- <string name="save_form_data_preference">保存表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="save_form_data_preference_summary">保存的表单数据可以自动填写网页的一些字段.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="user_agent">User agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="hide_app_bar">隐藏应用栏</string>
<string name="hide_app_bar_summary">隐藏包含URL的应用栏.</string>
<string name="clear_everything">清除所有</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">清除cookies,DOM储存,表单数据,日志,WebView缓存,之后手动删除app_WebView缓存</string>
<string name="clear_cookies_preference">清除 cookies</string>
<string name="clear_cookies_summary">清除 cookies.</string>
<string name="clear_dom_storage_preference">清除 DOM 储存</string>
<string name="clear_dom_storage_summary">清除 DOM 储存.</string>
- <string name="clear_form_data_preference">清除表单数据</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">清除表单数据.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">清除日志</string>
<string name="clear_logcat_summary">清除日志.</string>
<string name="clear_cache">清除缓存</string>
<string name="cookies_disabled">Cookies disabled</string>
<string name="dom_storage_enabled">DOM Storage enabled</string>
<string name="dom_storage_disabled">DOM Storage disabled</string>
- <string name="form_data_enabled">Form Data enabled</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="form_data_disabled">Form Data disabled</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="cookies_deleted">Cookies deleted</string>
<string name="dom_storage_deleted">DOM Storage deleted</string>
- <string name="form_data_deleted">Form Data deleted</string>
<string name="open_navigation_drawer">Open navigation drawer</string>
<string name="close_navigation_drawer">Close navigation drawer</string>
<string name="pin_drawer">Pin drawer</string>
<string name="stop">Stop</string>
<string name="cookies">Cookies</string>
<string name="dom_storage">DOM Storage</string>
- <string name="form_data">Form Data</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_data">Clear Data</string>
<string name="clear_cookies">Clear Cookies</string>
<string name="clear_dom_storage">Clear DOM Storage</string>
- <string name="clear_form_data">Clear Form Data</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="options_fanboys_annoyance_list">Fanboy’s Annoyance List</string>
<string name="options_fanboys_social_blocking_list">Fanboy’s Social Blocking List</string>
<string name="options_block_all_third_party_requests">Block All Third-Party Requests</string>
<item>DOM storage enabled</item>
<item>DOM storage disabled</item>
</string-array>
- <string-array name="form_data_array"> <!-- Form data can be removed once the minimum API >= 26. -->
- <item>System default</item>
- <item>Form data enabled</item>
- <item>Form data disabled</item>
- </string-array>
<string-array name="easylist_array">
<item>System default</item>
<item>EasyList enabled</item>
When the active tab has cookies enabled, any network request made in the background by another tab also has cookies enabled.</string>
<string name="dom_storage_preference">DOM storage</string>
<string name="dom_storage_preference_summary">JavaScript must be enabled for Document Object Model storage to function.</string>
- <string name="save_form_data_preference">Form data</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="save_form_data_preference_summary">Saved form data can auto-populate fields on websites.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="user_agent">User agent</string>
<string-array name="translated_user_agent_names">
<item>Privacy Browser</item>
<string name="display_under_cutouts_summary">Draw the website under cutouts, like camera notches. When this is enabled, Privacy Browser will also be drawn under the keyboard.
Changing this setting will restart Privacy Browser.</string>
<string name="clear_everything">Clear everything</string>
- <!-- The form data part of this string can be removed once the minimum API >= 26. -->
- <string name="clear_everything_summary">Clears cookies, DOM storage, form data, the logcat, and WebView’s cache. Then manually deletes the entire “app_webview” and “cache” directories.</string>
+ <string name="clear_everything_summary">Clears cookies, DOM storage, the logcat, and WebView’s cache. Then manually deletes the entire “app_webview” and “cache” directories.</string>
<string name="clear_cookies_preference">Clear cookies</string>
<string name="clear_cookies_summary">Clears cookies.</string>
<string name="clear_dom_storage_preference">Clear DOM storage</string>
<string name="clear_dom_storage_summary">Clears DOM storage.</string>
- <string name="clear_form_data_preference">Clear form data</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
- <string name="clear_form_data_summary">Clears form data.</string> <!-- The form data strings can be removed once the minimum API >= 26. -->
<string name="clear_logcat">Clear logcat</string>
<string name="clear_logcat_summary">Clears the logcat.</string>
<string name="clear_cache">Clear cache</string>
<string name="clear_cookies_key" translatable="false">clear_cookies</string>
<string name="clear_dom_storage_key" translatable="false">clear_dom_storage</string>
<string name="clear_everything_key" translatable="false">clear_everything</string>
- <string name="clear_form_data_key" translatable="false">clear_form_data</string> <!-- The clear form data string can be removed once the minimum API >= 26. -->
<string name="clear_logcat_key" translatable="false">clear_logcat</string>
<string name="custom_user_agent_key" translatable="false">custom_user_agent</string>
<string name="display_additional_app_bar_icons_key" translatable="false">display_additional_app_bar_icons</string>
<string name="privacy_category_key" translatable="false">privacy</string>
<string name="proxy_key" translatable="false">proxy</string>
<string name="proxy_custom_url_key" translatable="false">proxy_custom_url</string>
- <string name="save_form_data_key" translatable="false">save_form_data</string> <!--The form data string can be removed once the minimum API >= 26. -->
<string name="scroll_app_bar_key" translatable="false">scroll_app_bar</string>
<string name="search_custom_url_key" translatable="false">search_custom_url</string>
<string name="search_key" translatable="false">search</string>
app:summary="@string/dom_storage_preference_summary"
app:defaultValue="false" />
- <!-- Save form data can be removed once the minimum API >= 26. -->
- <SwitchPreferenceCompat
- app:key="@string/save_form_data_key"
- app:title="@string/save_form_data_preference"
- app:summary="@string/save_form_data_preference_summary"
- app:defaultValue="false" />
-
<ListPreference
app:key="@string/user_agent_key"
app:title="@string/user_agent"
app:summary="@string/clear_dom_storage_summary"
app:defaultValue="true" />
- <!-- Clear form data can be removed once the minimum API >= 26. -->
- <SwitchPreferenceCompat
- app:key="@string/clear_form_data_key"
- app:title="@string/clear_form_data_preference"
- app:summary="@string/clear_form_data_summary"
- app:defaultValue="true" />
-
<SwitchPreferenceCompat
app:key="@string/clear_logcat_key"
app:title="@string/clear_logcat"
--- /dev/null
+• Optionen für die Download Provider erweitert, sodass nun Privacy Browser, Androids Download Manager oder eine externe App gewählt werden kann.
+• Verschwendeter Platz zwischen dem Navigations-Menü-Icon und der URL-Leiste entfernt.
+• Neuer Eintrag für "Nach oben/unten scrollen" im Navigations-Menü hinzugefügt.
+• Option für Anzeige unter Kamera-Ausschnitt im Vollbild-Modus hinzugefügt.
+• Fehler behoben, durch den gelegentlich Tabs ohne entsprechende Seiten geöffnet wurden.
+• Selten auftretender Fehler behoben, durch welchen nach der Erstellung neuer Tabs falsche Seiten als aktiv gesetzt wurden.
+• Fehler beim Aktualisieren von Favoriten-Icons beim Navigieren im Verlauf behoben.
+• Vorgabe für das Scrollen der App-Leiste bei Neu-Installation deaktiviert.
+• Diverse kleine Verbesserungen an der Benutzer-Oberfläche.
+• Aktualisierte deutsche Übersetzung von Bernhard G. Keller.
\ No newline at end of file