@@ -41,6 +41,24 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
4141 true
4242 }
4343
44+ private fun sanitizeDnsPreferenceValue (value : String ): String {
45+ return value.lines().joinToString(" \n " ) { line ->
46+ line.filterNot { it.isISOControl() }.trim()
47+ }
48+ }
49+
50+ private fun dnsReloadListener (preference : EditTextPreference , newValue : Any? ): Boolean {
51+ val rawValue = newValue as ? String ? : return reloadListener.onPreferenceChange(preference, newValue)
52+ val sanitizedValue = sanitizeDnsPreferenceValue(rawValue)
53+ if (sanitizedValue != rawValue) {
54+ preference.text = sanitizedValue
55+ needReload()
56+ return false
57+ }
58+ needReload()
59+ return true
60+ }
61+
4462 override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
4563 preferenceManager.preferenceDataStore = DataStore .configurationStore
4664 DataStore .initGlobal()
@@ -203,8 +221,12 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
203221 concurrentDial.onPreferenceChangeListener = reloadListener
204222
205223 enableFakeDns.onPreferenceChangeListener = reloadListener
206- remoteDns.onPreferenceChangeListener = reloadListener
207- directDns.onPreferenceChangeListener = reloadListener
224+ remoteDns.onPreferenceChangeListener = Preference .OnPreferenceChangeListener { _, newValue ->
225+ dnsReloadListener(remoteDns, newValue)
226+ }
227+ directDns.onPreferenceChangeListener = Preference .OnPreferenceChangeListener { _, newValue ->
228+ dnsReloadListener(directDns, newValue)
229+ }
208230 enableDnsRouting.onPreferenceChangeListener = reloadListener
209231
210232 ipv6Mode.onPreferenceChangeListener = reloadListener
0 commit comments