Commit 075225db authored by Mygod's avatar Mygod

Remove handler from Core

parent b4d003f0
...@@ -32,8 +32,6 @@ import android.content.IntentFilter ...@@ -32,8 +32,6 @@ import android.content.IntentFilter
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.Handler
import android.os.Looper
import android.os.UserManager import android.os.UserManager
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
...@@ -51,8 +49,6 @@ import com.github.shadowsocks.utils.* ...@@ -51,8 +49,6 @@ import com.github.shadowsocks.utils.*
import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseApp
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import io.fabric.sdk.android.Fabric import io.fabric.sdk.android.Fabric
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import kotlin.reflect.KClass import kotlin.reflect.KClass
...@@ -62,7 +58,6 @@ object Core { ...@@ -62,7 +58,6 @@ object Core {
lateinit var app: Application lateinit var app: Application
lateinit var configureIntent: (Context) -> PendingIntent lateinit var configureIntent: (Context) -> PendingIntent
val handler by lazy { Handler(Looper.getMainLooper()) }
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) } val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) } val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }
val analytics: FirebaseAnalytics by lazy { FirebaseAnalytics.getInstance(deviceStorage) } val analytics: FirebaseAnalytics by lazy { FirebaseAnalytics.getInstance(deviceStorage) }
......
...@@ -25,9 +25,9 @@ import android.content.Context ...@@ -25,9 +25,9 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.ServiceConnection import android.content.ServiceConnection
import android.os.DeadObjectException import android.os.DeadObjectException
import android.os.Handler
import android.os.IBinder import android.os.IBinder
import android.os.RemoteException import android.os.RemoteException
import com.github.shadowsocks.Core
import com.github.shadowsocks.bg.ProxyService import com.github.shadowsocks.bg.ProxyService
import com.github.shadowsocks.bg.TransproxyService import com.github.shadowsocks.bg.TransproxyService
import com.github.shadowsocks.bg.VpnService import com.github.shadowsocks.bg.VpnService
...@@ -38,7 +38,8 @@ import com.github.shadowsocks.utils.Key ...@@ -38,7 +38,8 @@ import com.github.shadowsocks.utils.Key
/** /**
* This object should be compact as it will not get GC-ed. * This object should be compact as it will not get GC-ed.
*/ */
class ShadowsocksConnection(private var listenForDeath: Boolean = false) : ServiceConnection, IBinder.DeathRecipient { class ShadowsocksConnection(private val handler: Handler = Handler(), private var listenForDeath: Boolean = false) :
ServiceConnection, IBinder.DeathRecipient {
companion object { companion object {
val serviceClass get() = when (DataStore.serviceMode) { val serviceClass get() = when (DataStore.serviceMode) {
Key.modeProxy -> ProxyService::class Key.modeProxy -> ProxyService::class
...@@ -66,13 +67,13 @@ class ShadowsocksConnection(private var listenForDeath: Boolean = false) : Servi ...@@ -66,13 +67,13 @@ class ShadowsocksConnection(private var listenForDeath: Boolean = false) : Servi
private var callback: Callback? = null private var callback: Callback? = null
private val serviceCallback = object : IShadowsocksServiceCallback.Stub() { private val serviceCallback = object : IShadowsocksServiceCallback.Stub() {
override fun stateChanged(state: Int, profileName: String?, msg: String?) { override fun stateChanged(state: Int, profileName: String?, msg: String?) {
Core.handler.post { callback!!.stateChanged(state, profileName, msg) } handler.post { callback!!.stateChanged(state, profileName, msg) }
} }
override fun trafficUpdated(profileId: Long, stats: TrafficStats) { override fun trafficUpdated(profileId: Long, stats: TrafficStats) {
Core.handler.post { callback!!.trafficUpdated(profileId, stats) } handler.post { callback!!.trafficUpdated(profileId, stats) }
} }
override fun trafficPersisted(profileId: Long) { override fun trafficPersisted(profileId: Long) {
Core.handler.post { callback!!.trafficPersisted(profileId) } handler.post { callback!!.trafficPersisted(profileId) }
} }
} }
private var binder: IBinder? = null private var binder: IBinder? = null
...@@ -110,7 +111,7 @@ class ShadowsocksConnection(private var listenForDeath: Boolean = false) : Servi ...@@ -110,7 +111,7 @@ class ShadowsocksConnection(private var listenForDeath: Boolean = false) : Servi
override fun binderDied() { override fun binderDied() {
service = null service = null
callback!!.onBinderDied() handler.post(callback!!::onBinderDied)
} }
private fun unregisterCallback() { private fun unregisterCallback() {
......
...@@ -92,6 +92,7 @@ object BaseService { ...@@ -92,6 +92,7 @@ object BaseService {
class Binder(private var data: Data? = null) : IShadowsocksService.Stub(), AutoCloseable { class Binder(private var data: Data? = null) : IShadowsocksService.Stub(), AutoCloseable {
val callbacks = RemoteCallbackList<IShadowsocksServiceCallback>() val callbacks = RemoteCallbackList<IShadowsocksServiceCallback>()
private val bandwidthListeners = HashSet<IBinder>() // the binder is the real identifier private val bandwidthListeners = HashSet<IBinder>() // the binder is the real identifier
private val handler = Handler()
override fun getState(): Int = data!!.state override fun getState(): Int = data!!.state
override fun getProfileName(): String = data!!.proxy?.profile?.name ?: "Idle" override fun getProfileName(): String = data!!.proxy?.profile?.name ?: "Idle"
...@@ -111,8 +112,7 @@ object BaseService { ...@@ -111,8 +112,7 @@ object BaseService {
callbacks.finishBroadcast() callbacks.finishBroadcast()
} }
private fun registerTimeout() = private fun registerTimeout() = handler.postDelayed(this::onTimeout, 1000)
Core.handler.postAtTime(this::onTimeout, this, SystemClock.uptimeMillis() + 1000)
private fun onTimeout() { private fun onTimeout() {
val proxies = listOfNotNull(data!!.proxy, data!!.udpFallback) val proxies = listOfNotNull(data!!.proxy, data!!.udpFallback)
val stats = proxies val stats = proxies
...@@ -158,7 +158,7 @@ object BaseService { ...@@ -158,7 +158,7 @@ object BaseService {
override fun stopListeningForBandwidth(cb: IShadowsocksServiceCallback) { override fun stopListeningForBandwidth(cb: IShadowsocksServiceCallback) {
if (bandwidthListeners.remove(cb.asBinder()) && bandwidthListeners.isEmpty()) { if (bandwidthListeners.remove(cb.asBinder()) && bandwidthListeners.isEmpty()) {
Core.handler.removeCallbacksAndMessages(this) handler.removeCallbacksAndMessages(null)
} }
} }
...@@ -180,7 +180,7 @@ object BaseService { ...@@ -180,7 +180,7 @@ object BaseService {
override fun close() { override fun close() {
callbacks.kill() callbacks.kill()
Core.handler.removeCallbacksAndMessages(this) handler.removeCallbacksAndMessages(null)
data = null data = null
} }
} }
......
...@@ -29,6 +29,7 @@ import android.nfc.NdefMessage ...@@ -29,6 +29,7 @@ import android.nfc.NdefMessage
import android.nfc.NfcAdapter import android.nfc.NfcAdapter
import android.os.Bundle import android.os.Bundle
import android.os.DeadObjectException import android.os.DeadObjectException
import android.os.Handler
import android.util.Log import android.util.Log
import android.view.KeyCharacterMap import android.view.KeyCharacterMap
import android.view.KeyEvent import android.view.KeyEvent
...@@ -124,7 +125,8 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -124,7 +125,8 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
else -> Core.startService() else -> Core.startService()
} }
private val connection = ShadowsocksConnection(true) private val handler = Handler()
private val connection = ShadowsocksConnection(handler, true)
override fun onServiceConnected(service: IShadowsocksService) = changeState(try { override fun onServiceConnected(service: IShadowsocksService) = changeState(try {
service.state service.state
} catch (_: DeadObjectException) { } catch (_: DeadObjectException) {
...@@ -132,12 +134,10 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -132,12 +134,10 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
}) })
override fun onServiceDisconnected() = changeState(BaseService.IDLE) override fun onServiceDisconnected() = changeState(BaseService.IDLE)
override fun onBinderDied() { override fun onBinderDied() {
Core.handler.post {
connection.disconnect(this) connection.disconnect(this)
Executable.killAll() Executable.killAll()
connection.connect(this, this) connection.connect(this, this)
} }
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when { when {
...@@ -167,7 +167,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -167,7 +167,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
fab.setOnClickListener { toggle() } fab.setOnClickListener { toggle() }
changeState(BaseService.IDLE) // reset everything to init state changeState(BaseService.IDLE) // reset everything to init state
Core.handler.post { connection.connect(this, this) } connection.connect(this, this)
DataStore.publicStore.registerChangeListener(this) DataStore.publicStore.registerChangeListener(this)
val intent = this.intent val intent = this.intent
...@@ -205,7 +205,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -205,7 +205,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) { override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) {
when (key) { when (key) {
Key.serviceMode -> Core.handler.post { Key.serviceMode -> handler.post {
connection.disconnect(this) connection.disconnect(this)
connection.connect(this, this) connection.connect(this, this)
} }
...@@ -280,6 +280,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -280,6 +280,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
DataStore.publicStore.unregisterChangeListener(this) DataStore.publicStore.unregisterChangeListener(this)
connection.disconnect(this) connection.disconnect(this)
BackupManager(this).dataChanged() BackupManager(this).dataChanged()
Core.handler.removeCallbacksAndMessages(null) handler.removeCallbacksAndMessages(null)
} }
} }
...@@ -27,6 +27,7 @@ import android.content.Intent ...@@ -27,6 +27,7 @@ import android.content.Intent
import android.net.VpnService import android.net.VpnService
import android.os.Bundle import android.os.Bundle
import android.os.DeadObjectException import android.os.DeadObjectException
import android.os.Handler
import android.text.format.Formatter import android.text.format.Formatter
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
...@@ -135,7 +136,8 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti ...@@ -135,7 +136,8 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti
} }
} }
private val connection = ShadowsocksConnection(true) private val handler = Handler()
private val connection = ShadowsocksConnection(handler, true)
override fun onServiceConnected(service: IShadowsocksService) = changeState(try { override fun onServiceConnected(service: IShadowsocksService) = changeState(try {
service.state service.state
} catch (_: DeadObjectException) { } catch (_: DeadObjectException) {
...@@ -143,12 +145,10 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti ...@@ -143,12 +145,10 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti
}) })
override fun onServiceDisconnected() = changeState(BaseService.IDLE) override fun onServiceDisconnected() = changeState(BaseService.IDLE)
override fun onBinderDied() { override fun onBinderDied() {
Core.handler.post {
connection.disconnect(activity) connection.disconnect(activity)
Executable.killAll() Executable.killAll()
connection.connect(activity, this) connection.connect(activity, this)
} }
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
preferenceManager.preferenceDataStore = DataStore.publicStore preferenceManager.preferenceDataStore = DataStore.publicStore
...@@ -232,7 +232,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti ...@@ -232,7 +232,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragment(), ShadowsocksConnecti
override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) { override fun onPreferenceDataStoreChanged(store: PreferenceDataStore, key: String?) {
when (key) { when (key) {
Key.serviceMode -> Core.handler.post { Key.serviceMode -> handler.post {
connection.disconnect(activity) connection.disconnect(activity)
connection.connect(activity, this) connection.connect(activity, this)
} }
......
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