Skip to content

Commit 4d0e9e2

Browse files
author
Annoymous contributor
committed
Bugfix: When a setting is changed proxy will now auto restart to apply the change. Fix proxy service cannot be stopped bug.
1 parent 5cba8a2 commit 4d0e9e2

File tree

5 files changed

+106
-36
lines changed

5 files changed

+106
-36
lines changed

V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class AngApplication : Application() {
1111
const val PREF_LAST_VERSION = "pref_last_version"
1212
}
1313

14+
var curIndex = -1 //Current proxy that is opened. (Used to implement restart feature)
1415
var firstRun = false
1516
private set
1617

V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt

+8-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ class V2RayVpnService : VpnService() {
6464
private var mNotificationManager: NotificationManager? = null
6565

6666

67-
6867
/**
6968
* Unfortunately registerDefaultNetworkCallback is going to return our VPN interface: https://android.googlesource.com/platform/frameworks/base/+/dda156ab0c5d66ad82bdcf76cda07cbc0a9c8a2e
7069
*
@@ -282,12 +281,19 @@ class V2RayVpnService : VpnService() {
282281
unregisterReceiver(mMsgReceive)
283282
} catch (e: Exception) {
284283
}
284+
285+
//stopSelf has to be called ahead of mInterface.close(). otherwise v2ray core cannot be stooped
286+
//It's strage but true.
287+
//This can be verified by putting stopself() behind and call stopLoop and startLoop
288+
//in a row for several times. You will find that later created v2ray core report port in use
289+
//which means the first v2ray core somehow failed to stop and release the port.
290+
stopSelf()
291+
285292
try {
286293
mInterface.close()
287294
} catch (ignored: Exception) {
288295
}
289296

290-
stopSelf()
291297
}
292298
}
293299

V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt

+93-33
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import android.content.Intent
44
import android.content.SharedPreferences
55
import android.net.Uri
66
import android.os.Bundle
7-
import android.preference.CheckBoxPreference
8-
import android.preference.EditTextPreference
9-
import android.preference.Preference
10-
import android.preference.PreferenceFragment
7+
import android.preference.*
8+
import com.v2ray.ang.AngApplication
119
import com.v2ray.ang.BuildConfig
1210
//import com.v2ray.ang.InappBuyActivity
1311
import com.v2ray.ang.R
@@ -60,13 +58,19 @@ class SettingsActivity : BaseActivity() {
6058

6159
class SettingsFragment : PreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
6260
val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference }
61+
val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference }
62+
val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference }
6363
val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference }
64-
// val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference }
65-
val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
66-
val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
64+
val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference }
65+
val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference }
6766

68-
val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
6967
val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference }
68+
val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
69+
val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
70+
val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
71+
72+
// val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference }
73+
7074

7175
// val socksPort by lazy { findPreference(PREF_SOCKS_PORT) as EditTextPreference }
7276
// val httpPort by lazy { findPreference(PREF_HTTP_PORT) as EditTextPreference }
@@ -78,14 +82,95 @@ class SettingsActivity : BaseActivity() {
7882
// val tgGroup: Preference by lazy { findPreference(PREF_TG_GROUP) }
7983
val version: Preference by lazy { findPreference(PREF_VERSION) }
8084

85+
private fun restartProxy() {
86+
Utils.stopVService(activity)
87+
Utils.startVService(activity)
88+
}
89+
90+
private fun isRunning(): Boolean {
91+
return Utils.isServiceRun(activity, "com.v2ray.ang.service.V2RayVpnService")
92+
}
93+
8194
override fun onCreate(savedInstanceState: Bundle?) {
8295
super.onCreate(savedInstanceState)
8396
addPreferencesFromResource(R.xml.pref_settings)
97+
var app = activity.application as AngApplication
98+
99+
perAppProxy.setOnPreferenceClickListener {
100+
if (isRunning()) {
101+
Utils.stopVService(activity)
102+
}
103+
startActivity<PerAppProxyActivity>()
104+
perAppProxy.isChecked = true
105+
true
106+
}
107+
sppedEnabled.setOnPreferenceClickListener {
108+
if (isRunning())
109+
restartProxy()
110+
true
111+
}
112+
sniffingEnabled.setOnPreferenceClickListener {
113+
if (isRunning())
114+
restartProxy()
115+
true
116+
}
117+
118+
proxySharing.setOnPreferenceClickListener {
119+
if (proxySharing.isChecked)
120+
toast(R.string.toast_warning_pref_proxysharing)
121+
if (isRunning())
122+
restartProxy()
123+
true
124+
}
125+
126+
domainStrategy.setOnPreferenceChangeListener { _, _ ->
127+
if (isRunning())
128+
restartProxy()
129+
true
130+
}
131+
routingMode.setOnPreferenceChangeListener { _, _ ->
132+
if (isRunning())
133+
restartProxy()
134+
true
135+
}
84136

85137
routingCustom.onClick {
138+
if (isRunning())
139+
Utils.stopVService(activity)
86140
startActivity<RoutingSettingsActivity>()
87141
}
88142

143+
forwardIpv6.setOnPreferenceClickListener {
144+
if (isRunning())
145+
restartProxy()
146+
true
147+
}
148+
149+
enableLocalDns.setOnPreferenceClickListener {
150+
if (isRunning())
151+
restartProxy()
152+
true
153+
}
154+
155+
156+
domesticDns.setOnPreferenceChangeListener { preference, any ->
157+
// domesticDns.summary = any as String
158+
val nval = any as String
159+
domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval
160+
if (isRunning())
161+
restartProxy()
162+
true
163+
}
164+
165+
remoteDns.setOnPreferenceChangeListener { preference, any ->
166+
// remoteDns.summary = any as String
167+
val nval = any as String
168+
remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval
169+
if (isRunning())
170+
restartProxy()
171+
true
172+
}
173+
89174
// donate.onClick {
90175
// startActivity<InappBuyActivity>()
91176
// }
@@ -112,32 +197,7 @@ class SettingsActivity : BaseActivity() {
112197
// }
113198
// }
114199

115-
perAppProxy.setOnPreferenceClickListener {
116-
startActivity<PerAppProxyActivity>()
117-
perAppProxy.isChecked = true
118-
false
119-
}
120200

121-
proxySharing.setOnPreferenceClickListener {
122-
if (proxySharing.isChecked)
123-
toast(R.string.toast_warning_pref_proxysharing)
124-
false
125-
}
126-
127-
128-
129-
remoteDns.setOnPreferenceChangeListener { preference, any ->
130-
// remoteDns.summary = any as String
131-
val nval = any as String
132-
remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval
133-
true
134-
}
135-
domesticDns.setOnPreferenceChangeListener { preference, any ->
136-
// domesticDns.summary = any as String
137-
val nval = any as String
138-
domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval
139-
true
140-
}
141201
// socksPort.setOnPreferenceChangeListener { preference, any ->
142202
// socksPort.summary = any as String
143203
// true

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,15 @@ object AngConfigManager {
147147
fun setActiveServer(index: Int): Int {
148148
try {
149149
if (index < 0 || index > angConfig.vmess.count() - 1) {
150+
app.curIndex = -1
150151
return -1
151152
}
152153
angConfig.index = index
153-
154+
app.curIndex = index
154155
storeConfigFile()
155156
} catch (e: Exception) {
156157
e.printStackTrace()
158+
app.curIndex = -1
157159
return -1
158160
}
159161
return 0

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt

+1
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ object Utils {
340340
*/
341341
fun startVService(context: Context, guid: String): Boolean {
342342
val index = AngConfigManager.getIndexViaGuid(guid)
343+
context.v2RayApplication.curIndex=index
343344
return startVService(context, index)
344345
}
345346

0 commit comments

Comments
 (0)