@@ -41,6 +41,26 @@ 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 : Preference , newValue : Any? ): Boolean {
51+ val rawValue = newValue as ? String ? : return reloadListener.onPreferenceChange(preference, newValue)
52+ val sanitizedValue = sanitizeDnsPreferenceValue(rawValue)
53+ if (sanitizedValue != rawValue) {
54+ if (preference is EditTextPreference ) {
55+ preference.text = sanitizedValue
56+ }
57+ needReload()
58+ return false
59+ }
60+ needReload()
61+ return true
62+ }
63+
4464 override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
4565 preferenceManager.preferenceDataStore = DataStore .configurationStore
4666 DataStore .initGlobal()
@@ -203,8 +223,12 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
203223 concurrentDial.onPreferenceChangeListener = reloadListener
204224
205225 enableFakeDns.onPreferenceChangeListener = reloadListener
206- remoteDns.onPreferenceChangeListener = reloadListener
207- directDns.onPreferenceChangeListener = reloadListener
226+ remoteDns.onPreferenceChangeListener = Preference .OnPreferenceChangeListener { preference, newValue ->
227+ dnsReloadListener(preference, newValue)
228+ }
229+ directDns.onPreferenceChangeListener = Preference .OnPreferenceChangeListener { preference, newValue ->
230+ dnsReloadListener(preference, newValue)
231+ }
208232 enableDnsRouting.onPreferenceChangeListener = reloadListener
209233
210234 ipv6Mode.onPreferenceChangeListener = reloadListener
0 commit comments