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/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/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index 5d7fda21..1257cbe0 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) @@ -467,6 +466,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/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 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 d1f6e56f..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} @@ -39,8 +39,8 @@ object TrafficMonitor { val now = getTraffic(tx, rx) 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 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}