/* * 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() { 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 } } } } }