Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
com.ccwangluo.accelerator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
com.ccwangluo.accelerator
Commits
bf3933bf
Commit
bf3933bf
authored
Oct 04, 2015
by
Max Lv
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #379 from Mygod/master
SAM (Scala 2.11.7)
parents
1ad82972
d111bc82
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
270 additions
and
370 deletions
+270
-370
build.sbt
build.sbt
+9
-13
src/main/scala/com/github/shadowsocks/AppManager.scala
src/main/scala/com/github/shadowsocks/AppManager.scala
+8
-11
src/main/scala/com/github/shadowsocks/BaseService.scala
src/main/scala/com/github/shadowsocks/BaseService.scala
+15
-21
src/main/scala/com/github/shadowsocks/ParserActivity.scala
src/main/scala/com/github/shadowsocks/ParserActivity.scala
+18
-24
src/main/scala/com/github/shadowsocks/Shadowsocks.scala
src/main/scala/com/github/shadowsocks/Shadowsocks.scala
+121
-163
src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala
...scala/com/github/shadowsocks/ShadowsocksApplication.scala
+3
-5
src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
.../scala/com/github/shadowsocks/ShadowsocksNatService.scala
+21
-30
src/main/scala/com/github/shadowsocks/ShadowsocksRunnerActivity.scala
...la/com/github/shadowsocks/ShadowsocksRunnerActivity.scala
+4
-10
src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala
.../scala/com/github/shadowsocks/ShadowsocksVpnService.scala
+7
-9
src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala
...n/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala
+23
-25
src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala
...n/scala/com/github/shadowsocks/database/MenuAdapter.scala
+9
-17
src/main/scala/com/github/shadowsocks/database/ProfileManager.scala
...cala/com/github/shadowsocks/database/ProfileManager.scala
+1
-1
src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala
...main/scala/com/github/shadowsocks/utils/ConfigUtils.scala
+2
-2
src/main/scala/com/github/shadowsocks/utils/Console.scala
src/main/scala/com/github/shadowsocks/utils/Console.scala
+12
-20
src/main/scala/com/github/shadowsocks/utils/Parser.scala
src/main/scala/com/github/shadowsocks/utils/Parser.scala
+2
-5
src/main/scala/com/github/shadowsocks/utils/Utils.scala
src/main/scala/com/github/shadowsocks/utils/Utils.scala
+15
-14
No files found.
build.sbt
View file @
bf3933bf
...
...
@@ -6,11 +6,13 @@ platformTarget in Android := "android-23"
name
:=
"shadowsocks"
scalaVersion
:=
"2.11.7"
compileOrder
in
Compile
:=
CompileOrder
.
JavaThenScala
javacOptions
++=
Seq
(
"-source"
,
"1.6"
,
"-target"
,
"1.6"
)
scalacOptions
+
=
"-target:jvm-1.6"
scalacOptions
+
+=
Seq
(
"-target:jvm-1.6"
,
"-Xexperimental"
)
ndkJavah
in
Android
:=
List
()
...
...
@@ -24,26 +26,20 @@ resolvers += "JRAF" at "http://JRAF.org/static/maven/2"
libraryDependencies
++=
Seq
(
"dnsjava"
%
"dnsjava"
%
"2.1.7"
,
"com.github.kevinsawicki"
%
"http-request"
%
"
5.6
"
,
"com.github.kevinsawicki"
%
"http-request"
%
"
6.0
"
,
"commons-net"
%
"commons-net"
%
"3.3"
,
"com.google.zxing"
%
"android-integration"
%
"3.1.0"
)
libraryDependencies
++=
Seq
(
"com.joanzapata.android"
%
"android-iconify"
%
"1.0.9"
,
"com.google.zxing"
%
"android-integration"
%
"3.1.0"
,
"com.joanzapata.android"
%
"android-iconify"
%
"1.0.11"
,
"net.glxn.qrgen"
%
"android"
%
"2.0"
,
"net.simonvt.menudrawer"
%
"menudrawer"
%
"3.0.6"
,
"com.google.android.gms"
%
"play-services-base"
%
"8.1.0"
,
"com.google.android.gms"
%
"play-services-ads"
%
"8.1.0"
,
"com.google.android.gms"
%
"play-services-analytics"
%
"8.1.0"
,
"com.android.support"
%
"support-v4"
%
"23.0.1"
)
libraryDependencies
++=
Seq
(
"com.android.support"
%
"support-v4"
%
"23.0.1"
,
"com.github.mrengineer13"
%
"snackbar"
%
"0.5.0"
,
"com.nostra13.universalimageloader"
%
"universal-image-loader"
%
"1.8.4"
,
"com.j256.ormlite"
%
"ormlite-core"
%
"4.4
7
"
,
"com.j256.ormlite"
%
"ormlite-android"
%
"4.4
7
"
"com.j256.ormlite"
%
"ormlite-core"
%
"4.4
8
"
,
"com.j256.ormlite"
%
"ormlite-android"
%
"4.4
8
"
)
proguardOptions
in
Android
++=
Seq
(
"-keep class android.support.v4.app.** { *; }"
,
...
...
src/main/scala/com/github/shadowsocks/AppManager.scala
View file @
bf3933bf
...
...
@@ -65,7 +65,8 @@ import com.nostra13.universalimageloader.core.{DisplayImageOptions, ImageLoader,
import
com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer
import
com.github.shadowsocks.utils.
{
Utils
,
Scheme
,
Key
}
import
scala.concurrent.ops._
import
scala.concurrent.ExecutionContext.Implicits.global
import
scala.concurrent.Future
import
scala.language.implicitConversions
case
class
ProxiedApp
(
uid
:
Int
,
name
:
String
,
packageName
:
String
,
var
proxied
:
Boolean
)
...
...
@@ -267,9 +268,8 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
}
protected
override
def
onCreateOptionsMenu
(
menu
:
Menu
)
:
Boolean
=
{
val
inflater
=
getMenuInflater
()
inflater
.
inflate
(
R
.
menu
.
app_manager_menu
,
menu
)
return
super
.
onCreateOptionsMenu
(
menu
)
getMenuInflater
.
inflate
(
R
.
menu
.
app_manager_menu
,
menu
)
super
.
onCreateOptionsMenu
(
menu
)
}
protected
override
def
onCreate
(
savedInstanceState
:
Bundle
)
{
...
...
@@ -277,7 +277,7 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
handler
=
new
Handler
()
val
actionBar
=
getActionBar
()
val
actionBar
=
getActionBar
actionBar
.
setTitle
(
R
.
string
.
proxied_help
)
actionBar
.
setDisplayHomeAsUpEnabled
(
true
)
actionBar
.
setDisplayShowHomeEnabled
(
false
)
...
...
@@ -297,11 +297,8 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
val
bypassSwitch
=
findViewById
(
R
.
id
.
bypassSwitch
).
asInstanceOf
[
Switch
]
val
prefs
=
PreferenceManager
.
getDefaultSharedPreferences
(
getBaseContext
)
bypassSwitch
.
setOnCheckedChangeListener
(
new
OnCheckedChangeListener
{
def
onCheckedChanged
(
button
:
CompoundButton
,
checked
:
Boolean
)
{
prefs
.
edit
().
putBoolean
(
Key
.
isBypassApps
,
checked
).
commit
()
}
})
bypassSwitch
.
setOnCheckedChangeListener
((
button
:
CompoundButton
,
checked
:
Boolean
)
=>
prefs
.
edit
().
putBoolean
(
Key
.
isBypassApps
,
checked
).
commit
())
bypassSwitch
.
setChecked
(
prefs
.
getBoolean
(
Key
.
isBypassApps
,
false
))
appListView
=
findViewById
(
R
.
id
.
applistview
).
asInstanceOf
[
ListView
]
...
...
@@ -309,7 +306,7 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
protected
override
def
onResume
()
{
super
.
onResume
()
spawn
{
Future
{
handler
.
post
(
loadStartRunnable
)
if
(!
appsLoaded
)
loadApps
()
handler
.
post
(
loadFinishRunnable
)
...
...
src/main/scala/com/github/shadowsocks/BaseService.scala
View file @
bf3933bf
...
...
@@ -39,13 +39,11 @@
package
com.github.shadowsocks
import
android.os.
{
Handler
,
RemoteCallbackList
}
import
com.github.shadowsocks.aidl.
{
Config
,
IShadowsocksService
,
IShadowsocksServiceCallback
}
import
com.github.shadowsocks.utils.
{
Path
,
State
}
import
java.io.
{
IOException
,
FileNotFoundException
,
FileReader
,
BufferedReader
}
import
android.util.Log
import
android.app.Notification
import
android.content.Context
import
android.os.
{
Handler
,
RemoteCallbackList
}
import
com.github.shadowsocks.aidl.
{
Config
,
IShadowsocksService
,
IShadowsocksServiceCallback
}
import
com.github.shadowsocks.utils.State
trait
BaseService
{
...
...
@@ -100,10 +98,10 @@ trait BaseService {
def
getTag
:
String
def
getContext
:
Context
def
getCallbackCount
()
:
Int
=
{
def
getCallbackCount
:
Int
=
{
callbackCount
}
def
getState
()
:
Int
=
{
def
getState
:
Int
=
{
state
}
def
changeState
(
s
:
Int
)
{
...
...
@@ -112,23 +110,19 @@ trait BaseService {
protected
def
changeState
(
s
:
Int
,
msg
:
String
)
{
val
handler
=
new
Handler
(
getContext
.
getMainLooper
)
handler
.
post
(
new
Runnable
{
override
def
run
()
{
if
(
state
!=
s
)
{
if
(
callbackCount
>
0
)
{
val
n
=
callbacks
.
beginBroadcast
()
for
(
i
<-
0
to
n
-
1
)
{
try
{
callbacks
.
getBroadcastItem
(
i
).
stateChanged
(
s
,
msg
)
}
catch
{
case
_:
Exception
=>
// Ignore
}
}
callbacks
.
finishBroadcast
()
handler
.
post
(()
=>
if
(
state
!=
s
)
{
if
(
callbackCount
>
0
)
{
val
n
=
callbacks
.
beginBroadcast
()
for
(
i
<-
0
to
n
-
1
)
{
try
{
callbacks
.
getBroadcastItem
(
i
).
stateChanged
(
s
,
msg
)
}
catch
{
case
_:
Exception
=>
// Ignore
}
state
=
s
}
callbacks
.
finishBroadcast
()
}
state
=
s
})
}
...
...
src/main/scala/com/github/shadowsocks/ParserActivity.scala
View file @
bf3933bf
...
...
@@ -39,15 +39,15 @@
package
com.github.shadowsocks
import
android.os.
{
Message
,
Handler
,
Bundle
}
import
android.app.
{
ProgressDialog
,
AlertDialog
,
Activity
}
import
android.content.
{
Intent
,
DialogInterface
}
import
com.github.shadowsocks.database.
{
ProfileManager
,
Profile
}
import
com.github.shadowsocks.utils.
{
Parser
,
Action
}
import
android.preference.PreferenceManager
import
android.view.WindowManager
import
android.app.
{
Activity
,
AlertDialog
,
ProgressDialog
}
import
android.content.DialogInterface
import
android.graphics.Color
import
android.graphics.drawable.ColorDrawable
import
android.os.
{
Bundle
,
Handler
,
Message
}
import
android.preference.PreferenceManager
import
android.view.WindowManager
import
com.github.shadowsocks.database.
{
Profile
,
ProfileManager
}
import
com.github.shadowsocks.utils.Parser
class
ParserActivity
extends
Activity
{
override
def
onCreate
(
savedInstanceState
:
Bundle
)
{
...
...
@@ -57,21 +57,17 @@ class ParserActivity extends Activity {
new
AlertDialog
.
Builder
(
this
)
.
setTitle
(
R
.
string
.
add_profile_dialog
)
.
setCancelable
(
false
)
.
setPositiveButton
(
R
.
string
.
yes
,
new
DialogInterface
.
OnClickListener
()
{
override
def
onClick
(
dialog
:
DialogInterface
,
id
:
Int
)
{
.
setPositiveButton
(
R
.
string
.
yes
,
((
dialog
:
DialogInterface
,
id
:
Int
)
=>
{
Parser
.
parse
(
data
)
match
{
case
Some
(
profile
)
=>
addProfile
(
profile
)
case
_
=>
// ignore
}
dialog
.
dismiss
()
}
})
.
setNegativeButton
(
R
.
string
.
no
,
new
DialogInterface
.
OnClickListener
()
{
override
def
onClick
(
dialog
:
DialogInterface
,
id
:
Int
)
{
})
:
DialogInterface.OnClickListener
)
.
setNegativeButton
(
R
.
string
.
no
,
((
dialog
:
DialogInterface
,
id
:
Int
)
=>
{
dialog
.
dismiss
()
finish
()
}
})
})
:
DialogInterface.OnClickListener
)
.
setMessage
(
data
)
.
create
()
.
show
()
...
...
@@ -91,15 +87,13 @@ class ParserActivity extends Activity {
val
h
=
showProgress
(
getString
(
R
.
string
.
loading
))
h
.
postDelayed
(
new
Runnable
{
def
run
()
{
val
profileManager
=
new
ProfileManager
(
PreferenceManager
.
getDefaultSharedPreferences
(
getBaseContext
),
getApplication
.
asInstanceOf
[
ShadowsocksApplication
].
dbHelper
)
profileManager
.
createOrUpdateProfile
(
profile
)
profileManager
.
reload
(
profile
.
id
)
h
.
sendEmptyMessage
(
0
)
}
h
.
postDelayed
(()
=>
{
val
profileManager
=
new
ProfileManager
(
PreferenceManager
.
getDefaultSharedPreferences
(
getBaseContext
),
getApplication
.
asInstanceOf
[
ShadowsocksApplication
].
dbHelper
)
profileManager
.
createOrUpdateProfile
(
profile
)
profileManager
.
reload
(
profile
.
id
)
h
.
sendEmptyMessage
(
0
)
},
600
)
}
...
...
src/main/scala/com/github/shadowsocks/Shadowsocks.scala
View file @
bf3933bf
This diff is collapsed.
Click to expand it.
src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala
View file @
bf3933bf
...
...
@@ -47,7 +47,6 @@ import com.github.shadowsocks.database.DBHelper
import
com.github.shadowsocks.utils.Utils
import
com.google.android.gms.analytics.GoogleAnalytics
import
com.google.android.gms.common.api.ResultCallback
import
com.google.android.gms.tagmanager.Container.FunctionCallMacroCallback
import
com.google.android.gms.tagmanager.
{
ContainerHolder
,
TagManager
}
class
ShadowsocksApplication
extends
Application
{
...
...
@@ -66,14 +65,13 @@ class ShadowsocksApplication extends Application {
}
containerHolder
=
holder
val
container
=
holder
.
getContainer
container
.
registerFunctionCallMacroCallback
(
SIG_FUNC
,
new
FunctionCallMacroCallback
{
override
def
getValue
(
functionName
:
String
,
parameters
:
util.Map
[
String
,
AnyRef
])
:
AnyRef
=
{
container
.
registerFunctionCallMacroCallback
(
SIG_FUNC
,
(
functionName
:
String
,
parameters
:
util.Map
[
String
,
AnyRef
])
=>
{
if
(
functionName
==
SIG_FUNC
)
{
Utils
.
getSignature
(
getApplicationContext
)
}
null
}
})
})
}
}
pending
.
setResultCallback
(
callback
,
2
,
TimeUnit
.
SECONDS
)
...
...
src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
View file @
bf3933bf
...
...
@@ -58,7 +58,8 @@ import com.google.android.gms.analytics.HitBuilders
import
scala.collection._
import
scala.collection.mutable.ArrayBuffer
import
scala.concurrent.ops._
import
scala.concurrent.ExecutionContext.Implicits.global
import
scala.concurrent.Future
class
ShadowsocksNatService
extends
Service
with
BaseService
{
...
...
@@ -172,11 +173,7 @@ class ShadowsocksNatService extends Service with BaseService {
def
initConnectionReceiver
()
{
val
filter
=
new
IntentFilter
(
ConnectivityManager
.
CONNECTIVITY_ACTION
)
connReceiver
=
new
BroadcastReceiver
{
override
def
onReceive
(
context
:
Context
,
intent
:
Intent
)
=
{
setupDns
()
}
}
connReceiver
=
(
context
:
Context
,
intent
:
Intent
)
=>
setupDns
()
registerReceiver
(
connReceiver
,
filter
)
}
...
...
@@ -511,11 +508,9 @@ class ShadowsocksNatService extends Service with BaseService {
val
filter
=
new
IntentFilter
()
filter
.
addAction
(
Intent
.
ACTION_SHUTDOWN
)
filter
.
addAction
(
Action
.
CLOSE
)
closeReceiver
=
new
BroadcastReceiver
()
{
def
onReceive
(
context
:
Context
,
intent
:
Intent
)
{
Toast
.
makeText
(
context
,
R
.
string
.
stopping
,
Toast
.
LENGTH_SHORT
).
show
()
stopRunner
()
}
closeReceiver
=
(
context
:
Context
,
intent
:
Intent
)
=>
{
Toast
.
makeText
(
context
,
R
.
string
.
stopping
,
Toast
.
LENGTH_SHORT
).
show
()
stopRunner
()
}
registerReceiver
(
closeReceiver
,
filter
)
...
...
@@ -524,26 +519,22 @@ class ShadowsocksNatService extends Service with BaseService {
screenFilter
.
addAction
(
Intent
.
ACTION_SCREEN_ON
)
screenFilter
.
addAction
(
Intent
.
ACTION_SCREEN_OFF
)
screenFilter
.
addAction
(
Intent
.
ACTION_USER_PRESENT
)
lockReceiver
=
new
BroadcastReceiver
()
{
def
onReceive
(
context
:
Context
,
intent
:
Intent
)
{
if
(
getState
==
State
.
CONNECTED
)
{
val
action
=
intent
.
getAction
if
(
action
==
Intent
.
ACTION_SCREEN_OFF
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
false
)
}
else
if
(
action
==
Intent
.
ACTION_SCREEN_ON
)
{
val
keyGuard
=
getSystemService
(
Context
.
KEYGUARD_SERVICE
).
asInstanceOf
[
KeyguardManager
]
if
(!
keyGuard
.
inKeyguardRestrictedInputMode
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
true
)
}
}
else
if
(
action
==
Intent
.
ACTION_USER_PRESENT
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
true
)
}
}
lockReceiver
=
(
context
:
Context
,
intent
:
Intent
)
=>
if
(
getState
==
State
.
CONNECTED
)
{
val
action
=
intent
.
getAction
if
(
action
==
Intent
.
ACTION_SCREEN_OFF
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
false
)
}
else
if
(
action
==
Intent
.
ACTION_SCREEN_ON
)
{
val
keyGuard
=
getSystemService
(
Context
.
KEYGUARD_SERVICE
).
asInstanceOf
[
KeyguardManager
]
if
(!
keyGuard
.
inKeyguardRestrictedInputMode
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
true
)
}
}
else
if
(
action
==
Intent
.
ACTION_USER_PRESENT
)
{
notifyForegroundAlert
(
getString
(
R
.
string
.
forward_success
),
getString
(
R
.
string
.
service_running
).
formatLocal
(
Locale
.
ENGLISH
,
config
.
profileName
),
true
)
}
}
registerReceiver
(
lockReceiver
,
screenFilter
)
}
...
...
@@ -556,7 +547,7 @@ class ShadowsocksNatService extends Service with BaseService {
changeState
(
State
.
CONNECTING
)
spawn
{
Future
{
if
(
config
.
proxy
==
"198.199.101.152"
)
{
val
holder
=
application
.
containerHolder
...
...
src/main/scala/com/github/shadowsocks/ShadowsocksRunnerActivity.scala
View file @
bf3933bf
...
...
@@ -57,11 +57,7 @@ class ShadowsocksRunnerActivity extends Activity {
val
connection
=
new
ServiceConnection
{
override
def
onServiceConnected
(
name
:
ComponentName
,
service
:
IBinder
)
{
bgService
=
IShadowsocksService
.
Stub
.
asInterface
(
service
)
handler
.
postDelayed
(
new
Runnable
()
{
override
def
run
()
{
if
(
bgService
!=
null
)
startBackgroundService
()
}
},
1000
)
handler
.
postDelayed
(()
=>
if
(
bgService
!=
null
)
startBackgroundService
(),
1000
)
}
override
def
onServiceDisconnected
(
name
:
ComponentName
)
{
bgService
=
null
...
...
@@ -122,11 +118,9 @@ class ShadowsocksRunnerActivity extends Activity {
val
locked
=
km
.
inKeyguardRestrictedInputMode
if
(
locked
)
{
val
filter
=
new
IntentFilter
(
Intent
.
ACTION_USER_PRESENT
)
receiver
=
new
BroadcastReceiver
()
{
override
def
onReceive
(
context
:
Context
,
intent
:
Intent
)
{
if
(
intent
.
getAction
==
Intent
.
ACTION_USER_PRESENT
)
{
attachService
()
}
receiver
=
(
context
:
Context
,
intent
:
Intent
)
=>
{
if
(
intent
.
getAction
==
Intent
.
ACTION_USER_PRESENT
)
{
attachService
()
}
}
registerReceiver
(
receiver
,
filter
)
...
...
src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala
View file @
bf3933bf
...
...
@@ -40,7 +40,6 @@
package
com.github.shadowsocks
import
java.io.File
import
java.net.InetAddress
import
java.util.Locale
import
android.app._
...
...
@@ -57,7 +56,8 @@ import org.apache.commons.net.util.SubnetUtils
import
scala.collection.mutable
import
scala.collection.mutable.ArrayBuffer
import
scala.concurrent.ops._
import
scala.concurrent.ExecutionContext.Implicits.global
import
scala.concurrent.Future
class
ShadowsocksVpnService
extends
VpnService
with
BaseService
{
...
...
@@ -208,17 +208,15 @@ class ShadowsocksVpnService extends VpnService with BaseService {
// register close receiver
val
filter
=
new
IntentFilter
()
filter
.
addAction
(
Intent
.
ACTION_SHUTDOWN
)
receiver
=
new
BroadcastReceiver
{
def
onReceive
(
p1
:
Context
,
p2
:
Intent
)
{
Toast
.
makeText
(
p1
,
R
.
string
.
stopping
,
Toast
.
LENGTH_SHORT
)
stopRunner
()
}
receiver
=
(
p1
:
Context
,
p2
:
Intent
)
=>
{
Toast
.
makeText
(
p1
,
R
.
string
.
stopping
,
Toast
.
LENGTH_SHORT
)
stopRunner
()
}
registerReceiver
(
receiver
,
filter
)
changeState
(
State
.
CONNECTING
)
spawn
{
Future
{
if
(
config
.
proxy
==
"198.199.101.152"
)
{
val
holder
=
getApplication
.
asInstanceOf
[
ShadowsocksApplication
].
containerHolder
try
{
...
...
@@ -453,7 +451,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
Console
.
runCommand
(
cmd
)
return
fd
fd
}
override
def
stopBackgroundService
()
{
...
...
src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala
View file @
bf3933bf
...
...
@@ -93,35 +93,34 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
try
{
val
socket
=
serverSocket
.
accept
()
pool
.
execute
(
new
Runnable
{
override
def
run
()
{
try
{
val
input
=
socket
.
getInputStream
val
output
=
socket
.
getOutputStream
input
.
read
()
pool
.
execute
(()
=>
{
try
{
val
input
=
socket
.
getInputStream
val
output
=
socket
.
getOutputStream
val
fds
=
socket
.
getAncillaryFileDescriptors
input
.
read
()
if
(
fds
.
length
>
0
)
{
var
ret
=
false
val
fds
=
socket
.
getAncillaryFileDescriptors
val
getInt
=
classOf
[
FileDescriptor
].
getDeclaredMethod
(
"getInt$"
)
val
fd
=
getInt
.
invoke
(
fds
(
0
)).
asInstanceOf
[
Int
]
ret
=
vpnService
.
protect
(
fd
)
if
(
fds
.
nonEmpty
)
{
var
ret
=
false
// Trick to close file decriptor
System
.
jniclose
(
fd
)
val
getInt
=
classOf
[
FileDescriptor
].
getDeclaredMethod
(
"getInt$"
)
val
fd
=
getInt
.
invoke
(
fds
(
0
)).
asInstanceOf
[
Int
]
ret
=
vpnService
.
protect
(
fd
)
if
(
ret
)
{
output
.
write
(
0
)
}
else
{
output
.
write
(
1
)
}
// Trick to close file decriptor
System
.
jniclose
(
fd
)
input
.
close
()
output
.
close
()
if
(
ret
)
{
output
.
write
(
0
)
}
else
{
output
.
write
(
1
)
}
input
.
close
()
output
.
close
()
}
}
catch
{
case
e
:
Exception
=>
Log
.
e
(
TAG
,
"Error when protect socket"
,
e
)
...
...
@@ -134,12 +133,11 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
case
_:
Exception
=>
// ignore
}
}
}
)
})
}
catch
{
case
e
:
IOException
=>
{
case
e
:
IOException
=>
Log
.
e
(
TAG
,
"Error when accept socket"
,
e
)
return
}
}
}
}
...
...
src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala
View file @
bf3933bf
...
...
@@ -40,14 +40,10 @@
package
com.github.shadowsocks.database
import
android.content.Context
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.BaseAdapter
import
android.widget.TextView
import
android.graphics.drawable.Drawable
import
com.github.shadowsocks.
{
R
}
import
android.view.View.
{
OnLongClickListener
,
OnClickListener
}
import
android.view.
{
LayoutInflater
,
View
,
ViewGroup
}
import
android.widget.
{
BaseAdapter
,
TextView
}
import
com.github.shadowsocks.R
abstract
class
Item
{
def
id
:
Int
...
...
@@ -147,17 +143,13 @@ class MenuAdapter(context: Context, var items: List[Any]) extends BaseAdapter {
}
}
tv
.
setOnClickListener
(
new
OnClickListener
{
def
onClick
(
view
:
View
)
{
val
item
=
view
.
getTag
(
R
.
id
.
mdItem
).
asInstanceOf
[
Item
]
item
.
click
(
item
.
id
)
}
tv
.
setOnClickListener
((
view
:
View
)
=>
{
val
item
=
view
.
getTag
(
R
.
id
.
mdItem
).
asInstanceOf
[
Item
]
item
.
click
(
item
.
id
)
})
tv
.
setOnLongClickListener
(
new
OnLongClickListener
{
def
onLongClick
(
view
:
View
)
:
Boolean
=
{
val
item
=
view
.
getTag
(
R
.
id
.
mdItem
).
asInstanceOf
[
Item
]
item
.
longClick
(
item
.
id
)
}
tv
.
setOnLongClickListener
((
view
:
View
)
=>
{
val
item
=
view
.
getTag
(
R
.
id
.
mdItem
).
asInstanceOf
[
Item
]
item
.
longClick
(
item
.
id
)
})
v
.
setTag
(
R
.
id
.
mdItem
,
value
)
...
...
src/main/scala/com/github/shadowsocks/database/ProfileManager.scala
View file @
bf3933bf
...
...
@@ -39,9 +39,9 @@
package
com.github.shadowsocks.database
import
android.content.SharedPreferences
import
android.util.Log
import
com.github.shadowsocks._
import
android.content.
{
SharedPreferences
,
Context
}
import
com.github.shadowsocks.utils.Key
class
ProfileManager
(
settings
:
SharedPreferences
,
dbHelper
:
DBHelper
)
{
...
...
src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala
View file @
bf3933bf
...
...
@@ -233,8 +233,8 @@ object ConfigUtils {
.
readTimeout
(
2000
)
.
send
(
"sig="
+
sig
)
.
body
val
proxies
=
util
.
Random
.
shuffle
(
list
.
split
(
'|'
).
toSeq
)
.
toSeq
val
proxy
=
proxies
(
0
)
.
split
(
':'
)
val
proxies
=
util
.
Random
.
shuffle
(
list
.
split
(
'|'
).
toSeq
)
val
proxy
=
proxies
.
head
.
split
(
':'
)
val
host
=
proxy
(
0
).
trim
val
port
=
proxy
(
1
).
trim
.
toInt
...
...
src/main/scala/com/github/shadowsocks/utils/Console.scala
View file @
bf3933bf
...
...
@@ -39,10 +39,11 @@
package
com.github.shadowsocks.utils
import
eu.chainfire.libsuperuser.Shell
import
eu.chainfire.libsuperuser.Shell.
{
OnCommandResultListener
,
SU
,
Builder
}
import
java.util
import
eu.chainfire.libsuperuser.Shell
import
eu.chainfire.libsuperuser.Shell.
{
Builder
,
SU
}
object
Console
{
private
def
openShell
()
:
Shell.Interactive
=
{
...
...
@@ -68,14 +69,8 @@ object Console {
def
runCommand
(
commands
:
Array
[
String
])
{
val
shell
=
openShell
()
shell
.
addCommand
(
commands
,
0
,
new
OnCommandResultListener
{
override
def
onCommandResult
(
commandCode
:
Int
,
exitCode
:
Int
,
output
:
util.List
[
String
])
{
if
(
exitCode
<
0
)
{
shell
.
close
()
}
}
})
shell
.
addCommand
(
commands
,
0
,
((
commandCode
:
Int
,
exitCode
:
Int
,
output
:
util.List
[
String
])
=>
if
(
exitCode
<
0
)
shell
.
close
())
:
Shell.OnCommandResultListener
)
shell
.
waitForIdle
()
shell
.
close
()
}
...
...
@@ -90,17 +85,14 @@ object Console {
}
val
shell
=
openRootShell
(
context
)
val
sb
=
new
StringBuilder
shell
.
addCommand
(
commands
,
0
,
new
OnCommandResultListener
{
override
def
onCommandResult
(
commandCode
:
Int
,
exitCode
:
Int
,
output
:
util.List
[
String
])
{
if
(
exitCode
<
0
)
{
shell
.
close
()
}
else
{
import
scala.collection.JavaConversions._
output
.
foreach
(
line
=>
sb
.
append
(
line
).
append
(
'\n'
))
}
shell
.
addCommand
(
commands
,
0
,
((
commandCode
:
Int
,
exitCode
:
Int
,
output
:
util.List
[
String
])
=>
{
if
(
exitCode
<
0
)
{
shell
.
close
()
}
else
{
import
scala.collection.JavaConversions._
output
.
foreach
(
line
=>
sb
.
append
(
line
).
append
(
'\n'
))
}
})
})
:
Shell.OnCommandResultListener
)
if
(
shell
.
waitForIdle
())
{
shell
.
close
()
sb
.
toString
()
...
...
src/main/scala/com/github/shadowsocks/utils/Parser.scala
View file @
bf3933bf
...
...
@@ -47,11 +47,8 @@ import android.util.{Log, Base64}
object
Parser
{
val
TAG
=
"ShadowParser"
def
generate
(
profile
:
Profile
)
:
String
=
{
val
path
=
"%s:%s@%s:%d"
.
formatLocal
(
Locale
.
ENGLISH
,
profile
.
method
,
profile
.
password
,
profile
.
host
,
profile
.
remotePort
)
return
"ss://"
+
Base64
.
encodeToString
(
path
.
getBytes
,
Base64
.
NO_PADDING
)
}
def
generate
(
profile
:
Profile
)
:
String
=
"ss://"
+
Base64
.
encodeToString
(
"%s:%s@%s:%d"
.
formatLocal
(
Locale
.
ENGLISH
,
profile
.
method
,
profile
.
password
,
profile
.
host
,
profile
.
remotePort
).
getBytes
,
Base64
.
NO_PADDING
)
def
parse
(
data
:
String
)
:
Option
[
Profile
]
=
{
try
{
...
...
src/main/scala/com/github/shadowsocks/utils/Utils.scala
View file @
bf3933bf
...
...
@@ -38,21 +38,21 @@
*/
package
com.github.shadowsocks.utils
import
android.content.
{
Intent
,
Context
}
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageManager
import
android.graphics.drawable.
{
BitmapDrawable
,
Drawable
}
import
android.util.
{
Base64
,
Log
}
import
java.io._
import
java.net._
import
org.xbill.DNS._
import
android.graphics._
import
java.security.MessageDigest
import
android.app.ActivityManager
import
android.content.pm.
{
ApplicationInfo
,
PackageManager
}
import
android.content.
{
Context
,
Intent
}
import
android.graphics._
import
android.graphics.drawable.
{
BitmapDrawable
,
Drawable
}
import
android.os.Build
import
android.provider.Settings
import
scala.Some
import
java.security.MessageDigest
import
com.github.shadowsocks.
{
BuildConfig
}
import
android.support.v4.content.ContextCompat
import
android.util.
{
Base64
,
Log
}
import
com.github.shadowsocks.BuildConfig
import
org.xbill.DNS._
object
Utils
{
...
...
@@ -146,6 +146,7 @@ object Utils {
// + "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false\n")
}
//noinspection ScalaDeprecation
private
def
toggleBelowApiLevel17
(
context
:
Context
)
{
// Android 4.2 below
Settings
.
System
.
putInt
(
context
.
getContentResolver
,
Settings
.
System
.
AIRPLANE_MODE_ON
,
1
)
...
...
@@ -197,7 +198,7 @@ object Utils {
}
}
}
catch
{
case
e
:
Exception
=>
None
case
e
:
Exception
=>
}
None
}
...
...
@@ -232,7 +233,7 @@ object Utils {
None
}
lazy
val
isNumericMethod
=
classOf
[
InetAddress
].
getMethod
(
"isNumeric"
,
classOf
[
String
])
private
lazy
val
isNumericMethod
=
classOf
[
InetAddress
].
getMethod
(
"isNumeric"
,
classOf
[
String
])
def
isNumeric
(
address
:
String
)
:
Boolean
=
isNumericMethod
.
invoke
(
null
,
address
).
asInstanceOf
[
Boolean
]
/**
...
...
@@ -338,7 +339,7 @@ object Utils {
def
getAppIcon
(
c
:
Context
,
packageName
:
String
)
:
Drawable
=
{
val
pm
:
PackageManager
=
c
.
getPackageManager
val
icon
:
Drawable
=
c
.
getResources
.
getDrawable
(
android
.
R
.
drawable
.
sym_def_app_icon
)
val
icon
:
Drawable
=
ContextCompat
.
getDrawable
(
c
,
android
.
R
.
drawable
.
sym_def_app_icon
)
try
{
pm
.
getApplicationIcon
(
packageName
)
}
catch
{
...
...
@@ -348,7 +349,7 @@ object Utils {
def
getAppIcon
(
c
:
Context
,
uid
:
Int
)
:
Drawable
=
{
val
pm
:
PackageManager
=
c
.
getPackageManager
val
icon
:
Drawable
=
c
.
getResources
.
getDrawable
(
android
.
R
.
drawable
.
sym_def_app_icon
)
val
icon
:
Drawable
=
ContextCompat
.
getDrawable
(
c
,
android
.
R
.
drawable
.
sym_def_app_icon
)
val
packages
:
Array
[
String
]
=
pm
.
getPackagesForUid
(
uid
)
if
(
packages
!=
null
)
{
if
(
packages
.
length
>=
1
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment