From 0d2663c942d2c9aecb979b1315ec3a4085569c8b Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 19 Nov 2015 12:46:45 +0800 Subject: [PATCH 1/4] Remove unnecessary resets --- src/main/scala/com/github/shadowsocks/Shadowsocks.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index a93a2813..8898b0a6 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -472,8 +472,6 @@ class Shadowsocks def run() { if (state == State.CONNECTED) { TrafficMonitor.update() - } else { - TrafficMonitor.reset() } val trafficStat = getString(R.string.stat_summary).formatLocal(Locale.ENGLISH, TrafficMonitor.getTxRate, TrafficMonitor.getRxRate, From 99218238690317045d60b5471a786d7b4df377cc Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 19 Nov 2015 12:55:23 +0800 Subject: [PATCH 2/4] Fix units --- .../scala/com/github/shadowsocks/utils/TrafficMonitor.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala index 3236a026..dba79e84 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala @@ -43,8 +43,8 @@ object TrafficMonitor { val now = getTraffic val delta = now.timestamp - last.timestamp if (delta != 0) { - txRate = (now.tx - last.tx) / delta - rxRate = (now.rx - last.rx) / delta + txRate = (now.tx - last.tx) * 1000 / delta + rxRate = (now.rx - last.rx) * 1000 / delta } txTotal += now.tx - last.tx rxTotal += now.rx - last.rx From 24c1497a6d76d14cbc5d0e0f8430f9a5096e8b92 Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 19 Nov 2015 13:46:15 +0800 Subject: [PATCH 3/4] Fix flashing --- .../scala/com/github/shadowsocks/BaseService.scala | 8 +++----- .../scala/com/github/shadowsocks/Shadowsocks.scala | 10 ++++++---- .../com/github/shadowsocks/ShadowsocksNatService.scala | 8 ++++---- .../com/github/shadowsocks/ShadowsocksVpnService.scala | 8 ++++---- .../com/github/shadowsocks/utils/TrafficMonitor.scala | 2 +- .../shadowsocks/utils/TrafficMonitorThread.scala | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/BaseService.scala b/src/main/scala/com/github/shadowsocks/BaseService.scala index d2e27d4e..cf69d768 100644 --- a/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -39,8 +39,6 @@ package com.github.shadowsocks -import java.util.Locale - import android.app.Notification import android.content.Context import android.os.{Handler, RemoteCallbackList} @@ -96,7 +94,7 @@ trait BaseService { } def startRunner(config: Config) { - this.config = config; + this.config = config TrafficMonitor.reset() trafficMonitorThread = new TrafficMonitorThread(this) @@ -129,7 +127,7 @@ trait BaseService { handler.post(() => { if (callbackCount > 0) { val n = callbacks.beginBroadcast() - for (i <- 0 to n - 1) { + for (i <- 0 until n) { try { callbacks.getBroadcastItem(i).trafficUpdated(txRate, rxRate, txTotal, rxTotal) } catch { @@ -146,7 +144,7 @@ trait BaseService { handler.post(() => if (state != s) { if (callbackCount > 0) { val n = callbacks.beginBroadcast() - for (i <- 0 to n - 1) { + for (i <- 0 until n) { try { callbacks.getBroadcastItem(i).stateChanged(s, msg) } catch { diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index a6648ea7..4e361bd4 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -40,7 +40,7 @@ package com.github.shadowsocks import java.io.{FileOutputStream, IOException, InputStream, OutputStream} import java.util -import java.util.{Locale, Timer, TimerTask} +import java.util.Locale import android.app.backup.BackupManager import android.app.{Activity, ProgressDialog} @@ -55,7 +55,7 @@ import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar import android.util.Log -import android.view.{ViewGroup, View, ViewParent} +import android.view.{View, ViewGroup, ViewParent} import android.widget._ import com.github.jorgecastilloprz.FABProgressCircle import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback} @@ -73,8 +73,7 @@ object Typefaces { cache synchronized { if (!cache.containsKey(assetPath)) { try { - val t: Typeface = Typeface.createFromAsset(c.getAssets, assetPath) - cache.put(assetPath, t) + cache.put(assetPath, Typeface.createFromAsset(c.getAssets, assetPath)) } catch { case e: Exception => Log.e(TAG, "Could not get typeface '" + assetPath + "' because " + e.getMessage) @@ -471,6 +470,9 @@ class Shadowsocks // Check if current profile changed if (ShadowsocksApplication.profileId != currentProfile.id) reloadProfile() + + callback.trafficUpdated(TrafficMonitor.getTxRate, TrafficMonitor.getRxRate, + TrafficMonitor.getTxTotal, TrafficMonitor.getRxTotal) } private def setPreferenceEnabled(enabled: Boolean) { diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index f755c919..06c4a836 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -74,10 +74,10 @@ class ShadowsocksNatService extends Service with BaseService { var apps: Array[ProxiedApp] = null val myUid = Process.myUid() - var sslocalPid: Int = 0; - var sstunnelPid: Int = 0; - var redsocksPid: Int = 0; - var pdnsdPid: Int = 0; + var sslocalPid: Int = 0 + var sstunnelPid: Int = 0 + var redsocksPid: Int = 0 + var pdnsdPid: Int = 0 private val dnsAddressCache = new SparseArray[String] diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 4bb30450..34b76279 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -70,10 +70,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { var vpnThread: ShadowsocksVpnThread = null var closeReceiver: BroadcastReceiver = null - var sslocalPid: Int = 0; - var sstunnelPid: Int = 0; - var tun2socksPid: Int = 0; - var pdnsdPid: Int = 0; + var sslocalPid: Int = 0 + var sstunnelPid: Int = 0 + var tun2socksPid: Int = 0 + var pdnsdPid: Int = 0 def isByass(net: SubnetUtils): Boolean = { val info = net.getInfo diff --git a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala index 67d84b6d..38cb6216 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitor.scala @@ -1,6 +1,6 @@ package com.github.shadowsocks.utils -import java.lang.{Math, System} +import java.lang.System import java.text.DecimalFormat import com.github.shadowsocks.{R, ShadowsocksApplication} diff --git a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala index 31423355..b1c7ccb6 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TrafficMonitorThread.scala @@ -39,7 +39,7 @@ package com.github.shadowsocks.utils -import java.io.{File, FileDescriptor, IOException} +import java.io.{File, IOException} import java.util.concurrent.Executors import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress} From 81587b05516d2b16d196a334e1bfd6970497a9c5 Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 19 Nov 2015 14:33:10 +0800 Subject: [PATCH 4/4] Use AlertDialogs in support lib --- .../github/shadowsocks/ParserActivity.scala | 23 ++++++++----------- .../shadowsocks/ProfileManagerActivity.scala | 18 +++++++-------- .../shadowsocks/ShadowsocksSettings.scala | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/ParserActivity.scala b/src/main/scala/com/github/shadowsocks/ParserActivity.scala index f1265ccd..d1fcc697 100644 --- a/src/main/scala/com/github/shadowsocks/ParserActivity.scala +++ b/src/main/scala/com/github/shadowsocks/ParserActivity.scala @@ -39,15 +39,15 @@ package com.github.shadowsocks -import android.app.{Activity, AlertDialog} import android.content.DialogInterface import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.support.v7.app.{AppCompatActivity, AlertDialog} import android.view.WindowManager import com.github.shadowsocks.utils.Parser -class ParserActivity extends Activity { +class ParserActivity extends AppCompatActivity { override def onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) val data = getIntent.getData.toString @@ -56,30 +56,27 @@ class ParserActivity extends Activity { finish() return } - showAsPopup(this) + showAsPopup() val dialog = new AlertDialog.Builder(this) .setTitle(R.string.add_profile_dialog) .setCancelable(false) .setPositiveButton(android.R.string.yes, ((dialog: DialogInterface, id: Int) => { ShadowsocksApplication.profileManager.createProfile(profile.get) - dialog.dismiss() - }): DialogInterface.OnClickListener) - .setNegativeButton(android.R.string.no, ((dialog: DialogInterface, id: Int) => { - dialog.dismiss() }): DialogInterface.OnClickListener) + .setNegativeButton(android.R.string.no, null) .setMessage(data) .create() dialog.setOnDismissListener((dialog: DialogInterface) => finish()) // builder method was added in API 17 dialog.show() } - def showAsPopup(activity: Activity) { - activity.getWindow.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, - WindowManager.LayoutParams.FLAG_DIM_BEHIND) - val params = activity.getWindow.getAttributes + def showAsPopup() { + val window = getWindow + window.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, WindowManager.LayoutParams.FLAG_DIM_BEHIND) + val params = window.getAttributes params.alpha = 1.0f params.dimAmount = 0.5f - activity.getWindow.setAttributes(params.asInstanceOf[android.view.WindowManager.LayoutParams]) - activity.getWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)) + window.setAttributes(params.asInstanceOf[android.view.WindowManager.LayoutParams]) + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)) } } diff --git a/src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala b/src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala index ce69db3c..a817a446 100644 --- a/src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala +++ b/src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala @@ -1,22 +1,21 @@ package com.github.shadowsocks -import android.app.AlertDialog -import android.content.{DialogInterface, Intent} +import android.content.Intent import android.os.Bundle import android.support.design.widget.Snackbar -import android.support.v7.app.AppCompatActivity +import android.support.v7.app.{AlertDialog, AppCompatActivity} import android.support.v7.widget.RecyclerView.ViewHolder import android.support.v7.widget.Toolbar.OnMenuItemClickListener import android.support.v7.widget.helper.ItemTouchHelper import android.support.v7.widget.helper.ItemTouchHelper.SimpleCallback import android.support.v7.widget.{DefaultItemAnimator, LinearLayoutManager, RecyclerView, Toolbar} import android.text.style.TextAppearanceSpan -import android.text.{Spanned, SpannableStringBuilder} +import android.text.{SpannableStringBuilder, Spanned} import android.view.View.{OnAttachStateChangeListener, OnClickListener} import android.view.{LayoutInflater, MenuItem, View, ViewGroup} -import android.widget.{LinearLayout, ImageView, CheckedTextView, Toast} +import android.widget.{CheckedTextView, ImageView, LinearLayout, Toast} import com.github.shadowsocks.database.Profile -import com.github.shadowsocks.utils.{TrafficMonitor, Parser, Utils} +import com.github.shadowsocks.utils.{Parser, TrafficMonitor, Utils} import com.google.zxing.integration.android.IntentIntegrator import net.glxn.qrgen.android.QRCode @@ -38,13 +37,12 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe image.setLayoutParams(new LinearLayout.LayoutParams(-1, -1)) val qrcode = QRCode.from(Parser.generate(item)) .withSize(Utils.dpToPx(ProfileManagerActivity.this, 250), Utils.dpToPx(ProfileManagerActivity.this, 250)) - .asInstanceOf[QRCode] - image.setImageBitmap(qrcode.bitmap()) + .asInstanceOf[QRCode].bitmap() + image.setImageBitmap(qrcode) new AlertDialog.Builder(ProfileManagerActivity.this) .setCancelable(true) - .setNegativeButton(getString(R.string.close), - ((dialog: DialogInterface, id: Int) => dialog.cancel()): DialogInterface.OnClickListener) + .setNegativeButton(R.string.close, null) .setView(image) .create() .show() diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala index 82a3f0d4..fba18268 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala @@ -2,11 +2,11 @@ package com.github.shadowsocks import java.util.Locale -import android.app.AlertDialog import android.content.{DialogInterface, Intent} import android.net.Uri import android.os.{Build, Bundle} import android.preference.{SwitchPreference, Preference, PreferenceFragment} +import android.support.v7.app.AlertDialog import android.webkit.{WebViewClient, WebView} import com.github.shadowsocks.utils.Key