package oppen.ariane.ui.settings import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import java.security.SecureRandom import java.util.* import javax.net.ssl.SSLContext import javax.net.ssl.SSLSocket import javax.net.ssl.SSLSocketFactory class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { lateinit var protocols: Array override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { val context = preferenceManager.context val screen = preferenceManager.createPreferenceScreen(context) /** * TLS Settings */ val tlsCategory = PreferenceCategory(context) tlsCategory.key = "tls_category" tlsCategory.title = "TLS Config" screen.addPreference(tlsCategory) val tlsDefaultPreference = SwitchPreferenceCompat(context) tlsDefaultPreference.key = "tls_Default" tlsDefaultPreference.title = "TLS Default" tlsDefaultPreference.onPreferenceChangeListener = this tlsCategory.addPreference(tlsDefaultPreference) val tlsAllSupportedPreference = SwitchPreferenceCompat(context) tlsAllSupportedPreference.key = "tls_All_Supported" tlsAllSupportedPreference.title = "TLS Enable all supported" tlsAllSupportedPreference.onPreferenceChangeListener = this tlsCategory.addPreference(tlsAllSupportedPreference) val sslContext = SSLContext.getInstance("TLS") sslContext.init(null, null, SecureRandom()) val factory: SSLSocketFactory = sslContext.socketFactory val socket = factory.createSocket() as SSLSocket protocols = socket.supportedProtocols protocols.forEach { protocol -> val tlsPreference = SwitchPreferenceCompat(context) tlsPreference.key = "tls_${protocol.toLowerCase(Locale.getDefault())}" tlsPreference.title = protocol tlsPreference.onPreferenceChangeListener = this tlsCategory.addPreference(tlsPreference) } preferenceScreen = screen } override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean { if(preference is SwitchPreferenceCompat && newValue is Boolean && newValue == true) { preference.key?.let { key -> when { key.startsWith("tls_") -> { if(key != "tls_Default"){ val default = preferenceScreen.findPreference("tls_Default") default?.isChecked = false } if(key != "tls_All_Supported"){ val default = preferenceScreen.findPreference("tls_All_Supported") default?.isChecked = false } protocols.forEach { protocol -> val tlsSwitchKey = "tls_${protocol.toLowerCase(Locale.getDefault())}" if (tlsSwitchKey != key) { val otherTLSSwitch = preferenceScreen.findPreference(tlsSwitchKey) otherTLSSwitch?.isChecked = false } } } } } when (preference.key) { "tls_Default" -> setTLSProtocol("TLS") "tls_All_Supported" -> setTLSProtocol("TLS_ALL") else -> { val prefTitle = preference.title.toString() setTLSProtocol(prefTitle) } } return true } return false } private fun setTLSProtocol(protocol: String){ preferenceManager.sharedPreferences.edit().putString( "tls_protocol", protocol ).apply() } }