Commit 59d304ea authored by Max Lv's avatar Max Lv

fix the service toggle issue in VPN mode

parent ba8b5162
package com.github.shadowsocks package com.github.shadowsocks
import android.os.RemoteCallbackList import android.os.{Handler, RemoteCallbackList}
import com.github.shadowsocks.aidl.{Config, IShadowsocksService, IShadowsocksServiceCallback} import com.github.shadowsocks.aidl.{Config, IShadowsocksService, IShadowsocksServiceCallback}
import com.github.shadowsocks.utils.{Path, State} import com.github.shadowsocks.utils.{Path, State}
import java.io.{IOException, FileNotFoundException, FileReader, BufferedReader} import java.io.{IOException, FileNotFoundException, FileReader, BufferedReader}
import android.util.Log import android.util.Log
import android.app.Notification import android.app.Notification
import android.content.Context
trait BaseService { trait BaseService {
...@@ -43,12 +44,16 @@ trait BaseService { ...@@ -43,12 +44,16 @@ trait BaseService {
def stopRunner() def stopRunner()
def getServiceMode: Int def getServiceMode: Int
def getTag: String def getTag: String
def getContext: Context
def changeState(s: Int) { def changeState(s: Int) {
changeState(s, null) changeState(s, null)
} }
protected def changeState(s: Int, msg: String) { protected def changeState(s: Int, msg: String) {
val handler = new Handler(getContext.getMainLooper)
handler.post(new Runnable {
override def run() {
if (state != s) { if (state != s) {
val n = callbacks.beginBroadcast() val n = callbacks.beginBroadcast()
for (i <- 0 to n -1) { for (i <- 0 to n -1) {
...@@ -58,6 +63,8 @@ trait BaseService { ...@@ -58,6 +63,8 @@ trait BaseService {
state = s state = s
} }
} }
})
}
def getPid(name: String): Int = { def getPid(name: String): Int = {
try { try {
......
...@@ -324,24 +324,12 @@ class Shadowsocks ...@@ -324,24 +324,12 @@ class Shadowsocks
} }
} }
Crouton.cancelAllCroutons() Crouton.cancelAllCroutons()
onStateChanged(State.STOPPED, null)
setPreferenceEnabled(enabled = true) setPreferenceEnabled(enabled = true)
} else { } else {
if (bgService.getMode == Mode.VPN) {
val style = new Style.Builder().setBackgroundColorValue(Style.holoBlueLight).build()
val config = new Configuration.Builder().setDuration(Configuration.DURATION_LONG).build()
Crouton
.makeText(Shadowsocks.this, R.string.vpn_status, style)
.setConfiguration(config)
.show()
switchButton.setEnabled(false)
}
changeSwitch(checked = true) changeSwitch(checked = true)
onStateChanged(bgService.getState, null)
setPreferenceEnabled(enabled = false) setPreferenceEnabled(enabled = false)
} }
// set the listener state = bgService.getState
switchButton.setOnCheckedChangeListener(Shadowsocks.this)
} }
override def onServiceDisconnected(name: ComponentName) { override def onServiceDisconnected(name: ComponentName) {
...@@ -371,6 +359,7 @@ class Shadowsocks ...@@ -371,6 +359,7 @@ class Shadowsocks
} }
private def changeSwitch (checked: Boolean) { private def changeSwitch (checked: Boolean) {
switchButton.setOnCheckedChangeListener(null)
switchButton.setChecked(checked) switchButton.setChecked(checked)
if (switchButton.isEnabled) { if (switchButton.isEnabled) {
switchButton.setEnabled(false) switchButton.setEnabled(false)
...@@ -378,6 +367,7 @@ class Shadowsocks ...@@ -378,6 +367,7 @@ class Shadowsocks
override def run() { switchButton.setEnabled(true) } override def run() { switchButton.setEnabled(true) }
}, 1000) }, 1000)
} }
switchButton.setOnCheckedChangeListener(this)
} }
private def showProgress(msg: String): Handler = { private def showProgress(msg: String): Handler = {
...@@ -604,6 +594,16 @@ class Shadowsocks ...@@ -604,6 +594,16 @@ class Shadowsocks
// Register broadcast receiver // Register broadcast receiver
registerReceiver(preferenceReceiver, new IntentFilter(Action.UPDATE_PREFS)) registerReceiver(preferenceReceiver, new IntentFilter(Action.UPDATE_PREFS))
// Bind to the service
spawn {
val isRoot = Utils.getRoot
handler.post(new Runnable {
override def run() {
status.edit.putBoolean(Key.isRoot, isRoot).commit()
attachService()
}
})
}
} }
def attachService() { def attachService() {
...@@ -835,22 +835,25 @@ class Shadowsocks ...@@ -835,22 +835,25 @@ class Shadowsocks
protected override def onPause() { protected override def onPause() {
super.onPause() super.onPause()
deattachService() switchButton.setOnCheckedChangeListener(null)
prepared = false prepared = false
} }
protected override def onResume() { protected override def onResume() {
super.onResume() super.onResume()
// Bind to the service if (bgService != null) {
spawn { bgService.getState match {
val isRoot = Utils.getRoot case State.CONNECTED =>
handler.post(new Runnable { changeSwitch(checked = true)
override def run() { case State.CONNECTING =>
status.edit.putBoolean(Key.isRoot, isRoot).commit() changeSwitch(checked = true)
attachService() case _ =>
changeSwitch(checked = false)
} }
}) state = bgService.getState
} }
// set the listener
switchButton.setOnCheckedChangeListener(Shadowsocks.this)
ConfigUtils.refresh(this) ConfigUtils.refresh(this)
} }
...@@ -900,6 +903,7 @@ class Shadowsocks ...@@ -900,6 +903,7 @@ class Shadowsocks
override def onDestroy() { override def onDestroy() {
super.onDestroy() super.onDestroy()
deattachService()
Crouton.cancelAllCroutons() Crouton.cancelAllCroutons()
unregisterReceiver(preferenceReceiver) unregisterReceiver(preferenceReceiver)
new BackupManager(this).dataChanged() new BackupManager(this).dataChanged()
...@@ -917,7 +921,6 @@ class Shadowsocks ...@@ -917,7 +921,6 @@ class Shadowsocks
private def recovery() { private def recovery() {
val h = showProgress(getString(R.string.recovering)) val h = showProgress(getString(R.string.recovering))
serviceStop() serviceStop()
spawn { spawn {
reset() reset()
...@@ -1066,15 +1069,12 @@ class Shadowsocks ...@@ -1066,15 +1069,12 @@ class Shadowsocks
setPreferenceEnabled(enabled = false) setPreferenceEnabled(enabled = false)
case State.CONNECTED => case State.CONNECTED =>
clearDialog() clearDialog()
if (!switchButton.isChecked) changeSwitch(checked = true) changeSwitch(checked = true)
setPreferenceEnabled(enabled = false) setPreferenceEnabled(enabled = false)
case State.STOPPED => case State.STOPPED =>
clearDialog() clearDialog()
if (switchButton.isChecked) {
switchButton.setEnabled(true)
changeSwitch(checked = false) changeSwitch(checked = false)
Crouton.cancelAllCroutons() Crouton.cancelAllCroutons()
}
if (m != null) { if (m != null) {
Crouton.cancelAllCroutons() Crouton.cancelAllCroutons()
val style = new Style.Builder().setBackgroundColorValue(Style.holoRedLight).build() val style = new Style.Builder().setBackgroundColorValue(Style.holoRedLight).build()
......
...@@ -550,6 +550,6 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -550,6 +550,6 @@ class ShadowsocksNatService extends Service with BaseService {
} }
override def getTag = TAG override def getTag = TAG
override def getServiceMode = Mode.NAT override def getServiceMode = Mode.NAT
override def getContext = getBaseContext
} }
...@@ -399,5 +399,5 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -399,5 +399,5 @@ class ShadowsocksVpnService extends VpnService with BaseService {
override def getTag = TAG override def getTag = TAG
override def getServiceMode = Mode.VPN override def getServiceMode = Mode.VPN
override def getContext = getBaseContext
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment