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 e54812cd..26d8c378 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt @@ -11,6 +11,7 @@ class AngApplication : Application() { const val PREF_LAST_VERSION = "pref_last_version" } + var curIndex = -1 //Current proxy that is opened. (Used to implement restart feature) var firstRun = false private set diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt index ada2cbc1..3dfd15fc 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt @@ -64,7 +64,6 @@ class V2RayVpnService : VpnService() { private var mNotificationManager: NotificationManager? = null - /** * Unfortunately registerDefaultNetworkCallback is going to return our VPN interface: https://android.googlesource.com/platform/frameworks/base/+/dda156ab0c5d66ad82bdcf76cda07cbc0a9c8a2e * @@ -282,12 +281,19 @@ class V2RayVpnService : VpnService() { unregisterReceiver(mMsgReceive) } catch (e: Exception) { } + + //stopSelf has to be called ahead of mInterface.close(). otherwise v2ray core cannot be stooped + //It's strage but true. + //This can be verified by putting stopself() behind and call stopLoop and startLoop + //in a row for several times. You will find that later created v2ray core report port in use + //which means the first v2ray core somehow failed to stop and release the port. + stopSelf() + try { mInterface.close() } catch (ignored: Exception) { } - stopSelf() } } 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 d8425d30..f83ae661 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 @@ -4,10 +4,8 @@ import android.content.Intent import android.content.SharedPreferences import android.net.Uri import android.os.Bundle -import android.preference.CheckBoxPreference -import android.preference.EditTextPreference -import android.preference.Preference -import android.preference.PreferenceFragment +import android.preference.* +import com.v2ray.ang.AngApplication import com.v2ray.ang.BuildConfig //import com.v2ray.ang.InappBuyActivity import com.v2ray.ang.R @@ -60,13 +58,19 @@ class SettingsActivity : BaseActivity() { class SettingsFragment : PreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener { val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference } + val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference } + val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference } val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference } - // val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference } - val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference } - val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference } + val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference } + val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference } - val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference } val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference } + val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference } + val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference } + val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference } + + // val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference } + // val socksPort by lazy { findPreference(PREF_SOCKS_PORT) as EditTextPreference } // val httpPort by lazy { findPreference(PREF_HTTP_PORT) as EditTextPreference } @@ -78,14 +82,95 @@ class SettingsActivity : BaseActivity() { // val tgGroup: Preference by lazy { findPreference(PREF_TG_GROUP) } val version: Preference by lazy { findPreference(PREF_VERSION) } + private fun restartProxy() { + Utils.stopVService(activity) + Utils.startVService(activity) + } + + private fun isRunning(): Boolean { + return Utils.isServiceRun(activity, "com.v2ray.ang.service.V2RayVpnService") + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) addPreferencesFromResource(R.xml.pref_settings) + var app = activity.application as AngApplication + + perAppProxy.setOnPreferenceClickListener { + if (isRunning()) { + Utils.stopVService(activity) + } + startActivity() + perAppProxy.isChecked = true + true + } + sppedEnabled.setOnPreferenceClickListener { + if (isRunning()) + restartProxy() + true + } + sniffingEnabled.setOnPreferenceClickListener { + if (isRunning()) + restartProxy() + true + } + + proxySharing.setOnPreferenceClickListener { + if (proxySharing.isChecked) + toast(R.string.toast_warning_pref_proxysharing) + if (isRunning()) + restartProxy() + true + } + + domainStrategy.setOnPreferenceChangeListener { _, _ -> + if (isRunning()) + restartProxy() + true + } + routingMode.setOnPreferenceChangeListener { _, _ -> + if (isRunning()) + restartProxy() + true + } routingCustom.onClick { + if (isRunning()) + Utils.stopVService(activity) startActivity() } + forwardIpv6.setOnPreferenceClickListener { + if (isRunning()) + restartProxy() + true + } + + enableLocalDns.setOnPreferenceClickListener { + if (isRunning()) + restartProxy() + true + } + + + domesticDns.setOnPreferenceChangeListener { preference, any -> + // domesticDns.summary = any as String + val nval = any as String + domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval + if (isRunning()) + restartProxy() + true + } + + remoteDns.setOnPreferenceChangeListener { preference, any -> + // remoteDns.summary = any as String + val nval = any as String + remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval + if (isRunning()) + restartProxy() + true + } + // donate.onClick { // startActivity() // } @@ -112,32 +197,7 @@ class SettingsActivity : BaseActivity() { // } // } - perAppProxy.setOnPreferenceClickListener { - startActivity() - perAppProxy.isChecked = true - false - } - proxySharing.setOnPreferenceClickListener { - if (proxySharing.isChecked) - toast(R.string.toast_warning_pref_proxysharing) - false - } - - - - remoteDns.setOnPreferenceChangeListener { preference, any -> - // remoteDns.summary = any as String - val nval = any as String - remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval - true - } - domesticDns.setOnPreferenceChangeListener { preference, any -> - // domesticDns.summary = any as String - val nval = any as String - domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval - true - } // socksPort.setOnPreferenceChangeListener { preference, any -> // socksPort.summary = any as String // true diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt index b7cef52c..217e3573 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt @@ -147,13 +147,15 @@ object AngConfigManager { fun setActiveServer(index: Int): Int { try { if (index < 0 || index > angConfig.vmess.count() - 1) { + app.curIndex = -1 return -1 } angConfig.index = index - + app.curIndex = index storeConfigFile() } catch (e: Exception) { e.printStackTrace() + app.curIndex = -1 return -1 } return 0 diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt index 058b30eb..b986add4 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt @@ -340,6 +340,7 @@ object Utils { */ fun startVService(context: Context, guid: String): Boolean { val index = AngConfigManager.getIndexViaGuid(guid) + context.v2RayApplication.curIndex=index return startVService(context, index) }