Commit 84da64fa authored by Max Lv's avatar Max Lv

Merge pull request #436 from Mygod/master

Fix rate display
parents bcbd409c 52cd6d15
...@@ -39,8 +39,6 @@ ...@@ -39,8 +39,6 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.util.Locale
import android.app.Notification import android.app.Notification
import android.content.Context import android.content.Context
import android.os.{Handler, RemoteCallbackList} import android.os.{Handler, RemoteCallbackList}
...@@ -96,7 +94,7 @@ trait BaseService { ...@@ -96,7 +94,7 @@ trait BaseService {
} }
def startRunner(config: Config) { def startRunner(config: Config) {
this.config = config; this.config = config
TrafficMonitor.reset() TrafficMonitor.reset()
trafficMonitorThread = new TrafficMonitorThread(this) trafficMonitorThread = new TrafficMonitorThread(this)
...@@ -129,7 +127,7 @@ trait BaseService { ...@@ -129,7 +127,7 @@ trait BaseService {
handler.post(() => { handler.post(() => {
if (callbackCount > 0) { if (callbackCount > 0) {
val n = callbacks.beginBroadcast() val n = callbacks.beginBroadcast()
for (i <- 0 to n - 1) { for (i <- 0 until n) {
try { try {
callbacks.getBroadcastItem(i).trafficUpdated(txRate, rxRate, txTotal, rxTotal) callbacks.getBroadcastItem(i).trafficUpdated(txRate, rxRate, txTotal, rxTotal)
} catch { } catch {
...@@ -146,7 +144,7 @@ trait BaseService { ...@@ -146,7 +144,7 @@ trait BaseService {
handler.post(() => if (state != s) { handler.post(() => if (state != s) {
if (callbackCount > 0) { if (callbackCount > 0) {
val n = callbacks.beginBroadcast() val n = callbacks.beginBroadcast()
for (i <- 0 to n - 1) { for (i <- 0 until n) {
try { try {
callbacks.getBroadcastItem(i).stateChanged(s, msg) callbacks.getBroadcastItem(i).stateChanged(s, msg)
} catch { } catch {
......
...@@ -39,15 +39,15 @@ ...@@ -39,15 +39,15 @@
package com.github.shadowsocks package com.github.shadowsocks
import android.app.{Activity, AlertDialog}
import android.content.DialogInterface import android.content.DialogInterface
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.support.v7.app.{AppCompatActivity, AlertDialog}
import android.view.WindowManager import android.view.WindowManager
import com.github.shadowsocks.utils.Parser import com.github.shadowsocks.utils.Parser
class ParserActivity extends Activity { class ParserActivity extends AppCompatActivity {
override def onCreate(savedInstanceState: Bundle) { override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val data = getIntent.getData.toString val data = getIntent.getData.toString
...@@ -56,30 +56,27 @@ class ParserActivity extends Activity { ...@@ -56,30 +56,27 @@ class ParserActivity extends Activity {
finish() finish()
return return
} }
showAsPopup(this) showAsPopup()
val dialog = new AlertDialog.Builder(this) val dialog = new AlertDialog.Builder(this)
.setTitle(R.string.add_profile_dialog) .setTitle(R.string.add_profile_dialog)
.setCancelable(false) .setCancelable(false)
.setPositiveButton(android.R.string.yes, ((dialog: DialogInterface, id: Int) => { .setPositiveButton(android.R.string.yes, ((dialog: DialogInterface, id: Int) => {
ShadowsocksApplication.profileManager.createProfile(profile.get) ShadowsocksApplication.profileManager.createProfile(profile.get)
dialog.dismiss()
}): DialogInterface.OnClickListener)
.setNegativeButton(android.R.string.no, ((dialog: DialogInterface, id: Int) => {
dialog.dismiss()
}): DialogInterface.OnClickListener) }): DialogInterface.OnClickListener)
.setNegativeButton(android.R.string.no, null)
.setMessage(data) .setMessage(data)
.create() .create()
dialog.setOnDismissListener((dialog: DialogInterface) => finish()) // builder method was added in API 17 dialog.setOnDismissListener((dialog: DialogInterface) => finish()) // builder method was added in API 17
dialog.show() dialog.show()
} }
def showAsPopup(activity: Activity) { def showAsPopup() {
activity.getWindow.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, val window = getWindow
WindowManager.LayoutParams.FLAG_DIM_BEHIND) window.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, WindowManager.LayoutParams.FLAG_DIM_BEHIND)
val params = activity.getWindow.getAttributes val params = window.getAttributes
params.alpha = 1.0f params.alpha = 1.0f
params.dimAmount = 0.5f params.dimAmount = 0.5f
activity.getWindow.setAttributes(params.asInstanceOf[android.view.WindowManager.LayoutParams]) window.setAttributes(params.asInstanceOf[android.view.WindowManager.LayoutParams])
activity.getWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)) window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))
} }
} }
package com.github.shadowsocks package com.github.shadowsocks
import android.app.AlertDialog import android.content.Intent
import android.content.{DialogInterface, Intent}
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.Snackbar 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.RecyclerView.ViewHolder
import android.support.v7.widget.Toolbar.OnMenuItemClickListener import android.support.v7.widget.Toolbar.OnMenuItemClickListener
import android.support.v7.widget.helper.ItemTouchHelper import android.support.v7.widget.helper.ItemTouchHelper
import android.support.v7.widget.helper.ItemTouchHelper.SimpleCallback import android.support.v7.widget.helper.ItemTouchHelper.SimpleCallback
import android.support.v7.widget.{DefaultItemAnimator, LinearLayoutManager, RecyclerView, Toolbar} import android.support.v7.widget.{DefaultItemAnimator, LinearLayoutManager, RecyclerView, Toolbar}
import android.text.style.TextAppearanceSpan import android.text.style.TextAppearanceSpan
import android.text.{Spanned, SpannableStringBuilder} import android.text.{SpannableStringBuilder, Spanned}
import android.view.View.{OnAttachStateChangeListener, OnClickListener} import android.view.View.{OnAttachStateChangeListener, OnClickListener}
import android.view.{LayoutInflater, MenuItem, View, ViewGroup} 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.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 com.google.zxing.integration.android.IntentIntegrator
import net.glxn.qrgen.android.QRCode import net.glxn.qrgen.android.QRCode
...@@ -38,13 +37,12 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe ...@@ -38,13 +37,12 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
image.setLayoutParams(new LinearLayout.LayoutParams(-1, -1)) image.setLayoutParams(new LinearLayout.LayoutParams(-1, -1))
val qrcode = QRCode.from(Parser.generate(item)) val qrcode = QRCode.from(Parser.generate(item))
.withSize(Utils.dpToPx(ProfileManagerActivity.this, 250), Utils.dpToPx(ProfileManagerActivity.this, 250)) .withSize(Utils.dpToPx(ProfileManagerActivity.this, 250), Utils.dpToPx(ProfileManagerActivity.this, 250))
.asInstanceOf[QRCode] .asInstanceOf[QRCode].bitmap()
image.setImageBitmap(qrcode.bitmap()) image.setImageBitmap(qrcode)
new AlertDialog.Builder(ProfileManagerActivity.this) new AlertDialog.Builder(ProfileManagerActivity.this)
.setCancelable(true) .setCancelable(true)
.setNegativeButton(getString(R.string.close), .setNegativeButton(R.string.close, null)
((dialog: DialogInterface, id: Int) => dialog.cancel()): DialogInterface.OnClickListener)
.setView(image) .setView(image)
.create() .create()
.show() .show()
......
...@@ -40,7 +40,7 @@ package com.github.shadowsocks ...@@ -40,7 +40,7 @@ package com.github.shadowsocks
import java.io.{FileOutputStream, IOException, InputStream, OutputStream} import java.io.{FileOutputStream, IOException, InputStream, OutputStream}
import java.util import java.util
import java.util.{Locale, Timer, TimerTask} import java.util.Locale
import android.app.backup.BackupManager import android.app.backup.BackupManager
import android.app.{Activity, ProgressDialog} import android.app.{Activity, ProgressDialog}
...@@ -55,7 +55,7 @@ import android.support.v4.content.ContextCompat ...@@ -55,7 +55,7 @@ import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar import android.support.v7.widget.Toolbar
import android.util.Log import android.util.Log
import android.view.{ViewGroup, View, ViewParent} import android.view.{View, ViewGroup, ViewParent}
import android.widget._ import android.widget._
import com.github.jorgecastilloprz.FABProgressCircle import com.github.jorgecastilloprz.FABProgressCircle
import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback} import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback}
...@@ -73,8 +73,7 @@ object Typefaces { ...@@ -73,8 +73,7 @@ object Typefaces {
cache synchronized { cache synchronized {
if (!cache.containsKey(assetPath)) { if (!cache.containsKey(assetPath)) {
try { try {
val t: Typeface = Typeface.createFromAsset(c.getAssets, assetPath) cache.put(assetPath, Typeface.createFromAsset(c.getAssets, assetPath))
cache.put(assetPath, t)
} catch { } catch {
case e: Exception => case e: Exception =>
Log.e(TAG, "Could not get typeface '" + assetPath + "' because " + e.getMessage) Log.e(TAG, "Could not get typeface '" + assetPath + "' because " + e.getMessage)
...@@ -467,6 +466,9 @@ class Shadowsocks ...@@ -467,6 +466,9 @@ class Shadowsocks
// Check if current profile changed // Check if current profile changed
if (ShadowsocksApplication.profileId != currentProfile.id) reloadProfile() if (ShadowsocksApplication.profileId != currentProfile.id) reloadProfile()
callback.trafficUpdated(TrafficMonitor.getTxRate, TrafficMonitor.getRxRate,
TrafficMonitor.getTxTotal, TrafficMonitor.getRxTotal)
} }
private def setPreferenceEnabled(enabled: Boolean) { private def setPreferenceEnabled(enabled: Boolean) {
......
...@@ -74,10 +74,10 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -74,10 +74,10 @@ class ShadowsocksNatService extends Service with BaseService {
var apps: Array[ProxiedApp] = null var apps: Array[ProxiedApp] = null
val myUid = Process.myUid() val myUid = Process.myUid()
var sslocalPid: Int = 0; var sslocalPid: Int = 0
var sstunnelPid: Int = 0; var sstunnelPid: Int = 0
var redsocksPid: Int = 0; var redsocksPid: Int = 0
var pdnsdPid: Int = 0; var pdnsdPid: Int = 0
private val dnsAddressCache = new SparseArray[String] private val dnsAddressCache = new SparseArray[String]
......
...@@ -2,11 +2,11 @@ package com.github.shadowsocks ...@@ -2,11 +2,11 @@ package com.github.shadowsocks
import java.util.Locale import java.util.Locale
import android.app.AlertDialog
import android.content.{DialogInterface, Intent} import android.content.{DialogInterface, Intent}
import android.net.Uri import android.net.Uri
import android.os.{Build, Bundle} import android.os.{Build, Bundle}
import android.preference.{SwitchPreference, Preference, PreferenceFragment} import android.preference.{SwitchPreference, Preference, PreferenceFragment}
import android.support.v7.app.AlertDialog
import android.webkit.{WebViewClient, WebView} import android.webkit.{WebViewClient, WebView}
import com.github.shadowsocks.utils.Key import com.github.shadowsocks.utils.Key
......
...@@ -70,10 +70,10 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -70,10 +70,10 @@ class ShadowsocksVpnService extends VpnService with BaseService {
var vpnThread: ShadowsocksVpnThread = null var vpnThread: ShadowsocksVpnThread = null
var closeReceiver: BroadcastReceiver = null var closeReceiver: BroadcastReceiver = null
var sslocalPid: Int = 0; var sslocalPid: Int = 0
var sstunnelPid: Int = 0; var sstunnelPid: Int = 0
var tun2socksPid: Int = 0; var tun2socksPid: Int = 0
var pdnsdPid: Int = 0; var pdnsdPid: Int = 0
def isByass(net: SubnetUtils): Boolean = { def isByass(net: SubnetUtils): Boolean = {
val info = net.getInfo val info = net.getInfo
......
package com.github.shadowsocks.utils package com.github.shadowsocks.utils
import java.lang.{Math, System} import java.lang.System
import java.text.DecimalFormat import java.text.DecimalFormat
import com.github.shadowsocks.{R, ShadowsocksApplication} import com.github.shadowsocks.{R, ShadowsocksApplication}
...@@ -39,8 +39,8 @@ object TrafficMonitor { ...@@ -39,8 +39,8 @@ object TrafficMonitor {
val now = getTraffic(tx, rx) val now = getTraffic(tx, rx)
val delta = now.timestamp - last.timestamp val delta = now.timestamp - last.timestamp
if (delta != 0) { if (delta != 0) {
txRate = (now.tx - last.tx) / delta txRate = (now.tx - last.tx) * 1000 / delta
rxRate = (now.rx - last.rx) / delta rxRate = (now.rx - last.rx) * 1000 / delta
} }
txTotal += now.tx - last.tx txTotal += now.tx - last.tx
rxTotal += now.rx - last.rx rxTotal += now.rx - last.rx
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
package com.github.shadowsocks.utils package com.github.shadowsocks.utils
import java.io.{File, FileDescriptor, IOException} import java.io.{File, IOException}
import java.util.concurrent.Executors import java.util.concurrent.Executors
import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress} import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress}
......
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