diff --git a/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt b/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt index 65895f72..1538b5cc 100644 --- a/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt +++ b/mobile/src/main/java/com/github/shadowsocks/bg/BaseService.kt @@ -91,10 +91,8 @@ object BaseService { } var closeReceiverRegistered = false - private fun state() = state - val binder = object : IShadowsocksService.Stub() { - override fun getState(): Int = state() + override fun getState(): Int = this@Data.state override fun getProfileName(): String = profile?.formattedName ?: "Idle" override fun registerCallback(cb: IShadowsocksServiceCallback) { @@ -182,6 +180,24 @@ object BaseService { } File(app.filesDir, "shadowsocks.json").bufferedWriter().use { it.write(config.toString()) } } + + val aclFile: File? get() { + val route = profile!!.route + return if (route == Acl.ALL) null else + Acl.getFile(if (route == Acl.CUSTOM_RULES) Acl.CUSTOM_RULES_FLATTENED else route) + } + + fun changeState(s: Int, msg: String? = null) { + if (state == s && msg == null) return + if (callbacks.registeredCallbackCount > 0) app.handler.post { + val n = callbacks.beginBroadcast() + for (i in 0 until n) try { + callbacks.getBroadcastItem(i).stateChanged(s, binder.profileName, msg) + } catch (_: Exception) { } // ignore + callbacks.finishBroadcast() + } + state = s + } } interface Interface { val tag: String @@ -221,7 +237,7 @@ object BaseService { "-t", "600", "-c", "shadowsocks.json")) - val acl = getAclFile() + val acl = data.aclFile if (acl != null) { cmd += "--acl" cmd += acl.absolutePath @@ -232,12 +248,6 @@ object BaseService { data.sslocalProcess = GuardedProcess(cmd).start() } - fun getAclFile(): File? { - val route = data.profile!!.route - return if (route == Acl.ALL) null else - Acl.getFile(if (route == Acl.CUSTOM_RULES) Acl.CUSTOM_RULES_FLATTENED else route) - } - fun createNotification(): ServiceNotification fun startRunner() { @@ -254,14 +264,14 @@ object BaseService { fun stopRunner(stopService: Boolean, msg: String? = null) { // channge the state - changeState(STOPPING) + val data = data + data.changeState(STOPPING) app.track(tag, "stop") killProcesses() // clean up recevier - val data = data this as Service if (data.closeReceiverRegistered) { unregisterReceiver(data.closeReceiver) @@ -279,7 +289,7 @@ object BaseService { data.trafficMonitorThread = null // change the state - changeState(STOPPED, msg) + data.changeState(STOPPED, msg) // stop the service if nothing has bound to it if (stopService) stopSelf() @@ -318,7 +328,7 @@ object BaseService { data.notification = createNotification() app.track(tag, "start") - changeState(CONNECTING) + data.changeState(CONNECTING) thread { this as Context @@ -369,7 +379,7 @@ object BaseService { if (profile.route !in arrayOf(Acl.ALL, Acl.CUSTOM_RULES)) AclSyncJob.schedule(profile.route) - changeState(CONNECTED) + data.changeState(CONNECTED) } catch (_: UnknownHostException) { stopRunner(true, getString(R.string.invalid_server)) } catch (_: VpnService.NullConnectionException) { @@ -381,19 +391,6 @@ object BaseService { } return Service.START_NOT_STICKY } - - fun changeState(s: Int, msg: String? = null) { - val data = instances[this]!! - if (data.state == s && msg == null) return - if (data.callbacks.registeredCallbackCount > 0) app.handler.post { - val n = data.callbacks.beginBroadcast() - for (i in 0 until n) try { - data.callbacks.getBroadcastItem(i).stateChanged(s, data.binder.profileName, msg) - } catch (_: Exception) { } // ignore - data.callbacks.finishBroadcast() - } - data.state = s - } } private val instances = WeakHashMap() diff --git a/mobile/src/main/java/com/github/shadowsocks/bg/LocalDnsService.kt b/mobile/src/main/java/com/github/shadowsocks/bg/LocalDnsService.kt index 5de7aabc..4500b838 100644 --- a/mobile/src/main/java/com/github/shadowsocks/bg/LocalDnsService.kt +++ b/mobile/src/main/java/com/github/shadowsocks/bg/LocalDnsService.kt @@ -44,6 +44,7 @@ object LocalDnsService { override fun startNativeProcesses() { super.startNativeProcesses() + val data = data val profile = data.profile!! fun makeDns(name: String, address: String, edns: Boolean = true): JSONObject { @@ -89,7 +90,7 @@ object LocalDnsService { .put("PrimaryDNS", localDns) .put("AlternativeDNS", remoteDns) .put("IPNetworkFile", "china_ip_list.txt") - .put("DomainFile", getAclFile()!!.absolutePath) + .put("DomainFile", data.aclFile!!.absolutePath) Acl.CHINALIST -> config .put("PrimaryDNS", localDns) .put("AlternativeDNS", remoteDns)