diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt index f9de6ca6..e2fe19f6 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt @@ -2,13 +2,12 @@ package com.v2ray.ang import android.content.Context import androidx.multidex.MultiDexApplication -import androidx.preference.PreferenceManager import androidx.work.Configuration import com.tencent.mmkv.MMKV class AngApplication : MultiDexApplication(), Configuration.Provider { companion object { - const val PREF_LAST_VERSION = "pref_last_version" + //const val PREF_LAST_VERSION = "pref_last_version" lateinit var application: AngApplication } @@ -17,18 +16,18 @@ class AngApplication : MultiDexApplication(), Configuration.Provider { application = this } - var firstRun = false - private set + //var firstRun = false + // private set override fun onCreate() { super.onCreate() // LeakCanary.install(this) - val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) - firstRun = defaultSharedPreferences.getInt(PREF_LAST_VERSION, 0) != BuildConfig.VERSION_CODE - if (firstRun) - defaultSharedPreferences.edit().putInt(PREF_LAST_VERSION, BuildConfig.VERSION_CODE).apply() +// val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) +// firstRun = defaultSharedPreferences.getInt(PREF_LAST_VERSION, 0) != BuildConfig.VERSION_CODE +// if (firstRun) +// defaultSharedPreferences.edit().putInt(PREF_LAST_VERSION, BuildConfig.VERSION_CODE).apply() //Logger.init().logLevel(if (BuildConfig.DEBUG) LogLevel.FULL else LogLevel.NONE) MMKV.initialize(this) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt index 7295a15c..c148294b 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt @@ -12,44 +12,59 @@ object AppConfig { // legacy const val ANG_CONFIG = "ang_config" const val PREF_INAPP_BUY_IS_PREMIUM = "pref_inapp_buy_is_premium" - const val PREF_ROUTING_CUSTOM = "pref_routing_custom" // Preferences mapped to MMKV - const val PREF_MODE = "pref_mode" - const val PREF_SPEED_ENABLED = "pref_speed_enabled" const val PREF_SNIFFING_ENABLED = "pref_sniffing_enabled" - const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" + const val PREF_PER_APP_PROXY = "pref_per_app_proxy" + const val PREF_PER_APP_PROXY_SET = "pref_per_app_proxy_set" + const val PREF_BYPASS_APPS = "pref_bypass_apps" const val PREF_LOCAL_DNS_ENABLED = "pref_local_dns_enabled" const val PREF_FAKE_DNS_ENABLED = "pref_fake_dns_enabled" - const val PREF_VPN_DNS = "pref_vpn_dns" - const val PREF_REMOTE_DNS = "pref_remote_dns" - const val PREF_DOMESTIC_DNS = "pref_domestic_dns" const val PREF_LOCAL_DNS_PORT = "pref_local_dns_port" - const val PREF_ALLOW_INSECURE = "pref_allow_insecure" - const val PREF_SOCKS_PORT = "pref_socks_port" - const val PREF_HTTP_PORT = "pref_http_port" - const val PREF_LOGLEVEL = "pref_core_loglevel" - const val PREF_LANGUAGE = "pref_language" - const val PREF_PREFER_IPV6 = "pref_prefer_ipv6" + const val PREF_VPN_DNS = "pref_vpn_dns" + const val PREF_ROUTING_DOMAIN_STRATEGY = "pref_routing_domain_strategy" const val PREF_ROUTING_MODE = "pref_routing_mode" const val PREF_V2RAY_ROUTING_AGENT = "pref_v2ray_routing_agent" const val PREF_V2RAY_ROUTING_DIRECT = "pref_v2ray_routing_direct" const val PREF_V2RAY_ROUTING_BLOCKED = "pref_v2ray_routing_blocked" - const val PREF_PER_APP_PROXY = "pref_per_app_proxy" - const val PREF_PER_APP_PROXY_SET = "pref_per_app_proxy_set" - const val PREF_BYPASS_APPS = "pref_bypass_apps" - const val PREF_CONFIRM_REMOVE = "pref_confirm_remove" - const val PREF_START_SCAN_IMMEDIATE = "pref_start_scan_immediate" + const val PREF_ROUTING_CUSTOM = "pref_routing_custom" + const val PREF_MUX_ENABLED = "pref_mux_enabled" const val PREF_MUX_CONCURRENCY = "pref_mux_concurency" const val PREF_MUX_XUDP_CONCURRENCY = "pref_mux_xudp_concurency" const val PREF_MUX_XUDP_QUIC = "pref_mux_xudp_quic" + const val PREF_FRAGMENT_ENABLED = "pref_fragment_enabled" const val PREF_FRAGMENT_PACKETS = "pref_fragment_packets" const val PREF_FRAGMENT_LENGTH = "pref_fragment_length" const val PREF_FRAGMENT_INTERVAL = "pref_fragment_interval" + const val SUBSCRIPTION_AUTO_UPDATE = "pref_auto_update_subscription" + const val SUBSCRIPTION_AUTO_UPDATE_INTERVAL = "pref_auto_update_interval" + const val SUBSCRIPTION_DEFAULT_UPDATE_INTERVAL = "1440" // 24 hours + const val SUBSCRIPTION_UPDATE_TASK_NAME = "subscription_updater" + + const val PREF_SPEED_ENABLED = "pref_speed_enabled" + const val PREF_CONFIRM_REMOVE = "pref_confirm_remove" + const val PREF_START_SCAN_IMMEDIATE = "pref_start_scan_immediate" + const val PREF_LANGUAGE = "pref_language" + + const val PREF_PREFER_IPV6 = "pref_prefer_ipv6" + const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" + const val PREF_ALLOW_INSECURE = "pref_allow_insecure" + const val PREF_SOCKS_PORT = "pref_socks_port" + const val PREF_HTTP_PORT = "pref_http_port" + const val PREF_REMOTE_DNS = "pref_remote_dns" + const val PREF_DOMESTIC_DNS = "pref_domestic_dns" + const val PREF_LOGLEVEL = "pref_core_loglevel" + const val PREF_MODE = "pref_mode" + + const val CACHE_SUBSCRIPTION_ID = "cache_subscription_id" + const val CACHE_KEYWORD_FILTER = "cache_keyword_filter" + + //Preferences mapped to MMKV End + const val PROTOCOL_HTTP: String = "http://" const val PROTOCOL_HTTPS: String = "https://" const val PROTOCOL_FREEDOM: String = "freedom" @@ -107,13 +122,4 @@ object AppConfig { const val MSG_MEASURE_CONFIG = 7 const val MSG_MEASURE_CONFIG_SUCCESS = 71 const val MSG_MEASURE_CONFIG_CANCEL = 72 - - // subscription settings - const val SUBSCRIPTION_AUTO_UPDATE = "pref_auto_update_subscription" - const val SUBSCRIPTION_AUTO_UPDATE_INTERVAL = "pref_auto_update_interval" - const val SUBSCRIPTION_DEFAULT_UPDATE_INTERVAL = "1440" // 24 hours - const val SUBSCRIPTION_UPDATE_TASK_NAME = "subscription_updater" - - const val CACHE_SUBSCRIPTION_ID = "cache_subscription_id" - const val CACHE_KEYWORD_FILTER = "cache_keyword_filter" } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt index 155f1316..47abd1c3 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt @@ -8,9 +8,9 @@ import android.view.MenuItem import android.view.View import androidx.appcompat.widget.SearchView import androidx.lifecycle.lifecycleScope -import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager +import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.R @@ -19,20 +19,20 @@ import com.v2ray.ang.dto.AppInfo import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.v2RayApplication import com.v2ray.ang.util.AppManagerUtil +import com.v2ray.ang.util.MmkvManager import com.v2ray.ang.util.Utils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers import java.text.Collator -import java.util.* class PerAppProxyActivity : BaseActivity() { private lateinit var binding: ActivityBypassListBinding private var adapter: PerAppProxyAdapter? = null private var appsAll: List? = null - private val defaultSharedPreferences by lazy { PreferenceManager.getDefaultSharedPreferences(this) } + private val settingsStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_SETTING, MMKV.MULTI_PROCESS_MODE) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,7 +43,7 @@ class PerAppProxyActivity : BaseActivity() { val dividerItemDecoration = DividerItemDecoration(this, LinearLayoutManager.VERTICAL) binding.recyclerView.addItemDecoration(dividerItemDecoration) - val blacklist = defaultSharedPreferences.getStringSet(AppConfig.PREF_PER_APP_PROXY_SET, null) + val blacklist = settingsStorage?.decodeStringSet(AppConfig.PREF_PER_APP_PROXY_SET) AppManagerUtil.rxLoadNetworkAppList(this) .subscribeOn(Schedulers.io()) @@ -134,14 +134,14 @@ class PerAppProxyActivity : BaseActivity() { ***/ binding.switchPerAppProxy.setOnCheckedChangeListener { _, isChecked -> - defaultSharedPreferences.edit().putBoolean(AppConfig.PREF_PER_APP_PROXY, isChecked).apply() + settingsStorage.encode(AppConfig.PREF_PER_APP_PROXY, isChecked) } - binding.switchPerAppProxy.isChecked = defaultSharedPreferences.getBoolean(AppConfig.PREF_PER_APP_PROXY, false) + binding.switchPerAppProxy.isChecked = settingsStorage.getBoolean(AppConfig.PREF_PER_APP_PROXY, false) binding.switchBypassApps.setOnCheckedChangeListener { _, isChecked -> - defaultSharedPreferences.edit().putBoolean(AppConfig.PREF_BYPASS_APPS, isChecked).apply() + settingsStorage.encode(AppConfig.PREF_BYPASS_APPS, isChecked) } - binding.switchBypassApps.isChecked = defaultSharedPreferences.getBoolean(AppConfig.PREF_BYPASS_APPS, false) + binding.switchBypassApps.isChecked = settingsStorage.getBoolean(AppConfig.PREF_BYPASS_APPS, false) /*** et_search.setOnEditorActionListener { v, actionId, event -> @@ -177,7 +177,7 @@ class PerAppProxyActivity : BaseActivity() { override fun onPause() { super.onPause() adapter?.let { - defaultSharedPreferences.edit().putStringSet(AppConfig.PREF_PER_APP_PROXY_SET, it.blacklist).apply() + settingsStorage.encode(AppConfig.PREF_PER_APP_PROXY_SET, it.blacklist) } } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt index d4f77234..72f78798 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt @@ -11,11 +11,13 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import com.tbruyelle.rxpermissions.RxPermissions +import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.databinding.FragmentRoutingSettingsBinding import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.v2RayApplication +import com.v2ray.ang.util.MmkvManager import com.v2ray.ang.util.Utils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -26,7 +28,7 @@ class RoutingSettingsFragment : Fragment() { private const val routing_arg = "routing_arg" } - val defaultSharedPreferences by lazy { PreferenceManager.getDefaultSharedPreferences(requireContext()) } + private val settingsStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_SETTING, MMKV.MULTI_PROCESS_MODE) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -46,7 +48,7 @@ class RoutingSettingsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val content = defaultSharedPreferences.getString(requireArguments().getString(routing_arg), "") + val content = settingsStorage?.getString(requireArguments().getString(routing_arg), "") binding.etRoutingContent.text = Utils.getEditable(content!!) setHasOptionsMenu(true) @@ -83,7 +85,7 @@ class RoutingSettingsFragment : Fragment() { private fun saveRouting() { val content = binding.etRoutingContent.text.toString() - defaultSharedPreferences.edit().putString(requireArguments().getString(routing_arg), content).apply() + settingsStorage?.encode(requireArguments().getString(routing_arg), content) activity?.toast(R.string.toast_success) } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt index 470540b5..86ad5c9b 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt @@ -9,10 +9,12 @@ import androidx.preference.* import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.PeriodicWorkRequest import androidx.work.multiprocess.RemoteWorkManager +import com.tencent.mmkv.MMKV import com.v2ray.ang.AngApplication import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.service.SubscriptionUpdater +import com.v2ray.ang.util.MmkvManager import com.v2ray.ang.util.Utils import com.v2ray.ang.viewmodel.SettingsViewModel import java.util.concurrent.TimeUnit @@ -30,12 +32,16 @@ class SettingsActivity : BaseActivity() { } class SettingsFragment : PreferenceFragmentCompat() { + private val settingsStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_SETTING, MMKV.MULTI_PROCESS_MODE) } + private val perAppProxy by lazy { findPreference(AppConfig.PREF_PER_APP_PROXY) } private val localDns by lazy { findPreference(AppConfig.PREF_LOCAL_DNS_ENABLED) } private val fakeDns by lazy { findPreference(AppConfig.PREF_FAKE_DNS_ENABLED) } private val localDnsPort by lazy { findPreference(AppConfig.PREF_LOCAL_DNS_PORT) } private val vpnDns by lazy { findPreference(AppConfig.PREF_VPN_DNS) } - + + private val routingCustom by lazy { findPreference(AppConfig.PREF_ROUTING_CUSTOM) } + private val mux by lazy { findPreference(AppConfig.PREF_MUX_ENABLED) } private val muxConcurrency by lazy { findPreference(AppConfig.PREF_MUX_CONCURRENCY) } private val muxXudpConcurrency by lazy { findPreference(AppConfig.PREF_MUX_XUDP_CONCURRENCY) } @@ -46,18 +52,13 @@ class SettingsActivity : BaseActivity() { private val fragmentLength by lazy { findPreference(AppConfig.PREF_FRAGMENT_LENGTH) } private val fragmentInterval by lazy { findPreference(AppConfig.PREF_FRAGMENT_INTERVAL) } - // val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference } - private val remoteDns by lazy { findPreference(AppConfig.PREF_REMOTE_DNS) } - private val domesticDns by lazy { findPreference(AppConfig.PREF_DOMESTIC_DNS) } - private val socksPort by lazy { findPreference(AppConfig.PREF_SOCKS_PORT) } - private val httpPort by lazy { findPreference(AppConfig.PREF_HTTP_PORT) } - private val routingCustom by lazy { findPreference(AppConfig.PREF_ROUTING_CUSTOM) } private val autoUpdateCheck by lazy { findPreference(AppConfig.SUBSCRIPTION_AUTO_UPDATE) } private val autoUpdateInterval by lazy { findPreference(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL) } - // val licenses: Preference by lazy { findPreference(PREF_LICENSES) } -// val feedback: Preference by lazy { findPreference(PREF_FEEDBACK) } -// val tgGroup: Preference by lazy { findPreference(PREF_TG_GROUP) } + private val socksPort by lazy { findPreference(AppConfig.PREF_SOCKS_PORT) } + private val httpPort by lazy { findPreference(AppConfig.PREF_HTTP_PORT) } + private val remoteDns by lazy { findPreference(AppConfig.PREF_REMOTE_DNS) } + private val domesticDns by lazy { findPreference(AppConfig.PREF_DOMESTIC_DNS) } private val mode by lazy { findPreference(AppConfig.PREF_MODE) } override fun onCreatePreferences(bundle: Bundle?, s: String?) { @@ -89,27 +90,6 @@ class SettingsActivity : BaseActivity() { true } -// licenses.onClick { -// val fragment = LicensesDialogFragment.Builder(act) -// .setNotices(R.raw.licenses) -// .setIncludeOwnLicense(false) -// .build() -// fragment.show((act as AppCompatActivity).supportFragmentManager, null) -// } -// -// feedback.onClick { -// Utils.openUri(activity, "https://github.com/2dust/v2rayNG/issues") -// } -// tgGroup.onClick { -// // Utils.openUri(activity, "https://t.me/v2rayN") -// val intent = Intent(Intent.ACTION_VIEW, Uri.parse("tg:resolve?domain=v2rayN")) -// try { -// startActivity(intent) -// } catch (e: Exception) { -// e.printStackTrace() -// toast(R.string.toast_tg_app_not_found) -// } -// } perAppProxy?.setOnPreferenceClickListener { startActivity(Intent(activity, PerAppProxyActivity::class.java)) @@ -193,61 +173,76 @@ class SettingsActivity : BaseActivity() { override fun onStart() { super.onStart() - val defaultSharedPreferences = - PreferenceManager.getDefaultSharedPreferences(requireActivity()) - updateMode(defaultSharedPreferences.getString(AppConfig.PREF_MODE, "VPN")) - var remoteDnsString = defaultSharedPreferences.getString(AppConfig.PREF_REMOTE_DNS, "") + initSharedPreference() - domesticDns?.summary = defaultSharedPreferences.getString(AppConfig.PREF_DOMESTIC_DNS, "") - localDnsPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS) - socksPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) - httpPort?.summary = defaultSharedPreferences.getString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP) - updateMux(defaultSharedPreferences.getBoolean(AppConfig.PREF_MUX_ENABLED, false)) - muxConcurrency?.summary = defaultSharedPreferences.getString(AppConfig.PREF_MUX_CONCURRENCY, "8") - muxXudpConcurrency?.summary = defaultSharedPreferences.getString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8") - updateFragment(defaultSharedPreferences.getBoolean(AppConfig.PREF_FRAGMENT_ENABLED, false)) - fragmentPackets?.summary = defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_PACKETS, "tlshello") - fragmentLength?.summary = defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_LENGTH, "50-100") - fragmentInterval?.summary = defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20") - autoUpdateInterval?.summary = defaultSharedPreferences.getString(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL,AppConfig.SUBSCRIPTION_DEFAULT_UPDATE_INTERVAL) - autoUpdateInterval?.isEnabled = defaultSharedPreferences.getBoolean(AppConfig.SUBSCRIPTION_AUTO_UPDATE, false) + updateMode(settingsStorage.decodeString(AppConfig.PREF_MODE, "VPN")) + localDns?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_LOCAL_DNS_ENABLED, false) + fakeDns?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_FAKE_DNS_ENABLED, false) + localDnsPort?.summary = settingsStorage.decodeString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS) + vpnDns?.summary = settingsStorage.decodeString(AppConfig.PREF_VPN_DNS)?: settingsStorage.decodeString(AppConfig.PREF_REMOTE_DNS)?: AppConfig.DNS_VPN - if (TextUtils.isEmpty(remoteDnsString)) { - remoteDnsString = AppConfig.DNS_PROXY - } - if (TextUtils.isEmpty(domesticDns?.summary)) { - domesticDns?.summary = AppConfig.DNS_DIRECT - } - remoteDns?.summary = remoteDnsString - vpnDns?.summary = - defaultSharedPreferences.getString(AppConfig.PREF_VPN_DNS, remoteDnsString) + updateMux(settingsStorage.getBoolean(AppConfig.PREF_MUX_ENABLED, false)) + mux?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_MUX_ENABLED, false) + muxConcurrency?.summary = settingsStorage.decodeString(AppConfig.PREF_MUX_CONCURRENCY, "8") + muxXudpConcurrency?.summary = settingsStorage.decodeString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8") - if (TextUtils.isEmpty(localDnsPort?.summary)) { - localDnsPort?.summary = AppConfig.PORT_LOCAL_DNS + updateFragment(settingsStorage.getBoolean(AppConfig.PREF_FRAGMENT_ENABLED, false)) + fragment?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_FRAGMENT_ENABLED, false) + fragmentPackets?.summary = settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_PACKETS, "tlshello") + fragmentLength?.summary = settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_LENGTH, "50-100") + fragmentInterval?.summary = settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20") + + autoUpdateCheck?.isChecked = settingsStorage.getBoolean(AppConfig.SUBSCRIPTION_AUTO_UPDATE, false) + autoUpdateInterval?.summary = settingsStorage.decodeString(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL,AppConfig.SUBSCRIPTION_DEFAULT_UPDATE_INTERVAL) + autoUpdateInterval?.isEnabled = settingsStorage.getBoolean(AppConfig.SUBSCRIPTION_AUTO_UPDATE, false) + + socksPort?.summary = settingsStorage.decodeString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) + httpPort?.summary = settingsStorage.decodeString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP) + remoteDns?.summary = settingsStorage.decodeString(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY) + domesticDns?.summary = settingsStorage.decodeString(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT) + } + + private fun initSharedPreference() { + listOf( + AppConfig.PREF_SNIFFING_ENABLED, + AppConfig.PREF_BYPASS_APPS, + AppConfig.PREF_SPEED_ENABLED, + AppConfig.PREF_CONFIRM_REMOVE, + AppConfig.PREF_START_SCAN_IMMEDIATE, + AppConfig.PREF_PREFER_IPV6, + AppConfig.PREF_PROXY_SHARING, + AppConfig.PREF_ALLOW_INSECURE + ).forEach { key -> + findPreference(key)?.isChecked = + settingsStorage.decodeBool(key, false) } - if (TextUtils.isEmpty(socksPort?.summary)) { - socksPort?.summary = AppConfig.PORT_SOCKS - } - if (TextUtils.isEmpty(httpPort?.summary)) { - httpPort?.summary = AppConfig.PORT_HTTP + + listOf( + AppConfig.PREF_ROUTING_DOMAIN_STRATEGY, + AppConfig.PREF_ROUTING_MODE, + AppConfig.PREF_MUX_XUDP_QUIC, + AppConfig.PREF_FRAGMENT_PACKETS, + AppConfig.PREF_LANGUAGE, + AppConfig.PREF_LOGLEVEL, + AppConfig.PREF_MODE + ).forEach { key -> + if (settingsStorage.decodeString(key) != null) { + findPreference(key)?.value = settingsStorage.decodeString(key) + } } } private fun updateMode(mode: String?) { - val defaultSharedPreferences = - PreferenceManager.getDefaultSharedPreferences(requireActivity()) val vpn = mode == "VPN" perAppProxy?.isEnabled = vpn - perAppProxy?.isChecked = - PreferenceManager.getDefaultSharedPreferences(requireActivity()) - .getBoolean(AppConfig.PREF_PER_APP_PROXY, false) + perAppProxy?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_PER_APP_PROXY, false) localDns?.isEnabled = vpn fakeDns?.isEnabled = vpn localDnsPort?.isEnabled = vpn vpnDns?.isEnabled = vpn if (vpn) { updateLocalDns( - defaultSharedPreferences.getBoolean( + settingsStorage.getBoolean( AppConfig.PREF_LOCAL_DNS_ENABLED, false ) @@ -283,15 +278,14 @@ class SettingsActivity : BaseActivity() { val rw = RemoteWorkManager.getInstance(AngApplication.application) rw.cancelUniqueWork(AppConfig.SUBSCRIPTION_UPDATE_TASK_NAME) } - + private fun updateMux(enabled: Boolean) { - val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()) muxConcurrency?.isEnabled = enabled muxXudpConcurrency?.isEnabled = enabled muxXudpQuic?.isEnabled = enabled if (enabled) { - updateMuxConcurrency(defaultSharedPreferences.getString(AppConfig.PREF_MUX_CONCURRENCY, "8")) - updateMuxXudpConcurrency(defaultSharedPreferences.getString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8")) + updateMuxConcurrency(settingsStorage.decodeString(AppConfig.PREF_MUX_CONCURRENCY, "8")) + updateMuxXudpConcurrency(settingsStorage.decodeString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8")) } } @@ -314,14 +308,13 @@ class SettingsActivity : BaseActivity() { } private fun updateFragment(enabled: Boolean) { - val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()) fragmentPackets?.isEnabled = enabled fragmentLength?.isEnabled = enabled fragmentInterval?.isEnabled = enabled if (enabled) { - updateFragmentPackets(defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_PACKETS, "tlshello")) - updateFragmentLength(defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_LENGTH, "50-100")) - updateFragmentInterval(defaultSharedPreferences.getString(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20")) + updateFragmentPackets(settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_PACKETS, "tlshello")) + updateFragmentLength(settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_LENGTH, "50-100")) + updateFragmentInterval(settingsStorage.decodeString(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20")) } } private fun updateFragmentPackets(value: String?) {