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