Commit 075225db authored by Mygod's avatar Mygod

Remove handler from Core

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