Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e04734b9b | ||
|
|
fe33997494 | ||
|
|
86cd49d3e1 | ||
|
|
ff13792192 | ||
|
|
f36a8c784d | ||
|
|
57f8c0f307 | ||
|
|
601c227644 | ||
|
|
220143aee1 | ||
|
|
81a19c4a81 | ||
|
|
27cc53baf8 | ||
|
|
935fddcb15 | ||
|
|
49458080a1 | ||
|
|
8101fc935e | ||
|
|
491ebe500f | ||
|
|
98ce68774a | ||
|
|
b0e20552dd | ||
|
|
0d478cfbc4 | ||
|
|
d1d135ccdd | ||
|
|
a28303ee76 | ||
|
|
2b09ebcd2c | ||
|
|
59ede2586a | ||
|
|
abd1d0220c | ||
|
|
5427e00012 | ||
|
|
7f226d3f0c | ||
|
|
ee3f3c2338 | ||
|
|
6ac90abbf7 | ||
|
|
2f553b156a | ||
|
|
dec098fbc5 | ||
|
|
000d03ad4c | ||
|
|
667619f701 | ||
|
|
afd91b7155 | ||
|
|
e10272c8e5 |
+3
-3
@@ -1,3 +1,3 @@
|
|||||||
[submodule "src/main/jni/shadowsocks"]
|
[submodule "src/main/jni/shadowsocks-libev"]
|
||||||
path = src/main/jni/shadowsocks
|
path = src/main/jni/shadowsocks-libev
|
||||||
url = https://github.com/madeye/shadowsocks-libev
|
url = https://github.com/shadowsocks/shadowsocks-libev
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ ndkJavah in Android := List()
|
|||||||
|
|
||||||
ndkBuild in Android := List()
|
ndkBuild in Android := List()
|
||||||
|
|
||||||
|
typedResources in Android := false
|
||||||
|
|
||||||
resolvers += "JRAF" at "http://JRAF.org/static/maven/2"
|
resolvers += "JRAF" at "http://JRAF.org/static/maven/2"
|
||||||
|
|
||||||
resolvers += "madeye private releases" at "http://madeye-maven-repository.googlecode.com/git/"
|
resolvers += "madeye private releases" at "http://madeye-maven-repository.googlecode.com/git/"
|
||||||
@@ -27,12 +29,13 @@ libraryDependencies ++= Seq(
|
|||||||
|
|
||||||
libraryDependencies ++= Seq(
|
libraryDependencies ++= Seq(
|
||||||
"net.simonvt.menudrawer" % "menudrawer" % "3.0.6",
|
"net.simonvt.menudrawer" % "menudrawer" % "3.0.6",
|
||||||
"com.google.android.gms" % "play-services" % "6.1.71",
|
"com.google.android.gms" % "play-services-base" % "6.5.87",
|
||||||
|
"com.google.android.gms" % "play-services-ads" % "6.5.87",
|
||||||
"com.android.support" % "support-v4" % "21.0.3"
|
"com.android.support" % "support-v4" % "21.0.3"
|
||||||
)
|
)
|
||||||
|
|
||||||
libraryDependencies ++= Seq(
|
libraryDependencies ++= Seq(
|
||||||
"de.keyboardsurfer.android.widget" % "crouton" % "1.8.4" exclude("com.google.android", "support-v4"),
|
"com.github.mrengineer13" % "snackbar" % "0.5.0",
|
||||||
"com.nostra13.universalimageloader" % "universal-image-loader" % "1.8.4",
|
"com.nostra13.universalimageloader" % "universal-image-loader" % "1.8.4",
|
||||||
"com.j256.ormlite" % "ormlite-core" % "4.47",
|
"com.j256.ormlite" % "ormlite-core" % "4.47",
|
||||||
"com.j256.ormlite" % "ormlite-android" % "4.47"
|
"com.j256.ormlite" % "ormlite-android" % "4.47"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.github.shadowsocks"
|
package="com.github.shadowsocks"
|
||||||
android:versionCode="93"
|
android:versionCode="101"
|
||||||
android:versionName="2.5.4">
|
android:versionName="2.6.3">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
|||||||
+44
-22
@@ -61,8 +61,8 @@ SODIUM_SOURCE := $(crypto_aead_src) $(crypto_auth_src) $(crypto_box_src) \
|
|||||||
$(crypto_stream_src) $(crypto_verify_src) $(randombytes_src) $(sodium_src)
|
$(crypto_stream_src) $(crypto_verify_src) $(randombytes_src) $(sodium_src)
|
||||||
|
|
||||||
LOCAL_MODULE := sodium
|
LOCAL_MODULE := sodium
|
||||||
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include \
|
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include/sodium \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include/sodium \
|
||||||
-DPACKAGE_NAME=\"libsodium\" -DPACKAGE_TARNAME=\"libsodium\" \
|
-DPACKAGE_NAME=\"libsodium\" -DPACKAGE_TARNAME=\"libsodium\" \
|
||||||
-DPACKAGE_VERSION=\"1.0.1\" -DPACKAGE_STRING=\"libsodium\ 1.0.1\" \
|
-DPACKAGE_VERSION=\"1.0.1\" -DPACKAGE_STRING=\"libsodium\ 1.0.1\" \
|
||||||
-DPACKAGE_BUGREPORT=\"https://github.com/jedisct1/libsodium/issues\" \
|
-DPACKAGE_BUGREPORT=\"https://github.com/jedisct1/libsodium/issues\" \
|
||||||
@@ -79,7 +79,7 @@ LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include
|
|||||||
-DHAVE_WEAK_SYMBOLS=1 -DHAVE_ARC4RANDOM=1 -DHAVE_ARC4RANDOM_BUF=1 \
|
-DHAVE_WEAK_SYMBOLS=1 -DHAVE_ARC4RANDOM=1 -DHAVE_ARC4RANDOM_BUF=1 \
|
||||||
-DHAVE_MLOCK=1 -DHAVE_MPROTECT=1 -DHAVE_POSIX_MEMALIGN=1
|
-DHAVE_MLOCK=1 -DHAVE_MPROTECT=1 -DHAVE_POSIX_MEMALIGN=1
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(addprefix shadowsocks/libsodium/src/libsodium/,$(SODIUM_SOURCE))
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libsodium/src/libsodium/,$(SODIUM_SOURCE))
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
@@ -126,10 +126,10 @@ set_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \
|
|||||||
IPSET_SOURCE := general.c $(bdd_src) $(map_src) $(set_src)
|
IPSET_SOURCE := general.c $(bdd_src) $(map_src) $(set_src)
|
||||||
|
|
||||||
LOCAL_MODULE := libipset
|
LOCAL_MODULE := libipset
|
||||||
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks/libipset/include \
|
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks-libev/libipset/include \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libcork/include
|
-I$(LOCAL_PATH)/shadowsocks-libev/libcork/include
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(addprefix shadowsocks/libipset/,$(IPSET_SOURCE))
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libipset/,$(IPSET_SOURCE))
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
@@ -153,10 +153,29 @@ pthreads_src := pthreads/thread.c
|
|||||||
CORK_SOURCE := $(cli_src) $(core_src) $(ds_src) $(posix_src) $(pthreads_src)
|
CORK_SOURCE := $(cli_src) $(core_src) $(ds_src) $(posix_src) $(pthreads_src)
|
||||||
|
|
||||||
LOCAL_MODULE := libcork
|
LOCAL_MODULE := libcork
|
||||||
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks/libcork/include \
|
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
|
||||||
-DCORK_API=CORK_LOCAL
|
-DCORK_API=CORK_LOCAL
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(addprefix shadowsocks/libcork/,$(CORK_SOURCE))
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libcork/,$(CORK_SOURCE))
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
## libudns
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
UDNS_SOURCES := udns_dn.c udns_dntosp.c udns_parse.c udns_resolver.c udns_init.c \
|
||||||
|
udns_misc.c udns_XtoX.c \
|
||||||
|
udns_rr_a.c udns_rr_ptr.c udns_rr_mx.c udns_rr_txt.c udns_bl.c \
|
||||||
|
udns_rr_srv.c udns_rr_naptr.c udns_codes.c udns_jran.c
|
||||||
|
|
||||||
|
LOCAL_MODULE := libudns
|
||||||
|
LOCAL_CFLAGS += -O2 -I$(LOCAL_PATH)/shadowsocks-libev/libudns \
|
||||||
|
-DHAVE_DECL_INET_NTOP
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/libudns/,$(UDNS_SOURCES))
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
@@ -210,48 +229,51 @@ LOCAL_CFLAGS := -Wall -O2 -I$(LOCAL_PATH)/pdnsd
|
|||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
## shadowsocks local library
|
## shadowsocks-libev local library
|
||||||
########################################################
|
########################################################
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
SHADOWSOCKS_SOURCES := local.c cache.c udprelay.c encrypt.c utils.c json.c jconf.c acl.c
|
SHADOWSOCKS_SOURCES := local.c cache.c udprelay.c encrypt.c utils.c netutils.c json.c jconf.c acl.c
|
||||||
|
|
||||||
LOCAL_MODULE := ss-local
|
LOCAL_MODULE := ss-local
|
||||||
LOCAL_SRC_FILES := $(addprefix shadowsocks/src/, $(SHADOWSOCKS_SOURCES))
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
|
||||||
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL \
|
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL \
|
||||||
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H \
|
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H \
|
||||||
-I$(LOCAL_PATH)/libev/ \
|
-I$(LOCAL_PATH)/libev/ \
|
||||||
-I$(LOCAL_PATH)/openssl/include \
|
-I$(LOCAL_PATH)/openssl/include \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libcork/include \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libudns \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include/sodium \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libipset/include
|
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include/sodium \
|
||||||
|
-I$(LOCAL_PATH)/shadowsocks-libev/libipset/include
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libev libcrypto libipset libcork libsodium
|
LOCAL_STATIC_LIBRARIES := libev libcrypto libipset libcork libudns libsodium
|
||||||
|
|
||||||
LOCAL_LDLIBS := -llog
|
LOCAL_LDLIBS := -llog
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
## shadowsocks tunnel
|
## shadowsocks-libev tunnel
|
||||||
########################################################
|
########################################################
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
SHADOWSOCKS_SOURCES := tunnel.c cache.c udprelay.c encrypt.c utils.c json.c jconf.c
|
SHADOWSOCKS_SOURCES := tunnel.c cache.c udprelay.c encrypt.c utils.c netutils.c json.c jconf.c
|
||||||
|
|
||||||
LOCAL_MODULE := ss-tunnel
|
LOCAL_MODULE := ss-tunnel
|
||||||
LOCAL_SRC_FILES := $(addprefix shadowsocks/src/, $(SHADOWSOCKS_SOURCES))
|
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
|
||||||
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL -DUDPRELAY_TUNNEL \
|
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL -DUDPRELAY_TUNNEL \
|
||||||
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \
|
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \
|
||||||
-I$(LOCAL_PATH)/libev/ \
|
-I$(LOCAL_PATH)/libev/ \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libudns \
|
||||||
-I$(LOCAL_PATH)/shadowsocks/libsodium/src/libsodium/include/sodium \
|
-I$(LOCAL_PATH)/shadowsocks-libev/libcork/include \
|
||||||
|
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include \
|
||||||
|
-I$(LOCAL_PATH)/shadowsocks-libev/libsodium/src/libsodium/include/sodium \
|
||||||
-I$(LOCAL_PATH)/openssl/include
|
-I$(LOCAL_PATH)/openssl/include
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := libev libcrypto libsodium
|
LOCAL_STATIC_LIBRARIES := libev libcrypto libsodium libcork libudns
|
||||||
|
|
||||||
LOCAL_LDLIBS := -llog
|
LOCAL_LDLIBS := -llog
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ static void
|
|||||||
ev_arc4random_buf(void *buf, size_t n)
|
ev_arc4random_buf(void *buf, size_t n)
|
||||||
{
|
{
|
||||||
#if defined(_EVENT_HAVE_ARC4RANDOM_BUF) && !defined(__APPLE__)
|
#if defined(_EVENT_HAVE_ARC4RANDOM_BUF) && !defined(__APPLE__)
|
||||||
return arc4random_buf(buf, n);
|
arc4random_buf(buf, n);
|
||||||
|
return;
|
||||||
#else
|
#else
|
||||||
unsigned char *b = buf;
|
unsigned char *b = buf;
|
||||||
|
|
||||||
@@ -71,7 +72,8 @@ ev_arc4random_buf(void *buf, size_t n)
|
|||||||
* trickery.)
|
* trickery.)
|
||||||
*/
|
*/
|
||||||
if (arc4random_buf != NULL) {
|
if (arc4random_buf != NULL) {
|
||||||
return arc4random_buf(buf, n);
|
arc4random_buf(buf, n);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Make sure that we start out with b at a 4-byte alignment; plenty
|
/* Make sure that we start out with b at a 4-byte alignment; plenty
|
||||||
|
|||||||
@@ -25,11 +25,11 @@
|
|||||||
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
||||||
* major minor fix final patch/beta)
|
* major minor fix final patch/beta)
|
||||||
*/
|
*/
|
||||||
#define OPENSSL_VERSION_NUMBER 0x1000103fL
|
#define OPENSSL_VERSION_NUMBER 0x100010afL
|
||||||
#ifdef OPENSSL_FIPS
|
#ifdef OPENSSL_FIPS
|
||||||
#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1c-fips 10 May 2012"
|
#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1j-fips 15 Oct 2014"
|
||||||
#else
|
#else
|
||||||
#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1c 10 May 2012"
|
#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1j 15 Oct 2014"
|
||||||
#endif
|
#endif
|
||||||
#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
|
#define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
|
||||||
|
|
||||||
|
|||||||
Submodule src/main/jni/shadowsocks deleted from 561c28b573
Submodule
+1
Submodule src/main/jni/shadowsocks-libev added at 77d3ecabdd
@@ -0,0 +1,8 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
<item android:id="@+id/action_export"
|
||||||
|
android:title="@string/action_export"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
<item android:id="@+id/action_import"
|
||||||
|
android:title="@string/action_import"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
@@ -10,13 +10,13 @@
|
|||||||
<string name="profile">配置文件</string>
|
<string name="profile">配置文件</string>
|
||||||
<string name="profile_summary">配置文件名称</string>
|
<string name="profile_summary">配置文件名称</string>
|
||||||
<string name="proxy">服务器</string>
|
<string name="proxy">服务器</string>
|
||||||
<string name="proxy_summary">您的影梭服务器的地址</string>
|
<string name="proxy_summary">远程服务器的地址</string>
|
||||||
<string name="remote_port">远程端口</string>
|
<string name="remote_port">远程端口</string>
|
||||||
<string name="remote_port_summary">您的影梭服务器的端口号</string>
|
<string name="remote_port_summary">远程服务器的端口号</string>
|
||||||
<string name="port">本地端口</string>
|
<string name="port">本地端口</string>
|
||||||
<string name="port_summary">您的影梭客户端的端口号</string>
|
<string name="port_summary">本地客户端的端口号</string>
|
||||||
<string name="sitekey">密码</string>
|
<string name="sitekey">密码</string>
|
||||||
<string name="sitekey_summary">您的影梭服务器的密码</string>
|
<string name="sitekey_summary">远程服务器的密码</string>
|
||||||
<string name="enc_method">加密方法</string>
|
<string name="enc_method">加密方法</string>
|
||||||
<string name="feature_cat">功能设置</string>
|
<string name="feature_cat">功能设置</string>
|
||||||
<string name="http_proxy">HTTP 代理服务器</string>
|
<string name="http_proxy">HTTP 代理服务器</string>
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
<string name="service_failed">无法连接远程服务器</string>
|
<string name="service_failed">无法连接远程服务器</string>
|
||||||
<string name="stop">停止服务</string>
|
<string name="stop">停止服务</string>
|
||||||
<string name="stopping">正在关闭...</string>
|
<string name="stopping">正在关闭...</string>
|
||||||
<string name="vpn_error">后台服务启动失败:\"%s\"。</string>
|
<string name="vpn_error">后台服务启动失败:%s</string>
|
||||||
<string name="ok_iknow">确定</string>
|
<string name="ok_iknow">确定</string>
|
||||||
<string name="port_alert">端口号应大于1024</string>
|
<string name="port_alert">端口号应大于1024</string>
|
||||||
<string name="port_empty">端口号不能为空</string>
|
<string name="port_empty">端口号不能为空</string>
|
||||||
@@ -88,4 +88,12 @@
|
|||||||
<item>绕过局域网及中国大陆地址</item>
|
<item>绕过局域网及中国大陆地址</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string name="action_export">导出至剪贴板</string>
|
||||||
|
<string name="action_import">从剪贴板导入</string>
|
||||||
|
<string name="action_export_msg">导出成功</string>
|
||||||
|
<string name="action_export_err">导出失败</string>
|
||||||
|
<string name="action_import_msg">导入成功</string>
|
||||||
|
<string name="action_import_err">导入失败</string>
|
||||||
|
<string name="error">错误</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
+9274
-9681
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<color name="title_background">#ff5e5e5e</color>
|
<color name="title_background">#ff5e5e5e</color>
|
||||||
<color name="dialog_title_background">#17170443</color>
|
<color name="dialog_title_background">#17170443</color>
|
||||||
|
<color name="white">#FFFFFF</color>
|
||||||
<color name="black">#000000</color>
|
<color name="black">#000000</color>
|
||||||
<color name="grey1">#646464</color>
|
<color name="grey1">#646464</color>
|
||||||
<color name="grey2">#c8c8c8</color>
|
<color name="grey2">#c8c8c8</color>
|
||||||
@@ -11,4 +12,4 @@
|
|||||||
<color name="md__transparent">#00000000</color>
|
<color name="md__transparent">#00000000</color>
|
||||||
<color name="md__defaultBackground">#FF555555</color>
|
<color name="md__defaultBackground">#FF555555</color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -14,13 +14,13 @@
|
|||||||
<string name="profile">Profile</string>
|
<string name="profile">Profile</string>
|
||||||
<string name="profile_summary">Profile name</string>
|
<string name="profile_summary">Profile name</string>
|
||||||
<string name="proxy">Server</string>
|
<string name="proxy">Server</string>
|
||||||
<string name="proxy_summary">Hostname or IP Address of your Shadowsocks server</string>
|
<string name="proxy_summary">Hostname or IP of the remote server</string>
|
||||||
<string name="remote_port">Remote Port</string>
|
<string name="remote_port">Remote Port</string>
|
||||||
<string name="remote_port_summary">Port number of your Shadowsocks server</string>
|
<string name="remote_port_summary">Port number of the remote server</string>
|
||||||
<string name="port">Local Port</string>
|
<string name="port">Local Port</string>
|
||||||
<string name="port_summary">Port number of your Shadowsocks client</string>
|
<string name="port_summary">Port number of the local server</string>
|
||||||
<string name="sitekey">Password</string>
|
<string name="sitekey">Password</string>
|
||||||
<string name="sitekey_summary">Password of your Shadowsocks server</string>
|
<string name="sitekey_summary">Password of the remote server</string>
|
||||||
<string name="enc_method">Encrypt Method</string>
|
<string name="enc_method">Encrypt Method</string>
|
||||||
|
|
||||||
<!-- feature category -->
|
<!-- feature category -->
|
||||||
@@ -58,9 +58,10 @@
|
|||||||
<string name="service_failed">Failed to connect the remote server</string>
|
<string name="service_failed">Failed to connect the remote server</string>
|
||||||
<string name="stop">Stop the service</string>
|
<string name="stop">Stop the service</string>
|
||||||
<string name="stopping">Shutting down...</string>
|
<string name="stopping">Shutting down...</string>
|
||||||
<string name="vpn_error">Error: \"%s\".</string>
|
<string name="vpn_error">%s</string>
|
||||||
<string name="enable_nat">Turn on NAT mode.</string>
|
<string name="enable_nat">Turn on NAT mode.</string>
|
||||||
<string name="disable_nat">Turn off NAT mode.</string>
|
<string name="disable_nat">Turn off NAT mode.</string>
|
||||||
|
<string name="error">ERROR</string>
|
||||||
|
|
||||||
<!-- alert category -->
|
<!-- alert category -->
|
||||||
<string name="ok_iknow">OK</string>
|
<string name="ok_iknow">OK</string>
|
||||||
@@ -86,6 +87,12 @@
|
|||||||
<string name="flush_dnscache">Flush DNS Cache</string>
|
<string name="flush_dnscache">Flush DNS Cache</string>
|
||||||
<string name="flushing">Flushing</string>
|
<string name="flushing">Flushing</string>
|
||||||
<string name="add_profile">Add Profile</string>
|
<string name="add_profile">Add Profile</string>
|
||||||
|
<string name="action_export">Export to Clipboard</string>
|
||||||
|
<string name="action_import">Import from Clipboard</string>
|
||||||
|
<string name="action_export_msg">Successfully export!</string>
|
||||||
|
<string name="action_export_err">Failed to export.</string>
|
||||||
|
<string name="action_import_msg">Successfully import!</string>
|
||||||
|
<string name="action_import_err">Failed to import.</string>
|
||||||
|
|
||||||
<!-- profile -->
|
<!-- profile -->
|
||||||
<string name="add_profile_dialog">Add this Shadowsocks Profile?</string>
|
<string name="add_profile_dialog">Add this Shadowsocks Profile?</string>
|
||||||
|
|||||||
@@ -29,10 +29,10 @@
|
|||||||
<item name="android:actionModeBackground">@drawable/cab_background_top_shadow</item>
|
<item name="android:actionModeBackground">@drawable/cab_background_top_shadow</item>
|
||||||
<item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_shadow</item>
|
<item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_shadow</item>
|
||||||
<item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Shadow</item>
|
<item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Shadow</item>
|
||||||
|
<!-- Light.DarkActionBar specific -->
|
||||||
<!-- Light.DarkActionBar specific -->
|
|
||||||
<item name="android:actionBarWidgetTheme">@style/Theme.Shadow.Widget</item>
|
<item name="android:actionBarWidgetTheme">@style/Theme.Shadow.Widget</item>
|
||||||
|
<item name="android:textAppearanceLargePopupMenu">@style/m_textAppearanceLargePopupMenu</item>
|
||||||
|
<item name="android:textAppearanceSmallPopupMenu" >@style/m_textAppearanceSmallPopupMenu</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="ActionBar.Solid.Shadow" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
|
<style name="ActionBar.Solid.Shadow" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
|
||||||
@@ -51,6 +51,14 @@
|
|||||||
<item name="android:popupBackground">@drawable/menu_dropdown_panel_shadow</item>
|
<item name="android:popupBackground">@drawable/menu_dropdown_panel_shadow</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="m_textAppearanceSmallPopupMenu" parent="@android:style/TextAppearance.Holo.Widget.PopupMenu.Small">
|
||||||
|
<item name="android:textColor">@android:color/white</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="m_textAppearanceLargePopupMenu" parent="@android:style/TextAppearance.Holo.Widget.PopupMenu.Large">
|
||||||
|
<item name="android:textColor">@android:color/white</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="DropDownListView.Shadow" parent="@android:style/Widget.Holo.ListView.DropDown">
|
<style name="DropDownListView.Shadow" parent="@android:style/Widget.Holo.ListView.DropDown">
|
||||||
<item name="android:listSelector">@drawable/selectable_background_shadow</item>
|
<item name="android:listSelector">@drawable/selectable_background_shadow</item>
|
||||||
</style>
|
</style>
|
||||||
@@ -77,6 +85,9 @@
|
|||||||
<style name="Theme.Shadow.Widget" parent="@android:style/Theme.Holo">
|
<style name="Theme.Shadow.Widget" parent="@android:style/Theme.Holo">
|
||||||
<item name="android:popupMenuStyle">@style/PopupMenu.Shadow</item>
|
<item name="android:popupMenuStyle">@style/PopupMenu.Shadow</item>
|
||||||
<item name="android:dropDownListViewStyle">@style/DropDownListView.Shadow</item>
|
<item name="android:dropDownListViewStyle">@style/DropDownListView.Shadow</item>
|
||||||
|
<item name="android:textColor">@android:color/white</item>
|
||||||
|
<item name="android:textAppearanceLargePopupMenu">@style/m_textAppearanceLargePopupMenu</item>
|
||||||
|
<item name="android:textAppearanceSmallPopupMenu" >@style/m_textAppearanceSmallPopupMenu</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -40,6 +40,8 @@
|
|||||||
package com.github.shadowsocks
|
package com.github.shadowsocks
|
||||||
|
|
||||||
import android.app.{Activity, ProgressDialog}
|
import android.app.{Activity, ProgressDialog}
|
||||||
|
import android.content.ClipboardManager
|
||||||
|
import android.content.ClipData
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
@@ -47,6 +49,8 @@ import android.graphics.{Bitmap, PixelFormat}
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.OnClickListener
|
import android.view.View.OnClickListener
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -115,7 +119,7 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
|
|||||||
var appsLoaded: Boolean = false
|
var appsLoaded: Boolean = false
|
||||||
|
|
||||||
def loadApps(context: Context): Array[ProxiedApp] = {
|
def loadApps(context: Context): Array[ProxiedApp] = {
|
||||||
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
val proxiedAppString = prefs.getString(Key.proxied, "")
|
val proxiedAppString = prefs.getString(Key.proxied, "")
|
||||||
val proxiedApps = proxiedAppString.split('|').sortWith(_ < _)
|
val proxiedApps = proxiedAppString.split('|').sortWith(_ < _)
|
||||||
|
|
||||||
@@ -218,6 +222,53 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override def onOptionsItemSelected(item: MenuItem): Boolean = {
|
||||||
|
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE).asInstanceOf[ClipboardManager]
|
||||||
|
val prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext)
|
||||||
|
item.getItemId match {
|
||||||
|
case R.id.action_export =>
|
||||||
|
val bypass = prefs.getBoolean(Key.isBypassApps, false)
|
||||||
|
val proxiedAppString = prefs.getString(Key.proxied, "")
|
||||||
|
val clip = ClipData.newPlainText(Key.proxied, bypass + " " + proxiedAppString)
|
||||||
|
clipboard.setPrimaryClip(clip)
|
||||||
|
Toast.makeText(this, R.string.action_export_msg, Toast.LENGTH_SHORT).show()
|
||||||
|
return true
|
||||||
|
case R.id.action_import =>
|
||||||
|
if (clipboard.hasPrimaryClip) {
|
||||||
|
val clipdata = clipboard.getPrimaryClip
|
||||||
|
val label = clipdata.getDescription.getLabel
|
||||||
|
if (label == Key.proxied) {
|
||||||
|
val proxiedAppSequence = clipdata.getItemAt(0).getText
|
||||||
|
if (proxiedAppSequence != null) {
|
||||||
|
val proxiedAppString = proxiedAppSequence.toString
|
||||||
|
if (!proxiedAppString.isEmpty) {
|
||||||
|
val array = proxiedAppString.split(" ")
|
||||||
|
val bypass = array(0).toBoolean
|
||||||
|
val apps = if (array.size > 1) array(1) else ""
|
||||||
|
prefs.edit.putBoolean(Key.isBypassApps, bypass).commit()
|
||||||
|
prefs.edit.putString(Key.proxied, apps).commit()
|
||||||
|
Toast.makeText(this, R.string.action_import_msg, Toast.LENGTH_SHORT).show()
|
||||||
|
// Restart activity
|
||||||
|
val intent = getIntent
|
||||||
|
finish()
|
||||||
|
startActivity(intent)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Toast.makeText(this, R.string.action_import_err, Toast.LENGTH_SHORT).show()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override def onCreateOptionsMenu(menu: Menu): Boolean = {
|
||||||
|
val inflater = getMenuInflater()
|
||||||
|
inflater.inflate(R.menu.app_manager_menu, menu)
|
||||||
|
return super.onCreateOptionsMenu(menu)
|
||||||
|
}
|
||||||
|
|
||||||
protected override def onCreate(savedInstanceState: Bundle) {
|
protected override def onCreate(savedInstanceState: Bundle) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -239,7 +290,7 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
|
|||||||
ImageLoader.getInstance().init(config)
|
ImageLoader.getInstance().init(config)
|
||||||
|
|
||||||
val bypassSwitch = findViewById(R.id.bypassSwitch).asInstanceOf[Switch]
|
val bypassSwitch = findViewById(R.id.bypassSwitch).asInstanceOf[Switch]
|
||||||
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext)
|
||||||
bypassSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener {
|
bypassSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener {
|
||||||
def onCheckedChanged(button: CompoundButton, checked: Boolean) {
|
def onCheckedChanged(button: CompoundButton, checked: Boolean) {
|
||||||
prefs.edit().putBoolean(Key.isBypassApps, checked).commit()
|
prefs.edit().putBoolean(Key.isBypassApps, checked).commit()
|
||||||
@@ -261,7 +312,7 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
|
|||||||
|
|
||||||
def saveAppSettings(context: Context) {
|
def saveAppSettings(context: Context) {
|
||||||
if (apps == null) return
|
if (apps == null) return
|
||||||
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
val proxiedApps = new StringBuilder
|
val proxiedApps = new StringBuilder
|
||||||
apps.foreach(app =>
|
apps.foreach(app =>
|
||||||
if (app.proxied) {
|
if (app.proxied) {
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ import android.content.Context
|
|||||||
|
|
||||||
trait BaseService {
|
trait BaseService {
|
||||||
|
|
||||||
@volatile var state = State.INIT
|
@volatile private var state = State.INIT
|
||||||
@volatile var callbackCount = 0
|
@volatile private var callbackCount = 0
|
||||||
|
|
||||||
final val callbacks = new RemoteCallbackList[IShadowsocksServiceCallback]
|
final val callbacks = new RemoteCallbackList[IShadowsocksServiceCallback]
|
||||||
|
|
||||||
@@ -100,6 +100,12 @@ trait BaseService {
|
|||||||
def getTag: String
|
def getTag: String
|
||||||
def getContext: Context
|
def getContext: Context
|
||||||
|
|
||||||
|
def getCallbackCount(): Int = {
|
||||||
|
callbackCount
|
||||||
|
}
|
||||||
|
def getState(): Int = {
|
||||||
|
state
|
||||||
|
}
|
||||||
def changeState(s: Int) {
|
def changeState(s: Int) {
|
||||||
changeState(s, null)
|
changeState(s, null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import android.view.View.OnLongClickListener
|
|||||||
import android.view._
|
import android.view._
|
||||||
import android.webkit.{WebView, WebViewClient}
|
import android.webkit.{WebView, WebViewClient}
|
||||||
import android.widget._
|
import android.widget._
|
||||||
|
import com.github.mrengineer13.snackbar._
|
||||||
import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback}
|
import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback}
|
||||||
import com.github.shadowsocks.database._
|
import com.github.shadowsocks.database._
|
||||||
import com.github.shadowsocks.preferences.{PasswordEditTextPreference, ProfileEditTextPreference, SummaryEditTextPreference}
|
import com.github.shadowsocks.preferences.{PasswordEditTextPreference, ProfileEditTextPreference, SummaryEditTextPreference}
|
||||||
@@ -64,7 +65,6 @@ import com.google.android.gms.ads.{AdRequest, AdSize, AdView}
|
|||||||
import com.google.android.gms.analytics.HitBuilders
|
import com.google.android.gms.analytics.HitBuilders
|
||||||
import com.google.zxing.integration.android.IntentIntegrator
|
import com.google.zxing.integration.android.IntentIntegrator
|
||||||
import com.nostra13.universalimageloader.core.download.BaseImageDownloader
|
import com.nostra13.universalimageloader.core.download.BaseImageDownloader
|
||||||
import de.keyboardsurfer.android.widget.crouton.{Configuration, Crouton, Style}
|
|
||||||
import net.simonvt.menudrawer.MenuDrawer
|
import net.simonvt.menudrawer.MenuDrawer
|
||||||
|
|
||||||
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
|
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
|
||||||
@@ -205,7 +205,6 @@ class Shadowsocks
|
|||||||
// Update the UI
|
// Update the UI
|
||||||
if (switchButton != null) switchButton.setEnabled(true)
|
if (switchButton != null) switchButton.setEnabled(true)
|
||||||
if (State.isAvailable(bgService.getState)) {
|
if (State.isAvailable(bgService.getState)) {
|
||||||
Crouton.cancelAllCroutons()
|
|
||||||
setPreferenceEnabled(enabled = true)
|
setPreferenceEnabled(enabled = true)
|
||||||
} else {
|
} else {
|
||||||
changeSwitch(checked = true)
|
changeSwitch(checked = true)
|
||||||
@@ -367,7 +366,7 @@ class Shadowsocks
|
|||||||
|
|
||||||
def isTextEmpty(s: String, msg: String): Boolean = {
|
def isTextEmpty(s: String, msg: String): Boolean = {
|
||||||
if (s == null || s.length <= 0) {
|
if (s == null || s.length <= 0) {
|
||||||
Crouton.makeText(this, msg, Style.ALERT).show()
|
new SnackBar.Builder(this).withMessage(msg).withStyle(SnackBar.Style.ALERT).show()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
@@ -828,7 +827,6 @@ class Shadowsocks
|
|||||||
override def onDestroy() {
|
override def onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
deattachService()
|
deattachService()
|
||||||
Crouton.cancelAllCroutons()
|
|
||||||
unregisterReceiver(preferenceReceiver)
|
unregisterReceiver(preferenceReceiver)
|
||||||
new BackupManager(this).dataChanged()
|
new BackupManager(this).dataChanged()
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
@@ -927,12 +925,12 @@ class Shadowsocks
|
|||||||
try {
|
try {
|
||||||
val port: Int = Integer.valueOf(text)
|
val port: Int = Integer.valueOf(text)
|
||||||
if (!low && port <= 1024) {
|
if (!low && port <= 1024) {
|
||||||
Crouton.makeText(this, R.string.port_alert, Style.ALERT).show()
|
new SnackBar.Builder(this).withMessageId(R.string.port_alert).withStyle(SnackBar.Style.ALERT).show()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
case ex: Exception =>
|
case ex: Exception =>
|
||||||
Crouton.makeText(this, R.string.port_alert, Style.ALERT).show()
|
new SnackBar.Builder(this).withMessageId(R.string.port_alert).withStyle(SnackBar.Style.ALERT).show()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
@@ -1014,15 +1012,12 @@ class Shadowsocks
|
|||||||
case State.STOPPED =>
|
case State.STOPPED =>
|
||||||
clearDialog()
|
clearDialog()
|
||||||
changeSwitch(checked = false)
|
changeSwitch(checked = false)
|
||||||
Crouton.cancelAllCroutons()
|
|
||||||
if (m != null) {
|
if (m != null) {
|
||||||
val style = new Style.Builder().setBackgroundColorValue(Style.holoRedLight).build()
|
new SnackBar.Builder(Shadowsocks.this)
|
||||||
val config = new Configuration.Builder()
|
.withMessage(getString(R.string.vpn_error).formatLocal(Locale.ENGLISH, m))
|
||||||
.setDuration(Configuration.DURATION_LONG)
|
.withActionMessageId(R.string.error)
|
||||||
.build()
|
.withStyle(SnackBar.Style.ALERT)
|
||||||
Crouton
|
.withDuration(SnackBar.LONG_SNACK)
|
||||||
.makeText(Shadowsocks.this, getString(R.string.vpn_error).formatLocal(Locale.ENGLISH, m), style)
|
|
||||||
.setConfiguration(config)
|
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
setPreferenceEnabled(enabled = true)
|
setPreferenceEnabled(enabled = true)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import java.io.File
|
|||||||
import java.lang.reflect.{InvocationTargetException, Method}
|
import java.lang.reflect.{InvocationTargetException, Method}
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
import android.app.{Notification, NotificationManager, PendingIntent, Service}
|
import android.app._
|
||||||
import android.content._
|
import android.content._
|
||||||
import android.content.pm.{PackageInfo, PackageManager}
|
import android.content.pm.{PackageInfo, PackageManager}
|
||||||
import android.net.{Network, ConnectivityManager}
|
import android.net.{Network, ConnectivityManager}
|
||||||
@@ -75,6 +75,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
private val mStartForegroundArgs = new Array[AnyRef](2)
|
private val mStartForegroundArgs = new Array[AnyRef](2)
|
||||||
private val mStopForegroundArgs = new Array[AnyRef](1)
|
private val mStopForegroundArgs = new Array[AnyRef](1)
|
||||||
|
|
||||||
|
var lockReceiver: BroadcastReceiver = null
|
||||||
var closeReceiver: BroadcastReceiver = null
|
var closeReceiver: BroadcastReceiver = null
|
||||||
var connReceiver: BroadcastReceiver = null
|
var connReceiver: BroadcastReceiver = null
|
||||||
var notificationManager: NotificationManager = null
|
var notificationManager: NotificationManager = null
|
||||||
@@ -200,6 +201,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
val cmd = new ArrayBuffer[String]
|
val cmd = new ArrayBuffer[String]
|
||||||
cmd += (Path.BASE + "ss-local"
|
cmd += (Path.BASE + "ss-local"
|
||||||
, "-b" , "127.0.0.1"
|
, "-b" , "127.0.0.1"
|
||||||
|
, "-t" , "600"
|
||||||
, "-c" , Path.BASE + "ss-local-nat.conf"
|
, "-c" , Path.BASE + "ss-local-nat.conf"
|
||||||
, "-f" , Path.BASE + "ss-local-nat.pid")
|
, "-f" , Path.BASE + "ss-local-nat.pid")
|
||||||
|
|
||||||
@@ -223,6 +225,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
val cmd = new ArrayBuffer[String]
|
val cmd = new ArrayBuffer[String]
|
||||||
cmd += (Path.BASE + "ss-tunnel"
|
cmd += (Path.BASE + "ss-tunnel"
|
||||||
, "-u"
|
, "-u"
|
||||||
|
, "-t" , "10"
|
||||||
, "-b" , "127.0.0.1"
|
, "-b" , "127.0.0.1"
|
||||||
, "-L" , "8.8.8.8:53"
|
, "-L" , "8.8.8.8:53"
|
||||||
, "-c" , Path.BASE + "ss-tunnel-nat.conf"
|
, "-c" , Path.BASE + "ss-tunnel-nat.conf"
|
||||||
@@ -244,6 +247,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
val cmdBuf = new ArrayBuffer[String]
|
val cmdBuf = new ArrayBuffer[String]
|
||||||
cmdBuf += (Path.BASE + "ss-tunnel"
|
cmdBuf += (Path.BASE + "ss-tunnel"
|
||||||
, "-u"
|
, "-u"
|
||||||
|
, "-t" , "10"
|
||||||
, "-b" , "127.0.0.1"
|
, "-b" , "127.0.0.1"
|
||||||
, "-l" , "8163"
|
, "-l" , "8163"
|
||||||
, "-L" , "8.8.8.8:53"
|
, "-L" , "8.8.8.8:53"
|
||||||
@@ -259,8 +263,9 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
|
|
||||||
val conf = if (config.route == Route.BYPASS_CHN) {
|
val conf = if (config.route == Route.BYPASS_CHN) {
|
||||||
val reject = ConfigUtils.getRejectList(getContext, application)
|
val reject = ConfigUtils.getRejectList(getContext, application)
|
||||||
|
val blackList = ConfigUtils.getBlackList(getContext, application)
|
||||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
|
||||||
Path.BASE + "pdnsd-nat.pid", reject, reject, 8163)
|
Path.BASE + "pdnsd-nat.pid", reject, blackList, 8163)
|
||||||
} else {
|
} else {
|
||||||
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
|
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
|
||||||
Path.BASE + "pdnsd-nat.pid", 8163)
|
Path.BASE + "pdnsd-nat.pid", 8163)
|
||||||
@@ -324,7 +329,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def notifyForegroundAlert(title: String, info: String) {
|
def notifyForegroundAlert(title: String, info: String, visible: Boolean) {
|
||||||
val openIntent = new Intent(this, classOf[Shadowsocks])
|
val openIntent = new Intent(this, classOf[Shadowsocks])
|
||||||
openIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
openIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||||
val contentIntent = PendingIntent.getActivity(this, 0, openIntent, 0)
|
val contentIntent = PendingIntent.getActivity(this, 0, openIntent, 0)
|
||||||
@@ -341,7 +346,11 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
.setSmallIcon(R.drawable.ic_stat_shadowsocks)
|
.setSmallIcon(R.drawable.ic_stat_shadowsocks)
|
||||||
.addAction(android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.stop),
|
.addAction(android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.stop),
|
||||||
actionIntent)
|
actionIntent)
|
||||||
.setPriority(NotificationCompat.PRIORITY_MIN)
|
|
||||||
|
if (visible)
|
||||||
|
builder.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||||
|
else
|
||||||
|
builder.setPriority(NotificationCompat.PRIORITY_MIN)
|
||||||
|
|
||||||
startForegroundCompat(1, builder.build)
|
startForegroundCompat(1, builder.build)
|
||||||
}
|
}
|
||||||
@@ -497,13 +506,41 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
filter.addAction(Intent.ACTION_SHUTDOWN)
|
filter.addAction(Intent.ACTION_SHUTDOWN)
|
||||||
filter.addAction(Action.CLOSE)
|
filter.addAction(Action.CLOSE)
|
||||||
closeReceiver = new BroadcastReceiver() {
|
closeReceiver = new BroadcastReceiver() {
|
||||||
def onReceive(p1: Context, p2: Intent) {
|
def onReceive(context: Context, intent: Intent) {
|
||||||
Toast.makeText(p1, R.string.stopping, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, R.string.stopping, Toast.LENGTH_SHORT).show()
|
||||||
stopRunner()
|
stopRunner()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
registerReceiver(closeReceiver, filter)
|
registerReceiver(closeReceiver, filter)
|
||||||
|
|
||||||
|
if (Utils.isLollipopOrAbove) {
|
||||||
|
val screenFilter = new IntentFilter()
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
registerReceiver(lockReceiver, screenFilter)
|
||||||
|
}
|
||||||
|
|
||||||
// send event
|
// send event
|
||||||
application.tracker.send(new HitBuilders.EventBuilder()
|
application.tracker.send(new HitBuilders.EventBuilder()
|
||||||
.setCategory(TAG)
|
.setCategory(TAG)
|
||||||
@@ -551,7 +588,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
flushDns()
|
flushDns()
|
||||||
|
|
||||||
notifyForegroundAlert(getString(R.string.forward_success),
|
notifyForegroundAlert(getString(R.string.forward_success),
|
||||||
getString(R.string.service_running).formatLocal(Locale.ENGLISH, config.profileName))
|
getString(R.string.service_running).formatLocal(Locale.ENGLISH, config.profileName), true)
|
||||||
changeState(State.CONNECTED)
|
changeState(State.CONNECTED)
|
||||||
} else {
|
} else {
|
||||||
changeState(State.STOPPED, getString(R.string.service_failed))
|
changeState(State.STOPPED, getString(R.string.service_failed))
|
||||||
@@ -572,6 +609,13 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
closeReceiver = null
|
closeReceiver = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Utils.isLollipopOrAbove) {
|
||||||
|
if (lockReceiver != null) {
|
||||||
|
unregisterReceiver(lockReceiver)
|
||||||
|
lockReceiver = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// send event
|
// send event
|
||||||
application.tracker.send(new HitBuilders.EventBuilder()
|
application.tracker.send(new HitBuilders.EventBuilder()
|
||||||
.setCategory(TAG)
|
.setCategory(TAG)
|
||||||
@@ -583,7 +627,7 @@ class ShadowsocksNatService extends Service with BaseService {
|
|||||||
killProcesses()
|
killProcesses()
|
||||||
|
|
||||||
// stop the service if no callback registered
|
// stop the service if no callback registered
|
||||||
if (callbackCount == 0) {
|
if (getCallbackCount == 0) {
|
||||||
stopSelf()
|
stopSelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -116,9 +116,10 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
val cmd = new ArrayBuffer[String]
|
val cmd = new ArrayBuffer[String]
|
||||||
cmd +=(Path.BASE + "ss-local", "-u"
|
cmd +=(Path.BASE + "ss-local", "-u"
|
||||||
, "-b", "127.0.0.1"
|
, "-b" , "127.0.0.1"
|
||||||
, "-c", Path.BASE + "ss-local-vpn.conf"
|
, "-t" , "600"
|
||||||
, "-f", Path.BASE + "ss-local-vpn.pid")
|
, "-c" , Path.BASE + "ss-local-vpn.conf"
|
||||||
|
, "-f" , Path.BASE + "ss-local-vpn.pid")
|
||||||
|
|
||||||
if (Utils.isLollipopOrAbove && config.route != Route.ALL) {
|
if (Utils.isLollipopOrAbove && config.route != Route.ALL) {
|
||||||
cmd += "--acl"
|
cmd += "--acl"
|
||||||
@@ -139,11 +140,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
val cmd = new ArrayBuffer[String]
|
val cmd = new ArrayBuffer[String]
|
||||||
cmd +=(Path.BASE + "ss-tunnel"
|
cmd +=(Path.BASE + "ss-tunnel"
|
||||||
, "-u"
|
, "-u"
|
||||||
, "-b", "127.0.0.1"
|
, "-t" , "10"
|
||||||
, "-l", "8163"
|
, "-b" , "127.0.0.1"
|
||||||
, "-L", "8.8.8.8:53"
|
, "-l" , "8163"
|
||||||
, "-c", Path.BASE + "ss-tunnel-vpn.conf"
|
, "-L" , "8.8.8.8:53"
|
||||||
, "-f", Path.BASE + "ss-tunnel-vpn.pid")
|
, "-c" , Path.BASE + "ss-tunnel-vpn.conf"
|
||||||
|
, "-f" , Path.BASE + "ss-tunnel-vpn.pid")
|
||||||
|
|
||||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||||
Console.runCommand(cmd.mkString(" "))
|
Console.runCommand(cmd.mkString(" "))
|
||||||
@@ -153,8 +155,9 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
val conf = {
|
val conf = {
|
||||||
if (Utils.isLollipopOrAbove && config.route == Route.BYPASS_CHN) {
|
if (Utils.isLollipopOrAbove && config.route == Route.BYPASS_CHN) {
|
||||||
val reject = ConfigUtils.getRejectList(getContext, application)
|
val reject = ConfigUtils.getRejectList(getContext, application)
|
||||||
|
val blackList = ConfigUtils.getBlackList(getContext, application)
|
||||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
|
||||||
Path.BASE + "pdnsd-vpn.pid", reject, reject, 8163)
|
Path.BASE + "pdnsd-vpn.pid", reject, blackList, 8163)
|
||||||
} else {
|
} else {
|
||||||
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
|
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
|
||||||
Path.BASE + "pdnsd-vpn.pid", 8163)
|
Path.BASE + "pdnsd-vpn.pid", 8163)
|
||||||
@@ -477,7 +480,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// stop the service if no callback registered
|
// stop the service if no callback registered
|
||||||
if (callbackCount == 0) {
|
if (getCallbackCount == 0) {
|
||||||
stopSelf()
|
stopSelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,8 @@ object ConfigUtils {
|
|||||||
|server {
|
|server {
|
||||||
| label = "local-server";
|
| label = "local-server";
|
||||||
| ip = 127.0.0.1;
|
| ip = 127.0.0.1;
|
||||||
|
| uptest = none;
|
||||||
|
| preset = on;
|
||||||
| port = %d;
|
| port = %d;
|
||||||
| timeout = 5;
|
| timeout = 5;
|
||||||
|}
|
|}
|
||||||
@@ -143,7 +145,7 @@ object ConfigUtils {
|
|||||||
| cache_dir = "/data/data/com.github.shadowsocks";
|
| cache_dir = "/data/data/com.github.shadowsocks";
|
||||||
| server_ip = %s;
|
| server_ip = %s;
|
||||||
| server_port = %d;
|
| server_port = %d;
|
||||||
| query_method = udp_tcp;
|
| query_method = tcp_only;
|
||||||
| run_ipv4 = on;
|
| run_ipv4 = on;
|
||||||
| min_ttl = 15m;
|
| min_ttl = 15m;
|
||||||
| max_ttl = 1w;
|
| max_ttl = 1w;
|
||||||
@@ -159,22 +161,10 @@ object ConfigUtils {
|
|||||||
| reject = %s;
|
| reject = %s;
|
||||||
| reject_policy = fail;
|
| reject_policy = fail;
|
||||||
| reject_recursively = on;
|
| reject_recursively = on;
|
||||||
| uptest = query;
|
| exclude = %s;
|
||||||
| query_test_name = ".";
|
| policy = included;
|
||||||
| interval = ontimeout;
|
| uptest = none;
|
||||||
|}
|
| preset = on;
|
||||||
|
|
|
||||||
|server {
|
|
||||||
| label= "secure";
|
|
||||||
| port = 443;
|
|
||||||
| ip = 208.67.220.220,113.20.8.17,77.66.84.233,176.56.237.171;
|
|
||||||
| timeout = 3;
|
|
||||||
| reject = %s;
|
|
||||||
| reject_policy = fail;
|
|
||||||
| reject_recursively = on;
|
|
||||||
| uptest = query;
|
|
||||||
| query_test_name = ".";
|
|
||||||
| interval = ontimeout;
|
|
||||||
|}
|
|}
|
||||||
|
|
|
|
||||||
|server {
|
|server {
|
||||||
@@ -218,6 +208,17 @@ object ConfigUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getBlackList(context: Context, app: ShadowsocksApplication): String = {
|
||||||
|
val default = context.getString(R.string.black_list)
|
||||||
|
try {
|
||||||
|
val container = app.containerHolder.getContainer
|
||||||
|
val update = container.getString("black_list")
|
||||||
|
if (update == null || update.isEmpty) default else update
|
||||||
|
} catch {
|
||||||
|
case ex: Exception => default
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def getPublicConfig(context: Context, container: Container, config: Config): Config = {
|
def getPublicConfig(context: Context, container: Container, config: Config): Config = {
|
||||||
val url = container.getString("proxy_url")
|
val url = container.getString("proxy_url")
|
||||||
val sig = Utils.getSignature(context)
|
val sig = Utils.getSignature(context)
|
||||||
|
|||||||
@@ -52,17 +52,21 @@ object Parser {
|
|||||||
if (uri.getScheme == Scheme.SS) {
|
if (uri.getScheme == Scheme.SS) {
|
||||||
val encoded = data.replace(Scheme.SS + "://", "")
|
val encoded = data.replace(Scheme.SS + "://", "")
|
||||||
val content = new String(Base64.decode(encoded, Base64.NO_PADDING), "UTF-8")
|
val content = new String(Base64.decode(encoded, Base64.NO_PADDING), "UTF-8")
|
||||||
val info = content.split('@')
|
val methodIdx = content.indexOf(':')
|
||||||
val encinfo = info(0).split(':')
|
val passwordIdx = content.lastIndexOf('@')
|
||||||
val serverinfo = info(1).split(':')
|
val hostIdx = content.lastIndexOf(':')
|
||||||
|
val method = content.substring(0, methodIdx)
|
||||||
|
val password = content.substring(methodIdx + 1, passwordIdx)
|
||||||
|
val host = content.substring(passwordIdx + 1, hostIdx)
|
||||||
|
val port = content.substring(hostIdx + 1)
|
||||||
|
|
||||||
val profile = new Profile
|
val profile = new Profile
|
||||||
profile.name = serverinfo(0)
|
profile.name = host
|
||||||
profile.host = serverinfo(0)
|
profile.host = host
|
||||||
profile.remotePort = serverinfo(1).toInt
|
profile.remotePort = port.toInt
|
||||||
profile.localPort = 1080
|
profile.localPort = 1080
|
||||||
profile.method = encinfo(0)
|
profile.method = method
|
||||||
profile.password = encinfo(1)
|
profile.password = password
|
||||||
return Some(profile)
|
return Some(profile)
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
Reference in New Issue
Block a user