@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user