You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
etesync-android/app/src/main/java/com/etesync/syncadapter/ui/AppSettingsActivity.kt

215 lines
9.0 KiB

/*
* Copyright © 2013 2016 Ricki Hirner (bitfire web engineering).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*/
package com.etesync.syncadapter.ui
import android.content.Intent
import android.os.AsyncTask
import android.os.Build
import android.os.Bundle
import androidx.preference.*
import at.bitfire.cert4android.CustomCertManager
import com.etesync.syncadapter.App
import com.etesync.syncadapter.BuildConfig
import com.etesync.syncadapter.R
import com.etesync.syncadapter.model.ServiceDB
import com.etesync.syncadapter.model.Settings
import com.etesync.syncadapter.utils.HintManager
import com.etesync.syncadapter.utils.LanguageUtils
import com.google.android.material.snackbar.Snackbar
import org.jetbrains.anko.defaultSharedPreferences
import java.net.URI
import java.net.URISyntaxException
class AppSettingsActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(android.R.id.content, SettingsFragment())
.commit()
}
}
class SettingsFragment : PreferenceFragmentCompat() {
internal lateinit var dbHelper: ServiceDB.OpenHelper
internal lateinit var settings: Settings
internal lateinit var prefPreferTasksOrg: SwitchPreferenceCompat
internal lateinit var prefResetHints: Preference
internal lateinit var prefOverrideProxy: SwitchPreferenceCompat
internal lateinit var prefDistrustSystemCerts: SwitchPreferenceCompat
internal lateinit var prefProxyHost: EditTextPreference
internal lateinit var prefProxyPort: EditTextPreference
override fun onCreate(savedInstanceState: Bundle?) {
dbHelper = ServiceDB.OpenHelper(context)
settings = Settings(dbHelper.readableDatabase)
super.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
dbHelper.close()
}
override fun onCreatePreferences(bundle: Bundle?, s: String?) {
addPreferencesFromResource(R.xml.settings_app)
findPreference("notification_settings").apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
onPreferenceClickListener = Preference.OnPreferenceClickListener {
startActivity(Intent(android.provider.Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, context.packageName)
})
false
}
else
isVisible = false
}
prefResetHints = findPreference("reset_hints")
prefOverrideProxy = findPreference("override_proxy") as SwitchPreferenceCompat
prefOverrideProxy.isChecked = settings.getBoolean(App.OVERRIDE_PROXY, false)
prefOverrideProxy.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
settings.putBoolean(App.OVERRIDE_PROXY, newValue as Boolean)
true
}
prefPreferTasksOrg = findPreference("prefer_tasksorg") as SwitchPreferenceCompat
prefPreferTasksOrg.isChecked = context!!.defaultSharedPreferences.getBoolean(App.PREFER_TASKSORG, false)
prefPreferTasksOrg.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
context!!.defaultSharedPreferences.edit().putBoolean(App.PREFER_TASKSORG, newValue as Boolean).apply()
Snackbar.make(view!!, getString(R.string.app_settings_prefer_tasksorg_snack), Snackbar.LENGTH_LONG).show()
true
}
prefProxyHost = findPreference("proxy_host") as EditTextPreference
val proxyHost = settings.getString(App.OVERRIDE_PROXY_HOST, App.OVERRIDE_PROXY_HOST_DEFAULT)
prefProxyHost.text = proxyHost
prefProxyHost.summary = proxyHost
prefProxyHost.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
val host = newValue as String
try {
URI(null, host, null, null)
} catch (e: URISyntaxException) {
Snackbar.make(view!!, e.localizedMessage, Snackbar.LENGTH_LONG).show()
return@OnPreferenceChangeListener false
}
settings.putString(App.OVERRIDE_PROXY_HOST, host)
prefProxyHost.summary = host
true
}
prefProxyPort = findPreference("proxy_port") as EditTextPreference
val proxyPort = settings.getString(App.OVERRIDE_PROXY_PORT, App.OVERRIDE_PROXY_PORT_DEFAULT.toString())
prefProxyPort.text = proxyPort
prefProxyPort.summary = proxyPort
prefProxyPort.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
var port: Int
try {
port = Integer.parseInt(newValue as String)
} catch (e: NumberFormatException) {
port = App.OVERRIDE_PROXY_PORT_DEFAULT
}
settings.putInt(App.OVERRIDE_PROXY_PORT, port)
prefProxyPort.text = port.toString()
prefProxyPort.summary = port.toString()
true
}
prefDistrustSystemCerts = findPreference("distrust_system_certs") as SwitchPreferenceCompat
prefDistrustSystemCerts.isChecked = settings.getBoolean(App.DISTRUST_SYSTEM_CERTIFICATES, false)
findPreference("reset_certificates").apply {
isVisible = BuildConfig.customCerts
isEnabled = true
onPreferenceClickListener = Preference.OnPreferenceClickListener {
resetCertificates()
false
}
}
val prefChangeNotification = findPreference("show_change_notification") as SwitchPreferenceCompat
prefChangeNotification.isChecked = context!!.defaultSharedPreferences.getBoolean(App.CHANGE_NOTIFICATION, true)
initSelectLanguageList()
}
private fun initSelectLanguageList() {
val listPreference = findPreference("select_language") as ListPreference
LanguageTask(listPreference).execute()
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
if (preference === prefResetHints)
resetHints()
else if (preference === prefDistrustSystemCerts)
setDistrustSystemCerts(preference.isChecked)
else
return false
return true
}
private fun resetHints() {
HintManager.resetHints(context!!)
Snackbar.make(view!!, R.string.app_settings_reset_hints_success, Snackbar.LENGTH_LONG).show()
}
private fun setDistrustSystemCerts(distrust: Boolean) {
settings.putBoolean(App.DISTRUST_SYSTEM_CERTIFICATES, distrust)
}
private fun resetCertificates() {
if (CustomCertManager.resetCertificates(activity!!))
Snackbar.make(view!!, getString(R.string.app_settings_reset_certificates_success), Snackbar.LENGTH_LONG).show()
}
private inner class LanguageTask internal constructor(private val mListPreference: ListPreference) : AsyncTask<Void, Void, LanguageUtils.LocaleList>() {
override fun doInBackground(vararg voids: Void): LanguageUtils.LocaleList {
return LanguageUtils.getAppLanguages(context!!)
}
override fun onPostExecute(locales: LanguageUtils.LocaleList) {
mListPreference.entries = locales.displayNames
mListPreference.entryValues = locales.localeData
mListPreference.value = settings.getString(App.FORCE_LANGUAGE,
App.DEFAULT_LANGUAGE)
mListPreference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, newValue ->
val value = newValue.toString()
if (value == (preference as ListPreference).value) return@OnPreferenceChangeListener true
LanguageUtils.setLanguage(context!!, value)
settings.putString(App.FORCE_LANGUAGE, newValue.toString())
val intent = Intent(context, AccountsActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
false
}
}
}
}
}