From a21a4d24fa79516e79e1dbe2d0449dcdbc726e6c Mon Sep 17 00:00:00 2001 From: Max Lv Date: Mon, 24 Feb 2014 12:41:14 +0800 Subject: [PATCH] stop the service in time --- project/Build.scala | 4 ++-- .../com/github/shadowsocks/BaseService.scala | 15 +++++++++++++-- .../com/github/shadowsocks/Shadowsocks.scala | 5 +++++ .../shadowsocks/ShadowsocksNatService.scala | 10 ++++++++++ .../shadowsocks/ShadowsocksVpnService.scala | 14 ++++++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/project/Build.scala b/project/Build.scala index e8588bd6..3d6450d9 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -5,8 +5,8 @@ import sbtandroid._ import sbtandroid.AndroidPlugin._ object App { - val version = "2.1.0" - val versionCode = 61 + val version = "2.1.1" + val versionCode = 62 } object General { diff --git a/src/main/scala/com/github/shadowsocks/BaseService.scala b/src/main/scala/com/github/shadowsocks/BaseService.scala index abf3b8f2..38ea7636 100644 --- a/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -50,6 +50,7 @@ import android.content.Context trait BaseService { var state = State.INIT + var callbackCount = 0 final val callbacks = new RemoteCallbackList[IShadowsocksServiceCallback] @@ -63,11 +64,20 @@ trait BaseService { } override def unregisterCallback(cb: IShadowsocksServiceCallback) { - if (cb != null ) callbacks.unregister(cb) + if (cb != null ) { + callbacks.unregister(cb) + callbackCount -= 1 + } + if (callbackCount == 0 && state != State.CONNECTING && state != State.CONNECTED) { + stopBackgroundService() + } } override def registerCallback(cb: IShadowsocksServiceCallback) { - if (cb != null) callbacks.register(cb) + if (cb != null) { + callbacks.register(cb) + callbackCount += 1 + } } override def stop() { @@ -79,6 +89,7 @@ trait BaseService { } } + def stopBackgroundService() def startRunner(config: Config) def stopRunner() def getServiceMode: Int diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index bdac3c13..4baabaa0 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -326,6 +326,11 @@ class Shadowsocks override def onServiceDisconnected(name: ComponentName) { switchButton.setEnabled(false) + try { + bgService.unregisterCallback(callback) + } catch { + case ignored: RemoteException => // Nothing + } bgService = null } } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index 9d61d167..83359b08 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -526,6 +526,16 @@ class ShadowsocksNatService extends Service with BaseService { // reset NAT killProcesses() + + // stop the service if no callback registered + if (callbackCount == 0) { + stopSelf() + } + } + + override def stopBackgroundService() { + stopRunner() + stopSelf() } override def getTag = TAG diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index b88b840a..09695a52 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -252,6 +252,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { } + override def onRevoke() { + stopRunner() + } + def killProcesses() { val sb = new StringBuilder @@ -373,6 +377,16 @@ class ShadowsocksVpnService extends VpnService with BaseService { // reset notifications notificationManager.cancel(1) + + // stop the service if no callback registered + if (callbackCount == 0) { + stopSelf() + } + } + + override def stopBackgroundService() { + stopRunner() + stopSelf() } override def getTag = TAG