/*
- * Copyright © 2017-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2017-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
import com.stoutner.privacybrowser.R
-// The private constants.
-private const val SCHEMA_VERSION = 13
+// Define the class constants.
+private const val SCHEMA_VERSION = 15
class DomainsDatabaseHelper(private val appContext: Context) : SQLiteOpenHelper(appContext, DOMAINS_DATABASE, null, SCHEMA_VERSION) {
// Define the public companion object constants. These can be moved to public class constants once the entire project has migrated to Kotlin.
companion object {
- // The database constants.
+ // Define the public database constants.
const val DOMAINS_DATABASE = "domains.db"
const val DOMAINS_TABLE = "domains"
- // The spinner constants.
+ // Define the public spinner constants.
const val SYSTEM_DEFAULT = 0
const val ENABLED = 1
const val DISABLED = 2
const val LIGHT_THEME = 1
const val DARK_THEME = 2
- // The schema constants.
+ // Define the public schema constants.
const val ID = "_id"
const val DOMAIN_NAME = "domainname"
const val ENABLE_JAVASCRIPT = "enablejavascript"
const val PINNED_IP_ADDRESSES = "pinned_ip_addresses"
const val IP_ADDRESSES = "ip_addresses"
- // The table creation constant.
+ // Define the public table creation constant.
const val CREATE_DOMAINS_TABLE = "CREATE TABLE $DOMAINS_TABLE (" +
"$ID INTEGER PRIMARY KEY, " +
"$DOMAIN_NAME TEXT, " +
// Add the WebView theme column. This defaults to `0`, which is `System default`, so a separate step isn't needed to populate the column.
domainsDatabase.execSQL("ALTER TABLE $DOMAINS_TABLE ADD COLUMN $WEBVIEW_THEME INTEGER")
+ // `night_mode` was removed.
// 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 night mode column. It will be wiped out the next time an import is run.
// Copy the data from the old column to the new one.
domainsDatabase.execSQL("UPDATE $DOMAINS_TABLE SET $COOKIES = enablefirstpartycookies")
}
+
+ // Upgrade from schema version 13, first used in Privacy Browser 3.8, to schema version 14, first used in Privacy Browser 3.11.
+ // This upgrade used to add the X-Requested-With header, but that was removed in schema version 15.
+
+ // Upgrade from schema version 14, first used in Privacy Browser 3.11, to schema version 15, first used in Privacy Browser 3.12.
+ // This upgrade removed `x_requested_with_header`.
+ // 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 X-Requested-With column. It will be wiped out the next time an import is run.
}
val completeCursorOrderedByDomain: Cursor
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext)
// Get the default settings.
- val javaScript = sharedPreferences.getBoolean("javascript", false)
+ 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("dom_storage", false)
- val saveFormData = sharedPreferences.getBoolean("save_form_data", false) // Form data can be removed once the minimum API >= 26.
- val easyList = sharedPreferences.getBoolean("easylist", true)
- val easyPrivacy = sharedPreferences.getBoolean("easyprivacy", true)
- val fanboyAnnoyanceList = sharedPreferences.getBoolean("fanboys_annoyance_list", true)
- val fanboySocialBlockingList = sharedPreferences.getBoolean("fanboys_social_blocking_list", true)
- val ultraList = sharedPreferences.getBoolean("ultralist", true)
- val ultraPrivacy = sharedPreferences.getBoolean("ultraprivacy", true)
- val blockAllThirdPartyRequests = sharedPreferences.getBoolean("block_all_third_party_requests", 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(ULTRALIST, ultraList)
domainContentValues.put(ENABLE_ULTRAPRIVACY, ultraPrivacy)
domainContentValues.put(BLOCK_ALL_THIRD_PARTY_REQUESTS, blockAllThirdPartyRequests)
- domainContentValues.put(USER_AGENT, "System default user agent")
+ 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)
}
fun updateDomain(databaseId: Int, domainName: String, javaScript: Boolean, cookies: Boolean, domStorage: Boolean, formData: Boolean, easyList: Boolean, easyPrivacy: Boolean, fanboysAnnoyance: Boolean,
- fanboysSocialBlocking: Boolean, ultraList: Boolean, ultraPrivacy: Boolean, blockAllThirdPartyRequests: Boolean, userAgent: String, fontSize: Int, swipeToRefresh: Int, webViewTheme: Int,
- wideViewport: Int, displayImages: Int, pinnedSslCertificate: Boolean, pinnedIpAddresses: Boolean) {
+ fanboysSocialBlocking: Boolean, ultraList: Boolean, ultraPrivacy: Boolean, blockAllThirdPartyRequests: Boolean, userAgent: String, fontSize: Int,
+ swipeToRefresh: Int, webViewTheme: Int, wideViewport: Int, displayImages: Int, pinnedSslCertificate: Boolean, pinnedIpAddresses: Boolean) {
+
// Instantiate a content values.
val domainContentValues = ContentValues()