/*
- * 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 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, " +
"$ENABLE_FANBOYS_ANNOYANCE_LIST INTEGER, " +
"$ULTRALIST INTEGER, " +
"$ENABLE_ULTRAPRIVACY INTEGER, " +
"$BLOCK_ALL_THIRD_PARTY_REQUESTS INTEGER, " +
- "$USER_AGENT TEXT, " +
"$FONT_SIZE INTEGER, " +
"$SWIPE_TO_REFRESH INTEGER, " +
"$WEBVIEW_THEME 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()
}
return domainsDatabase.rawQuery("SELECT * FROM $DOMAINS_TABLE WHERE $DOMAIN_NAME = $sqlEscapedDomainName", null)
}
+ fun addDomain(contentValues: ContentValues) {
+ // Get a writable database handle.
+ val domainsDatabase = this.writableDatabase
+
+ // Add the new domain.
+ domainsDatabase.insert(DOMAINS_TABLE, null, contentValues)
+
+ // Close the database handle.
+ domainsDatabase.close()
+ }
+
fun addDomain(domainName: String): Int {
+ // Add the domain with default settings.
+ 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, 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.
val domainContentValues = ContentValues()
- // Get a handle for the shared preference.
- val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext)
-
- // Get the default settings.
- val javaScript = sharedPreferences.getBoolean(appContext.getString(R.string.javascript_key), false)
- val cookies = sharedPreferences.getBoolean(appContext.getString(R.string.cookies_key), false)
- val domStorage = sharedPreferences.getBoolean(appContext.getString(R.string.dom_storage_key), false)
- val saveFormData = sharedPreferences.getBoolean(appContext.getString(R.string.save_form_data_key), false) // Form data can be removed once the minimum API >= 26.
- val easyList = sharedPreferences.getBoolean(appContext.getString(R.string.easylist_key), true)
- val easyPrivacy = sharedPreferences.getBoolean(appContext.getString(R.string.easyprivacy_key), true)
- val fanboyAnnoyanceList = sharedPreferences.getBoolean(appContext.getString(R.string.fanboys_annoyance_list_key), true)
- val fanboySocialBlockingList = sharedPreferences.getBoolean(appContext.getString(R.string.fanboys_social_blocking_list_key), true)
- val ultraList = sharedPreferences.getBoolean(appContext.getString(R.string.ultralist_key), true)
- val ultraPrivacy = sharedPreferences.getBoolean(appContext.getString(R.string.ultraprivacy_key), true)
- val blockAllThirdPartyRequests = sharedPreferences.getBoolean(appContext.getString(R.string.block_all_third_party_requests_key), false)
-
// Create entries for the database fields. The ID is created automatically. The pinned SSL certificate information is not created unless added by the user.
domainContentValues.put(DOMAIN_NAME, domainName)
- domainContentValues.put(ENABLE_JAVASCRIPT, javaScript)
- domainContentValues.put(COOKIES, cookies)
- domainContentValues.put(ENABLE_DOM_STORAGE, domStorage)
- domainContentValues.put(ENABLE_FORM_DATA, saveFormData) // Form data can be removed once the minimum API >= 26.
- domainContentValues.put(ENABLE_EASYLIST, easyList)
- domainContentValues.put(ENABLE_EASYPRIVACY, easyPrivacy)
- domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, fanboyAnnoyanceList)
- domainContentValues.put(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST, fanboySocialBlockingList)
- domainContentValues.put(ULTRALIST, ultraList)
- domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacy)
- domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequests)
- domainContentValues.put(USER_AGENT, appContext.getString(R.string.system_default_user_agent))
- domainContentValues.put(FONT_SIZE, 0)
- domainContentValues.put(SWIPE_TO_REFRESH, 0)
- domainContentValues.put(WEBVIEW_THEME, 0)
- domainContentValues.put(WIDE_VIEWPORT, 0)
- domainContentValues.put(DISPLAY_IMAGES, 0)
+ domainContentValues.put(ENABLE_JAVASCRIPT, javaScriptInt)
+ domainContentValues.put(COOKIES, cookiesInt)
+ domainContentValues.put(ENABLE_DOM_STORAGE, domStorageInt)
+ domainContentValues.put(USER_AGENT, userAgentName)
+ domainContentValues.put(ENABLE_EASYLIST, easyListInt)
+ domainContentValues.put(ENABLE_EASYPRIVACY, easyPrivacyInt)
+ domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, fanboysAnnoyanceListInt)
+ domainContentValues.put(ENABLE_FANBOYS_SOCIAL_BLOCKING_LIST, fanboysSocialBlockingListInt)
+ domainContentValues.put(ULTRALIST, ultraListInt)
+ domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacyInt)
+ domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequestsInt)
+ domainContentValues.put(FONT_SIZE, fontSizeInt)
+ domainContentValues.put(SWIPE_TO_REFRESH, swipeToRefreshInt)
+ domainContentValues.put(WEBVIEW_THEME, webViewThemeInt)
+ domainContentValues.put(WIDE_VIEWPORT, wideViewportInt)
+ domainContentValues.put(DISPLAY_IMAGES, displayImagesInt)
// Get a writable database handle.
val domainsDatabase = this.writableDatabase
return newDomainDatabaseId
}
- fun addDomain(contentValues: ContentValues) {
- // Get a writable database handle.
- val domainsDatabase = this.writableDatabase
-
- // Add the new domain.
- domainsDatabase.insert(DOMAINS_TABLE, null, contentValues)
-
- // Close the database handle.
- domainsDatabase.close()
- }
-
- fun updateDomain(databaseId: Int, domainName: String, javaScript: Int, cookies: Int, domStorage: Int, formData: Int, easyList: Int, easyPrivacy: Int, fanboysAnnoyance: Int, fanboysSocialBlocking: Int,
- ultraList: Int, ultraPrivacy: Int, blockAllThirdPartyRequests: Int, userAgent: String, fontSize: Int, swipeToRefresh: Int, webViewTheme: Int, wideViewport: Int, displayImages: 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) {
// Instantiate a content values.
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)
domainContentValues.put(ENABLE_FANBOYS_ANNOYANCE_LIST, fanboysAnnoyance)
domainContentValues.put(ULTRALIST, ultraList)
domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacy)
domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequests)
- domainContentValues.put(USER_AGENT, userAgent)
domainContentValues.put(FONT_SIZE, fontSize)
domainContentValues.put(SWIPE_TO_REFRESH, swipeToRefresh)
domainContentValues.put(WEBVIEW_THEME, webViewTheme)
domainsDatabase.close()
}
- fun deleteDomain(databaseId: Int) {
+ fun deleteDomain(databaseId: Int) : Int {
// Get a writable database handle.
val domainsDatabase = this.writableDatabase
// Delete the row for the specified database ID.
- domainsDatabase.delete(DOMAINS_TABLE, "$ID = $databaseId", null)
+ val rowsDeleted = domainsDatabase.delete(DOMAINS_TABLE, "$ID = $databaseId", null)
// Close the database handle.
domainsDatabase.close()
+
+ // Return the delete status.
+ return rowsDeleted
}
}