Commit bf1961aa authored by Mygod's avatar Mygod

Request bandwidth update on switching tab

parent 7d5197e2
...@@ -84,10 +84,9 @@ class ShadowsocksConnection(private val handler: Handler = Handler(), ...@@ -84,10 +84,9 @@ class ShadowsocksConnection(private val handler: Handler = Handler(),
var bandwidthTimeout = 0L var bandwidthTimeout = 0L
set(value) { set(value) {
val service = service try {
if (bandwidthTimeout != value && service != null) try { if (value > 0) service?.startListeningForBandwidth(serviceCallback, value)
if (value > 0) service.startListeningForBandwidth(serviceCallback, value) else service?.stopListeningForBandwidth(serviceCallback)
else service.stopListeningForBandwidth(serviceCallback)
} catch (_: RemoteException) { } } catch (_: RemoteException) { }
field = value field = value
} }
......
...@@ -149,32 +149,29 @@ object BaseService { ...@@ -149,32 +149,29 @@ object BaseService {
override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback, timeout: Long) { override fun startListeningForBandwidth(cb: IShadowsocksServiceCallback, timeout: Long) {
launch { launch {
val wasEmpty = bandwidthListeners.isEmpty() if (bandwidthListeners.isEmpty() and (bandwidthListeners.put(cb.asBinder(), timeout) == null)) {
if (bandwidthListeners.put(cb.asBinder(), timeout) == null) { check(looper == null)
if (wasEmpty) { looper = launch { loop() }
check(looper == null) }
looper = launch { loop() } if (data?.state != State.Connected) return@launch
} var sum = TrafficStats()
if (data?.state != State.Connected) return@launch val data = data
var sum = TrafficStats() val proxy = data?.proxy ?: return@launch
val data = data proxy.trafficMonitor?.out.also { stats ->
val proxy = data?.proxy ?: return@launch cb.trafficUpdated(proxy.profile.id, if (stats == null) sum else {
proxy.trafficMonitor?.out.also { stats -> sum += stats
cb.trafficUpdated(proxy.profile.id, if (stats == null) sum else { stats
})
}
data.udpFallback?.also { udpFallback ->
udpFallback.trafficMonitor?.out.also { stats ->
cb.trafficUpdated(udpFallback.profile.id, if (stats == null) TrafficStats() else {
sum += stats sum += stats
stats stats
}) })
} }
data.udpFallback?.also { udpFallback ->
udpFallback.trafficMonitor?.out.also { stats ->
cb.trafficUpdated(udpFallback.profile.id, if (stats == null) TrafficStats() else {
sum += stats
stats
})
}
}
cb.trafficUpdated(0, sum)
} }
cb.trafficUpdated(0, sum)
} }
} }
......
...@@ -101,7 +101,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -101,7 +101,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
if (profileId == 0L) this@MainActivity.stats.updateTraffic( if (profileId == 0L) this@MainActivity.stats.updateTraffic(
stats.txRate, stats.rxRate, stats.txTotal, stats.rxTotal) stats.txRate, stats.rxRate, stats.txTotal, stats.rxTotal)
if (state != BaseService.State.Stopping) { if (state != BaseService.State.Stopping) {
(supportFragmentManager.findFragmentById(R.id.fragment_holder) as? ToolbarFragment) (supportFragmentManager.findFragmentById(R.id.fragment_holder) as? ProfilesFragment)
?.onTrafficUpdated(profileId, stats) ?.onTrafficUpdated(profileId, stats)
} }
} }
...@@ -201,7 +201,10 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -201,7 +201,10 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
override fun onNavigationItemSelected(item: MenuItem): Boolean { override fun onNavigationItemSelected(item: MenuItem): Boolean {
if (item.isChecked) drawer.closeDrawers() else { if (item.isChecked) drawer.closeDrawers() else {
when (item.itemId) { when (item.itemId) {
R.id.profiles -> displayFragment(ProfilesFragment()) R.id.profiles -> {
displayFragment(ProfilesFragment())
connection.bandwidthTimeout = connection.bandwidthTimeout // request stats update
}
R.id.globalSettings -> displayFragment(GlobalSettingsFragment()) R.id.globalSettings -> displayFragment(GlobalSettingsFragment())
R.id.about -> { R.id.about -> {
Core.analytics.logEvent("about", Bundle()) Core.analytics.logEvent("about", Bundle())
......
...@@ -461,7 +461,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { ...@@ -461,7 +461,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
} }
} }
override fun onTrafficUpdated(profileId: Long, stats: TrafficStats) { fun onTrafficUpdated(profileId: Long, stats: TrafficStats) {
if (profileId != 0L) { // ignore aggregate stats if (profileId != 0L) { // ignore aggregate stats
statsCache.put(profileId, stats) statsCache.put(profileId, stats)
profilesAdapter.refreshId(profileId) profilesAdapter.refreshId(profileId)
......
...@@ -25,7 +25,6 @@ import android.view.View ...@@ -25,7 +25,6 @@ import android.view.View
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat import androidx.core.view.GravityCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.github.shadowsocks.aidl.TrafficStats
/** /**
* @author Mygod * @author Mygod
...@@ -40,7 +39,5 @@ open class ToolbarFragment : Fragment() { ...@@ -40,7 +39,5 @@ open class ToolbarFragment : Fragment() {
toolbar.setNavigationOnClickListener { (activity as MainActivity).drawer.openDrawer(GravityCompat.START) } toolbar.setNavigationOnClickListener { (activity as MainActivity).drawer.openDrawer(GravityCompat.START) }
} }
open fun onTrafficUpdated(profileId: Long, stats: TrafficStats) { }
open fun onBackPressed(): Boolean = false open fun onBackPressed(): Boolean = false
} }
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