Commit 04c86a53 authored by Max Lv's avatar Max Lv

Merge pull request #502 from Mygod/master

Fix dynamic traffic stat in profile selector
parents 5ddd8a16 f9667d76
...@@ -2,6 +2,5 @@ package com.github.shadowsocks.aidl; ...@@ -2,6 +2,5 @@ package com.github.shadowsocks.aidl;
interface IShadowsocksServiceCallback { interface IShadowsocksServiceCallback {
oneway void stateChanged(int state, String msg); oneway void stateChanged(int state, String msg);
oneway void trafficUpdated(String txRate, String rxRate, oneway void trafficUpdated(long txRate, long rxRate, long txTotal, long rxTotal);
String txTotal, String rxTotal);
} }
...@@ -90,8 +90,7 @@ trait BaseService extends Service { ...@@ -90,8 +90,7 @@ trait BaseService extends Service {
timer.schedule(task, 1000, 1000) timer.schedule(task, 1000, 1000)
} }
TrafficMonitor.updateRate() TrafficMonitor.updateRate()
cb.trafficUpdated(TrafficMonitor.getTxRate, TrafficMonitor.getRxRate, cb.trafficUpdated(TrafficMonitor.txRate, TrafficMonitor.rxRate, TrafficMonitor.txTotal, TrafficMonitor.rxTotal)
TrafficMonitor.getTxTotal, TrafficMonitor.getRxTotal)
} }
} }
...@@ -162,10 +161,10 @@ trait BaseService extends Service { ...@@ -162,10 +161,10 @@ trait BaseService extends Service {
val handler = new Handler(getContext.getMainLooper) val handler = new Handler(getContext.getMainLooper)
handler.post(() => { handler.post(() => {
if (callbacksCount > 0) { if (callbacksCount > 0) {
val txRate = TrafficMonitor.getTxRate val txRate = TrafficMonitor.txRate
val rxRate = TrafficMonitor.getRxRate val rxRate = TrafficMonitor.rxRate
val txTotal = TrafficMonitor.getTxTotal val txTotal = TrafficMonitor.txTotal
val rxTotal = TrafficMonitor.getRxTotal val rxTotal = TrafficMonitor.rxTotal
val n = callbacks.beginBroadcast() val n = callbacks.beginBroadcast()
for (i <- 0 until n) { for (i <- 0 until n) {
try { try {
......
...@@ -61,17 +61,15 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe ...@@ -61,17 +61,15 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
}) })
} }
def updateText(refetch: Boolean = false) { def updateText(txTotal: Long = 0, rxTotal: Long = 0) {
val builder = new SpannableStringBuilder val builder = new SpannableStringBuilder
val item = if (refetch) ShadowsocksApplication.profileManager.getProfile(this.item.id) match { val tx = item.tx + txTotal
case Some(profile) => profile val rx = item.rx + rxTotal
case None => return
} else this.item
builder.append(item.name) builder.append(item.name)
if (item.tx != 0 || item.rx != 0) { if (tx != 0 || rx != 0) {
val start = builder.length val start = builder.length
builder.append(getString(R.string.stat_profiles, builder.append(getString(R.string.stat_profiles,
TrafficMonitor.formatTraffic(item.tx), TrafficMonitor.formatTraffic(item.rx))) TrafficMonitor.formatTraffic(tx), TrafficMonitor.formatTraffic(rx)))
builder.setSpan(new TextAppearanceSpan(ProfileManagerActivity.this, android.R.style.TextAppearance_Small), builder.setSpan(new TextAppearanceSpan(ProfileManagerActivity.this, android.R.style.TextAppearance_Small),
start + 1, builder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) start + 1, builder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
} }
...@@ -207,8 +205,8 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe ...@@ -207,8 +205,8 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
attachService(new IShadowsocksServiceCallback.Stub { attachService(new IShadowsocksServiceCallback.Stub {
def stateChanged(state: Int, msg: String) = () // ignore def stateChanged(state: Int, msg: String) = () // ignore
def trafficUpdated(txRate: String, rxRate: String, txTotal: String, rxTotal: String) = def trafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) =
if (selectedItem != null) selectedItem.updateText(true) if (selectedItem != null) selectedItem.updateText(txTotal, rxTotal)
}) })
if (ShadowsocksApplication.settings.getBoolean(profileTip, true)) { if (ShadowsocksApplication.settings.getBoolean(profileTip, true)) {
......
...@@ -154,14 +154,15 @@ class Shadowsocks ...@@ -154,14 +154,15 @@ class Shadowsocks
state = s state = s
}) })
} }
def trafficUpdated(txRate: String, rxRate: String, txTotal: String, rxTotal: String) { def trafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) {
trafficCache = getString(R.string.stat_summary).formatLocal(Locale.ENGLISH, txRate, rxRate, txTotal, rxTotal) trafficCache = getString(R.string.stat_summary).formatLocal(Locale.ENGLISH,
TrafficMonitor.formatTraffic(txRate), TrafficMonitor.formatTraffic(rxRate),
TrafficMonitor.formatTraffic(txTotal), TrafficMonitor.formatTraffic(rxTotal))
handler.post(updateTraffic) handler.post(updateTraffic)
} }
} }
def updateTraffic(): Unit = if (trafficCache == null) callback.trafficUpdated(TrafficMonitor.getTxRate, def updateTraffic(): Unit = if (trafficCache == null) callback.trafficUpdated(0, 0, 0, 0) else {
TrafficMonitor.getRxRate, TrafficMonitor.getTxTotal, TrafficMonitor.getRxTotal) else {
if (connectionTestResult == null) connectionTestResult = getString(R.string.connection_test_pending) if (connectionTestResult == null) connectionTestResult = getString(R.string.connection_test_pending)
if (preferences.natSwitch.isChecked) { if (preferences.natSwitch.isChecked) {
preferences.stat.setSummary(trafficCache) preferences.stat.setSummary(trafficCache)
......
...@@ -9,20 +9,22 @@ import android.support.v4.app.NotificationCompat ...@@ -9,20 +9,22 @@ import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationCompat.BigTextStyle import android.support.v4.app.NotificationCompat.BigTextStyle
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import com.github.shadowsocks.aidl.IShadowsocksServiceCallback.Stub import com.github.shadowsocks.aidl.IShadowsocksServiceCallback.Stub
import com.github.shadowsocks.utils.{Action, State, Utils} import com.github.shadowsocks.utils.{TrafficMonitor, Action, State, Utils}
/** /**
* @author Mygod * @author Mygod
*/ */
class ShadowsocksNotification(private val service: BaseService, profileName: String, visible: Boolean = false) { class ShadowsocksNotification(private val service: BaseService, profileName: String, visible: Boolean = false) {
private lazy val keyGuard = service.getSystemService(Context.KEYGUARD_SERVICE).asInstanceOf[KeyguardManager] private val keyGuard = service.getSystemService(Context.KEYGUARD_SERVICE).asInstanceOf[KeyguardManager]
private lazy val nm = service.getSystemService(Context.NOTIFICATION_SERVICE).asInstanceOf[NotificationManager] private lazy val nm = service.getSystemService(Context.NOTIFICATION_SERVICE).asInstanceOf[NotificationManager]
private lazy val callback = new Stub { private lazy val callback = new Stub {
override def stateChanged(state: Int, msg: String) = () // ignore override def stateChanged(state: Int, msg: String) = () // ignore
override def trafficUpdated(txRate: String, rxRate: String, txTotal: String, rxTotal: String) { override def trafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long) {
builder.setContentText(service.getString(R.string.traffic_summary).formatLocal(Locale.ENGLISH, txRate, rxRate)) val txr = TrafficMonitor.formatTraffic(txRate)
style.bigText(service.getString(R.string.stat_summary) val rxr = TrafficMonitor.formatTraffic(rxRate)
.formatLocal(Locale.ENGLISH, txRate, rxRate, txTotal, rxTotal)) builder.setContentText(service.getString(R.string.traffic_summary).formatLocal(Locale.ENGLISH, txr, rxr))
style.bigText(service.getString(R.string.stat_summary).formatLocal(Locale.ENGLISH, txr, rxr,
TrafficMonitor.formatTraffic(txTotal), TrafficMonitor.formatTraffic(rxTotal)))
show() show()
} }
} }
......
...@@ -80,29 +80,5 @@ object TrafficMonitor { ...@@ -80,29 +80,5 @@ object TrafficMonitor {
rxLast = 0 rxLast = 0
dirty = true dirty = true
} }
def getTxTotal(): String = {
formatTraffic(txTotal)
}
def getRxTotal(): String = {
formatTraffic(rxTotal)
}
def getTotal(): String = {
formatTraffic(txTotal + rxTotal)
}
def getTxRate(): String = {
formatTraffic(txRate)
}
def getRxRate(): String = {
formatTraffic(rxRate)
}
def getRate(): String = {
formatTraffic(txRate + rxRate)
}
} }
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