From ff23bae671d871466f2502bc337f5ef9e7b66b2d Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sat, 21 Nov 2015 11:59:05 +0800 Subject: [PATCH] fix #424 --- .../com/github/shadowsocks/aidl/Config.java | 7 +++++- .../com/github/shadowsocks/BaseService.scala | 22 ++++++++++++++++++- .../shadowsocks/database/ProfileManager.scala | 10 ++++++--- .../shadowsocks/utils/ConfigUtils.scala | 6 +++-- .../shadowsocks/utils/TrafficMonitor.scala | 6 +++++ .../utils/TrafficMonitorThread.scala | 3 ++- 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/aidl/com/github/shadowsocks/aidl/Config.java b/src/main/aidl/com/github/shadowsocks/aidl/Config.java index 304d328d..13ec1ff8 100644 --- a/src/main/aidl/com/github/shadowsocks/aidl/Config.java +++ b/src/main/aidl/com/github/shadowsocks/aidl/Config.java @@ -22,6 +22,8 @@ public class Config implements Parcelable { public int remotePort = 1984; public int localPort = 1080; + public int profileId = 0; + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Config createFromParcel(Parcel in) { return new Config(in); @@ -34,7 +36,7 @@ public class Config implements Parcelable { public Config(boolean isProxyApps, boolean isBypassApps, boolean isUdpDns, boolean isAuth, boolean isIpv6, String profileName, String proxy, String sitekey, - String encMethod, String proxiedAppString, String route, int remotePort, int localPort) { + String encMethod, String proxiedAppString, String route, int remotePort, int localPort, int profileId) { this.isProxyApps = isProxyApps; this.isBypassApps = isBypassApps; this.isUdpDns = isUdpDns; @@ -48,6 +50,7 @@ public class Config implements Parcelable { this.route = route; this.remotePort = remotePort; this.localPort = localPort; + this.profileId = profileId; } private Config(Parcel in) { @@ -68,6 +71,7 @@ public class Config implements Parcelable { route = in.readString(); remotePort = in.readInt(); localPort = in.readInt(); + profileId = in.readInt(); } @Override public int describeContents() { @@ -88,5 +92,6 @@ public class Config implements Parcelable { out.writeString(route); out.writeInt(remotePort); out.writeInt(localPort); + out.writeInt(profileId); } } diff --git a/src/main/scala/com/github/shadowsocks/BaseService.scala b/src/main/scala/com/github/shadowsocks/BaseService.scala index f419351c..496ffbd0 100644 --- a/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -44,6 +44,9 @@ import java.util.{Timer, TimerTask} import android.app.Notification import android.content.Context import android.os.{Handler, RemoteCallbackList} +import android.util.Log + +import com.github.shadowsocks.database.{Profile, ProfileManager} import com.github.shadowsocks.aidl.{Config, IShadowsocksService, IShadowsocksServiceCallback} import com.github.shadowsocks.utils.{State, TrafficMonitor, TrafficMonitorThread} @@ -127,6 +130,23 @@ trait BaseService { } } + def updateTrafficTotal(tx: Long, rx: Long) { + val handler = new Handler(getContext.getMainLooper) + handler.post(() => { + if (config != null) { + ShadowsocksApplication.profileManager.getProfile(config.profileId) match { + case Some(profile) => { + profile.tx += tx; + profile.rx += rx; + Log.d("test", profile.tx + " " + profile.rx) + ShadowsocksApplication.profileManager.updateProfile(profile) + } + case None => // Ignore + } + } + }) + } + def clearChildProcessStream() def stopBackgroundService() def getServiceMode: Int @@ -143,7 +163,7 @@ trait BaseService { changeState(s, null) } - def updateTraffic(txRate: String, rxRate: String, txTotal: String, rxTotal: String) { + def updateTrafficRate(txRate: String, rxRate: String, txTotal: String, rxTotal: String) { val handler = new Handler(getContext.getMainLooper) handler.post(() => { if (callbackCount > 0) { diff --git a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala index b83fb597..bf01d1e3 100644 --- a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala +++ b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala @@ -79,7 +79,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { true } catch { case ex: Exception => - Log.e(Shadowsocks.TAG, "addProfile", ex) + Log.e(Shadowsocks.TAG, "updateProfile", ex) false } } @@ -149,9 +149,13 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { } private def loadFromPreferences: Profile = { - val profile = new Profile() - profile.id = settings.getInt(Key.profileId, -1) + val id = settings.getInt(Key.profileId, -1) + + val profile: Profile = getProfile(id) match { + case Some(p) => p + case _ => new Profile() + } profile.proxyApps = settings.getBoolean(Key.isProxyApps, false) profile.bypass = settings.getBoolean(Key.isBypassApps, false) diff --git a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala index a8cca796..b118b2c6 100644 --- a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala +++ b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala @@ -239,7 +239,7 @@ object ConfigUtils { val method = proxy(3).trim new Config(config.isProxyApps, config.isBypassApps, config.isUdpDns, config.isAuth, config.isIpv6, - config.profileName, host, password, method, config.proxiedAppString, config.route, port, config.localPort) + config.profileName, host, password, method, config.proxiedAppString, config.route, port, config.localPort, 0) } def load(settings: SharedPreferences): Config = { @@ -259,7 +259,9 @@ object ConfigUtils { val localPort = settings.getInt(Key.localPort, 1984) val proxiedAppString = settings.getString(Key.proxied, "") + val profileId = settings.getInt(Key.profileId, -1) + new Config(isProxyApps, isBypassApps, isUdpDns, isAuth, isIpv6, profileName, proxy, sitekey, encMethod, - proxiedAppString, route, remotePort, localPort) + proxiedAppString, route, remotePort, localPort, profileId) } } diff --git a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala index 38cb6216..9058c470 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala @@ -18,6 +18,10 @@ object TrafficMonitor { var txTotal: Long = 0 var rxTotal: Long = 0 + // Kilo bytes for the last query + var txLast: Long = 0 + var rxLast: Long = 0 + def getTraffic(tx: Long, rx: Long): Traffic = { new Traffic(tx, rx, System.currentTimeMillis()) } @@ -42,6 +46,8 @@ object TrafficMonitor { txRate = (now.tx - last.tx) * 1000 / delta rxRate = (now.rx - last.rx) * 1000 / delta } + txLast = now.tx - last.tx + rxLast = now.rx - last.rx txTotal += now.tx - last.tx rxTotal += now.rx - last.rx last = now diff --git a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala index b1c7ccb6..ca60eeb5 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala @@ -108,8 +108,9 @@ class TrafficMonitorThread(service: BaseService) extends Thread { val stat = new String(array, "UTF-8").split("\\|") if (stat.length == 2) { TrafficMonitor.update(stat(0).toLong, stat(1).toLong) - service.updateTraffic(TrafficMonitor.getTxRate, TrafficMonitor.getRxRate, + service.updateTrafficRate(TrafficMonitor.getTxRate, TrafficMonitor.getRxRate, TrafficMonitor.getTxTotal, TrafficMonitor.getRxTotal) + service.updateTrafficTotal(TrafficMonitor.txLast, TrafficMonitor.rxLast) } output.write(0)