Commit 9d863967 authored by Mygod's avatar Mygod

Post bandwidth updates more frequently in the forground

500ms matches the value for YouTube stats for nerds, and 120bpm is generally more exciting to look at than 60bpm.
parent 44c5180d
......@@ -7,7 +7,7 @@ interface IShadowsocksService {
String getProfileName();
void registerCallback(in IShadowsocksServiceCallback cb);
void startListeningForBandwidth(in IShadowsocksServiceCallback cb);
void startListeningForBandwidth(in IShadowsocksServiceCallback cb, long timeout);
oneway void stopListeningForBandwidth(in IShadowsocksServiceCallback cb);
oneway void unregisterCallback(in IShadowsocksServiceCallback cb);
}
......@@ -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 val handler: Handler = Handler(), private var listenForDeath: Boolean = false) :
class ShadowsocksConnection(private val handler: Handler = Handler(),
private var listenForDeath: Boolean = false) :
ServiceConnection, IBinder.DeathRecipient {
companion object {
val serviceClass get() = when (DataStore.serviceMode) {
......@@ -78,11 +79,11 @@ class ShadowsocksConnection(private val handler: Handler = Handler(), private va
}
private var binder: IBinder? = null
var listeningForBandwidth = false
var bandwidthTimeout = 0L
set(value) {
val service = service
if (listeningForBandwidth != value && service != null)
if (value) service.startListeningForBandwidth(serviceCallback) else try {
if (bandwidthTimeout != value && service != null)
if (value > 0) service.startListeningForBandwidth(serviceCallback, value) else try {
service.stopListeningForBandwidth(serviceCallback)
} catch (_: DeadObjectException) { }
field = value
......@@ -97,7 +98,7 @@ class ShadowsocksConnection(private val handler: Handler = Handler(), private va
if (!callbackRegistered) try {
service.registerCallback(serviceCallback)
callbackRegistered = true
if (listeningForBandwidth) service.startListeningForBandwidth(serviceCallback)
if (bandwidthTimeout > 0) service.startListeningForBandwidth(serviceCallback, bandwidthTimeout)
} catch (_: RemoteException) { }
callback!!.onServiceConnected(service)
}
......
......@@ -94,7 +94,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 bandwidthListeners = mutableMapOf<IBinder, Long>() // the binder is the real identifier
private val handler = Handler()
override fun getState(): Int = data!!.state
......@@ -115,7 +115,9 @@ object BaseService {
callbacks.finishBroadcast()
}
private fun registerTimeout() = handler.postDelayed(this::onTimeout, 1000)
private fun registerTimeout() {
handler.postDelayed(this::onTimeout, bandwidthListeners.values.min() ?: return)
}
private fun onTimeout() {
val proxies = listOfNotNull(data!!.proxy, data!!.udpFallback)
val stats = proxies
......@@ -134,9 +136,9 @@ object BaseService {
registerTimeout()
}
override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback) {
override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback, timeout: Long) {
val wasEmpty = bandwidthListeners.isEmpty()
if (bandwidthListeners.add(cb.asBinder())) {
if (bandwidthListeners.put(cb.asBinder(), timeout) == null) {
if (wasEmpty) registerTimeout()
if (state != CONNECTED) return
var sum = TrafficStats()
......@@ -160,7 +162,7 @@ object BaseService {
}
override fun stopListeningForBandwidth(cb: IShadowsocksServiceCallback) {
if (bandwidthListeners.remove(cb.asBinder()) && bandwidthListeners.isEmpty()) {
if (bandwidthListeners.remove(cb.asBinder()) != null && bandwidthListeners.isEmpty()) {
handler.removeCallbacksAndMessages(null)
}
}
......
......@@ -102,7 +102,7 @@ class ServiceNotification(private val service: BaseService.Interface, profileNam
Intent.ACTION_SCREEN_ON -> {
setVisible(visible && !keyGuard.isKeyguardLocked, forceShow)
service.data.binder.registerCallback(callback)
service.data.binder.startListeningForBandwidth(callback)
service.data.binder.startListeningForBandwidth(callback, 1000)
callbackRegistered = true
}
Intent.ACTION_USER_PRESENT -> setVisible(true, forceShow)
......
......@@ -238,7 +238,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
override fun onStart() {
super.onStart()
connection.listeningForBandwidth = true
connection.bandwidthTimeout = 500
}
override fun onBackPressed() {
......@@ -269,7 +269,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
}
override fun onStop() {
connection.listeningForBandwidth = false
connection.bandwidthTimeout = 0
super.onStop()
}
......
......@@ -209,7 +209,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
override fun onStart() {
super.onStart()
connection.listeningForBandwidth = true
connection.bandwidthTimeout = 500
}
override fun onResume() {
......@@ -247,7 +247,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
}
override fun onStop() {
connection.listeningForBandwidth = false
connection.bandwidthTimeout = 0
super.onStop()
}
......
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