Compare commits

..
201 Commits
Author SHA1 Message Date
Max Lv a21d099a34 Fix #746 2016-07-08 11:42:10 +08:00
Max Lv ae1e396a5d Update travis-ci 2016-07-06 13:34:34 +08:00
Max Lv 4f79fa16e3 add .jvmopts from @wongsyrone 2016-07-06 13:32:03 +08:00
Max Lv 7a87eab47c Update proguard rules 2016-07-06 12:54:59 +08:00
Mygod 07eb4d2a5c Refine utils.Key for readability 2016-07-05 19:31:58 +08:00
Mygod c480137dec Remove .aidl.Config and persisting SharedPreferences (#742)
Previously a profile can exist in the following forms:

* `.database.Profile` used for everything backend;
* `.ShadowsocksSettings` which uses Preferences to provide UI to tweak settings;
* `.aidl.Config` used for IPC;
* `<data dir>/shared_pref/com.github.shadowsocks_preferences.xml` which exists for no apparent reason.

Thus long code block can be seen whose purpose is simply converting the data from one form to another. This commit intends to remove the latter two by:

1. Using profile ID and take advantage of fs r/w lock SQLite uses for IPC and better extensibility;
2. Stop persisting redundant fields in the preferences file and update database directly.
2016-07-05 01:07:09 -05:00
Max Lv 8515edff60 Update shadowsocks-libev 2016-07-04 12:00:57 +08:00
Mygod 432ab6cc7a Fix the bug where UI is not updated after importing 2016-07-04 10:38:49 +08:00
Max Lv 31ed8480e0 Update libevent 2016-07-04 09:37:26 +08:00
Max Lv 98f1108600 Fix a building issue with clang 2016-07-04 09:35:57 +08:00
Max Lv f8088cd435 Update android ndk 2016-07-03 18:37:09 +08:00
Max Lv 6d78b496ec Fix a typo 2016-07-03 18:35:29 +08:00
Max Lv df09d39139 Add apply-all action 2016-07-03 17:27:50 +08:00
Max Lv 1fe0ab996f Refine native build by @wongsyrone 2016-07-01 16:49:07 +08:00
Max Lv 2adaa71ebf Update android ndk 2016-07-01 16:02:41 +08:00
Max Lv 903a854855 Ignore .d 2016-07-01 14:40:40 +08:00
Max Lv f7db519616 Revert "Roll back to default JVM for travis-ci"
This reverts commit 674efdcf93.
2016-07-01 14:40:03 +08:00
Mygod 5a2dd68080 Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-07-01 14:00:59 +08:00
Mygod 07528bdb8d Add missing translation for bytes 2016-07-01 14:00:45 +08:00
Mygod a07901006f Shrink APK size by 385KB (8.18%)
Before: 4.8 MB (4,821,638 bytes)
After:  4.4 MB (4,427,038 bytes)
2016-07-01 13:59:53 +08:00
Max Lv 674efdcf93 Roll back to default JVM for travis-ci 2016-07-01 13:40:42 +08:00
Mygod f787e795cc Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-07-01 13:27:40 +08:00
Max Lv 42460904ee Enlarge max memory for travis-ci 2016-07-01 13:26:58 +08:00
Mygod 0b3ee8b793 Refine #735
It's impolite to ask for permission over and over again.
2016-07-01 13:26:53 +08:00
Max Lv 8779427a43 Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-07-01 13:18:07 +08:00
Max Lv 67707c0f30 Update dependency 2016-07-01 13:17:50 +08:00
Mygod ba8efb96a9 Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-07-01 13:07:21 +08:00
Mygod 76a42f5b5e Fix quick switch
R/W SharedPreference should be restricted to one process only since it's not process-safe.
2016-07-01 13:06:08 +08:00
Mygod 99fd8f1e69 Fix accessibility issue for title view 2016-07-01 12:56:42 +08:00
Max Lv de92a8503e Update travis-ci 2016-07-01 12:49:19 +08:00
Mygod 333ff40621 Fix #737 by using support vector drawables 2016-07-01 12:42:26 +08:00
Mygod 7e082b3e6d Revert "Roll back to 23.2.0 support libraries, fix #737"
This reverts commit 90e3bb312f.
2016-07-01 10:13:30 +08:00
Max Lv 90e3bb312f Roll back to 23.2.0 support libraries, fix #737 2016-07-01 09:51:22 +08:00
Max Lv bfd85ecb8e Refine black list 2016-06-30 11:01:41 +08:00
Max Lv e9c912b935 Fix #735 2016-06-29 09:53:21 +08:00
Max Lv 4f13acaffe Add missing files 2016-06-27 17:53:08 +08:00
Max Lv b35f3272da Bump version 2016-06-27 15:58:05 +08:00
Max Lv a537a7fc0a Integrate a Barcode Scanner 2016-06-27 15:54:22 +08:00
Charles Kane bd58de6ac3 Improve translations for export toast (#725)
* Improve translations for export toast

* Fix traditional chinese for export toast
2016-06-19 19:57:28 -05:00
Ilya 917e574185 Fix translate for "quick_toggle" (#724) 2016-06-19 04:29:28 -05:00
Mygod 27bf6a2237 Fix connection test not reset in background 2016-06-18 18:26:20 +08:00
Mygod 56de231c4f Refine #530 2016-06-17 17:59:12 +08:00
Max Lv 797b3fda12 Revert "Refine #530"
This reverts commit 292f22cc86.
2016-06-17 17:58:58 +08:00
Max Lv 292f22cc86 Refine #530 2016-06-17 17:37:52 +08:00
Mygod e368a58182 Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-06-17 16:42:19 +08:00
Mygod 94aeaaa89c Move bg components to bg process 2016-06-17 16:41:12 +08:00
Max Lv 02737bbfeb Merge branch 'master' of github.com:shadowsocks/shadowsocks-android 2016-06-17 16:23:19 +08:00
Max Lv 4d907bbdf0 add AUTHORS 2016-06-17 16:22:05 +08:00
Max Lv 6018346dd8 Update README.md 2016-06-17 16:16:21 +08:00
Max Lv ccccc4e7f7 Update README.md 2016-06-17 16:15:30 +08:00
Max Lv 827cb151f4 Update copy rights 2016-06-17 16:12:12 +08:00
Mygod 89df2bc715 Hide stop action in notification if the quick settings tile is present 2016-06-17 14:40:33 +08:00
Mygod e1364c012b Combine background processes to save memory 2016-06-17 14:32:02 +08:00
Mygod 18f03aeb1d Move tile service to a separate process to save memory 2016-06-17 14:24:59 +08:00
Mygod 8e3af71696 Change tile to a quick switch 2016-06-17 13:42:12 +08:00
Mygod 048219a788 Remove screen_name resource 2016-06-17 13:27:35 +08:00
Mygod b4d3103b8f Merge branch 'n' and update to API level 24
Fix #671.
2016-06-17 13:24:56 +08:00
Mygod d350088153 Refine updateCurrentProfile 2016-06-17 13:01:09 +08:00
Ilya c0975a3e6f Fixed string #9 (#717)
Fixed mistake in string #9
2016-06-15 21:09:59 -05:00
Max Lv 21a34e7e4e Fix #714 2016-06-14 09:44:20 +08:00
Mygod 3f201eb29b Fix connection test button too small 2016-06-09 21:16:02 +08:00
Max Lv 71b1d5fef1 Bump version 2016-06-05 15:08:03 +08:00
Mygod 5afb8b9cd4 Fix connection test disappearing 2016-06-05 12:20:48 +08:00
Mygod 650a01c9ce Update dependencies 2016-06-05 12:06:57 +08:00
Mygod 07798c7e56 Fix imported per-app proxy settings not updating UI 2016-06-05 12:06:27 +08:00
Mygod 8c3b4cc021 Refine #701 2016-06-05 11:46:04 +08:00
Ilya 759d812347 Add russian localosation (#701)
Created russian localisation file shadowsocks-android/src/main/res/values-ru/strings.xml
2016-06-01 03:06:32 -05:00
Mygod 2d4d5edff5 Update dependencies 2016-05-30 09:14:06 +08:00
Mygod 86f32ea67c Add app.isNatEnabled for performance and readability
Warning: This is a boring commit.
2016-05-24 11:52:06 +08:00
Mygod 461a0bda3f Remove unnecessary app.settings param in ConfigUtils.load 2016-05-24 11:46:31 +08:00
Mygod c878d4daa6 Fix DeathRecipient leaking bug 2016-05-24 11:42:12 +08:00
Mygod 9be24d7408 Use SharedPreference.Editor.apply instead of commit 2016-05-24 11:39:43 +08:00
Mygod 28ea9dd807 Use app.* instead of ShadowsocksApplication.*
Because typing ShadowsocksApplication is quite troublesome.
2016-05-24 11:37:33 +08:00
Mygod c695847403 Remove package object 2016-05-24 11:23:46 +08:00
Mygod 4a1f6fea98 Remove launcher.sh 2016-05-24 11:13:03 +08:00
Mygod 535561cfe4 Manage auto connect via Android API 2016-05-24 10:53:34 +08:00
Mygod 505e40eb3e Integrate bash scripts into sbt (#692) 2016-05-23 16:42:46 +08:00
Mygod a1871f792d Fix building 2016-05-21 17:51:10 +08:00
Mygod 0b7fb75b7a Obsolete code cleanup 2016-05-20 21:33:01 +08:00
Mygod c52c33f3ac Update CONTRIBUTING.md 2016-05-20 20:26:58 +08:00
CzBiX 6cdb12de99 Create CONTRIBUTING.md (#690) 2016-05-20 18:14:23 +08:00
Mygod 5d902be580 Reduce proguard output 2016-05-20 11:14:33 +08:00
Mygod 14267260bf Update dependencies 2016-05-19 16:54:15 +08:00
WangXinXin 5e0eed2953 Update README.md (#686) 2016-05-18 15:35:50 +08:00
Syrone Wong 8310e13be3 add a perl script to generate chnroute (#676)
The perl version takes two seconds while the python version takes more than 30 seconds

Usage: perl ./gen.pl < chnroute.txt > chnroute-merged.txt

Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
2016-05-07 08:29:15 +08:00
Syrone Wong 6b91d44c1c update chnroute (#675)
Data source:

http://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-extended-latest
http://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
http://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
http://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
https://www.ipip.net/
2016-05-07 08:29:05 +08:00
Max Lv 883b6349ab Fix #673 2016-05-06 09:02:47 +08:00
Mygod 5966c9d874 Quick settings tile for N preview (draft)
Addresses #671 but has NOT fixed it yet.
2016-05-05 21:41:57 +08:00
Mygod 2c2e5790f5 Fix typo: deattach => detach
I can't believe I've been so blind.
2016-05-05 20:04:03 +08:00
Mygod 4168329481 Update sbt-android 2016-05-05 19:27:25 +08:00
Mygod 19be10fbdf Update proguard 2016-05-04 22:47:14 +08:00
Max Lv 70aa867c53 Fix a race condition 2016-05-04 08:58:46 +08:00
Mygod f4b18b6145 Use Chinese (Taiwan) translation as fallback for other Chinese locales (#666) 2016-04-30 16:20:34 +08:00
LNDDYL 7845b7abdc Fix traditional Chinese translation 2016-04-29 18:44:51 +08:00
Max Lv 5328f5851d Fix #658 2016-04-25 20:24:55 +08:00
Mygod 1ddde094e3 Fix a crash in Parser 2016-04-25 13:12:06 +08:00
Mygod ee7ff7d5dd Use close button in ProfileManagerActivity
Because putting down arrow and back arrow together doesn't make sense.
2016-04-25 13:03:16 +08:00
Mygod 0503eeac41 Refine onServiceDisconnected 2016-04-25 12:53:38 +08:00
Max Lv 1d295b28bb Bump version 2016-04-19 16:07:00 +08:00
Mygod 985b3a6b7d Fix #649 2016-04-19 15:19:09 +08:00
Max Lv 78c17a6660 Bump version 2016-04-19 12:21:43 +08:00
Mygod 202bd2c984 Add support for Android TV
This commit adds an app banner in Android TV and introduces several changes including refactoring AppManager to make all features accessible with D-pad navigation.

Currently this app has the exact same user interface on Android TV as on normal Android devices but one should create a TV-specific user interface in the future.

P.S. Only tested in Android emulator. More testing might be needed.
2016-04-16 06:38:01 -07:00
Mygod 3c14ff67ce Update dependencies 2016-04-16 10:44:27 +08:00
Mygod e05abd7c24 Support one-time authentication in ss urls for sharing (#644)
This commit implements the new ss protocol proposed here: https://github.com/shadowsocks/shadowsocks-org/issues/16
2016-04-14 16:51:36 -07:00
Mygod c8bb8fc929 Fix uncancellable about dialog 2016-04-14 22:45:12 +08:00
Mygod faac54356e Update dependencies 2016-04-14 22:41:17 +08:00
Mygod 44a63ef1c4 Add missing "/s" in txRateText and rxRateText 2016-04-14 22:31:08 +08:00
Mygod 7d9686b5b5 UI fixes
* Refine exceptions handling when parsing per-app config string

* Remove redundant profiles Preference

* Move Network Traffic to title bar

* Add ripple to title text

* Animate using animateLayoutChanges

* Hide connection test in NAT mode

* Refine UI.

* Change notification action button icon for hidpi device

* Fix FAB ripple

* Fix usability problem

* Fix changes not commited when snackbar being swiped

* Show import/export as action

* Drop unused drawables

* Move TaskerSettings

* Fix action icons

* Prevent switching to an invalid profile

* Fix line wrap when screen width is small
2016-04-04 13:41:31 -07:00
Mygod 8453267996 New UI polishment
* Refine exceptions handling when parsing per-app config string

* Remove redundant profiles Preference

* Move Network Traffic to title bar

* Add ripple to title text

* Animate using animateLayoutChanges

* Hide connection test in NAT mode
2016-04-03 09:33:14 -07:00
Lucas Liu 29c5011ce4 Refine UI. 2016-04-02 02:12:54 -05:00
Max Lv f1b1b64f6b Fix #627 2016-04-01 15:36:06 +08:00
Max Lv da8e41d7bb Handle exceptions when parsing per-app config string 2016-03-30 17:46:05 +08:00
Max Lv 062dfb35c0 Merge pull request #624 from Mygod/master
Refine #614, #615
2016-03-28 21:33:11 -05:00
Mygod cb44ebaf03 Update dependencies
sbt-idea is outdated. Use Android Studio or IntelliJ's import SBT project instead.
2016-03-29 10:26:38 +08:00
Mygod e2a3184715 Refine #614 #615 2016-03-29 10:21:17 +08:00
Mygod 88131c3441 Refine strings 2016-03-29 08:32:47 +08:00
Max Lv d437f035cc Merge pull request #617 from AnyOfYou/master
Shorten notification action button text
2016-03-20 23:50:56 -05:00
Lucas Liu 9cb8bf681a Shorten notification action button text 2016-03-21 10:20:09 +08:00
Max Lv fb1a7e17cc Merge pull request #615 from LNDDYL/master
Add strings zh-TW
2016-03-19 17:31:32 -05:00
LNDDYL b6e15f2f13 Add strings zh-TW 2016-03-19 17:22:43 +08:00
Max Lv 2834621b7e Merge pull request #614 from AnyOfYou/master
Handle share intent in ProfileManagerActivity
2016-03-18 07:19:48 -05:00
Lucas Liu 8a86176ded Handle share intent in ProfileManagerActivity 2016-03-18 17:44:58 +08:00
Max Lv 5fa8e966e5 Bump version 2016-03-18 10:12:17 +08:00
Max Lv 17e84e58d8 Refine AdView 2016-03-18 10:03:51 +08:00
Max Lv 10940f2b1d Merge pull request #611 from AnyOfYou/master
NFC state check
2016-03-17 07:09:52 +08:00
Lucas Liu dd4fad1a41 ParserActivity bug fixes. 2016-03-17 00:25:13 +08:00
Lucas Liu 49a3cfdc34 NFC state check 2016-03-16 23:30:52 +08:00
Max Lv 82325ecdba Merge pull request #610 from Mygod/master
Refine #609
2016-03-16 22:41:05 +08:00
Mygod 555f4f6854 Refine #609 2016-03-16 22:31:07 +08:00
Max Lv e99a0eaafc Merge pull request #609 from AnyOfYou/master
Fix parser bug, add share profile by NFC.
2016-03-16 13:46:20 +08:00
Lucas Liu 7f2f67f27c Fix crash when cancel qrcode scan. 2016-03-16 13:22:53 +08:00
Lucas Liu 488d825637 Add share profile by NFC. 2016-03-16 12:47:10 +08:00
Lucas Liu f792c8ebfb Fix parser bug 2016-03-16 01:15:17 +08:00
Max Lv 78e57de833 Refine #602 further 2016-03-13 13:33:36 +08:00
Max Lv 017dd425a0 Refine #602 2016-03-13 13:13:37 +08:00
Max Lv 04ec29c9ea Merge pull request #603 from Mygod/master
Import/export one/all ss urls
2016-03-12 15:42:06 +08:00
Mygod 16e39f8b6c Hide quick switch if there's nothing to switch 2016-03-12 15:28:23 +08:00
Mygod 6dede5c067 Import/export one/all ss urls 2016-03-12 15:11:11 +08:00
Mygod fb3f7429b7 Refine parser 2016-03-12 14:39:00 +08:00
Mygod 0e0e65c45d Move profileTip to Key 2016-03-12 14:20:18 +08:00
Max Lv 86da4f535d Merge pull request #602 from Mygod/restart
Automatic service restart (with zero latency) after switching profile
2016-03-12 14:10:56 +08:00
Mygod ee48c0773c Automatic service restart 2016-03-12 13:40:13 +08:00
Max Lv 6ade064599 Merge pull request #600 from Mygod/master
Refine layout for #598
2016-03-12 12:45:19 +08:00
Mygod 8fd8514cc2 Refine layout for #598 2016-03-12 11:18:21 +08:00
Mygod 0aad8f13ed Merge branch 'master' of https://github.com/shadowsocks/shadowsocks-android 2016-03-12 11:17:53 +08:00
Max Lv 14a5324852 Merge pull request #598 from AnyOfYou/master
Add quick switch from notification.
2016-03-12 08:00:42 +08:00
Lucas Liu 7c5efdaa82 Add quick switch from notification. 2016-03-12 01:13:03 +08:00
Mygod 1c37c449d5 Update dependencies 2016-03-11 23:05:31 +08:00
Mygod 0f2ae6521b Oops fix a bug 2016-03-11 22:55:47 +08:00
Max Lv 3ae15514a5 Merge pull request #597 from Mygod/master
Refine #574, #583, #585, #594
2016-03-11 22:50:29 +08:00
Max Lv cee74f2563 Update setup scripts 2016-03-11 22:51:18 +08:00
Mygod 4c1a817c1b Fix a crash on Android N preview 2016-03-11 22:17:06 +08:00
Mygod 390d79c9aa Add missing volatile 2016-03-11 22:05:13 +08:00
Mygod 216cc9efe2 Refine #574 2016-03-11 22:02:52 +08:00
Mygod 3bb746254e Refine #594, again 2016-03-11 21:53:18 +08:00
Mygod 8fa2e60cf3 Remove redundant bindToService
Please do not create methods casually.
2016-03-11 20:41:46 +08:00
Mygod 8657ef87f4 Crash recovery for NAT mode
Bugfix: when NAT process is killed, Internet access is gone. Reproduce with:

    adb shell killall com.github.shadowsocks:nat

One circumstance it cannot recover from is when updating to a new version, where both processes are killed at the same time. But a reset will be executed when the new version is launched.
2016-03-11 20:39:01 +08:00
Mygod da1b404175 Remove redundant IOUtils 2016-03-11 20:19:45 +08:00
Mygod fcdeb5144a Remove ProcessUtils
It's safe to say that Shadowsocks is only instantialized in the main process, so boom, problem solved.
2016-03-11 20:18:22 +08:00
Mygod 270d436017 Refine ShadowsocksDeathRecipient and ServiceBoundContext 2016-03-11 20:17:23 +08:00
Mygod a4e186b759 Generate images with android-sdk-plugin 2016-03-11 19:27:50 +08:00
Max Lv 9965a71c93 Refine #594 2016-03-07 17:59:15 +08:00
Max Lv 9e09e0329b Merge pull request #594 from ayanamist/miui
Recover unexpected process exit on MIUI
2016-03-07 17:04:45 +08:00
ayanamist c19eb4e9e5 Convert GuardedProcess to Scala 2016-03-07 16:46:54 +08:00
ayanamist cad6d7b62a Recover unexpected process exit on MIUI 2016-03-07 15:48:37 +08:00
Max Lv e4e1a42146 Bump version 2016-02-27 21:09:09 +08:00
Max Lv 76108ec450 Merge pull request #585 from JLLK/master
Fix a issue in ProcessUtils
2016-02-26 14:31:16 +08:00
chentao 5b9a0d0659 Refine #585 2016-02-26 11:48:05 +08:00
Max Lv 6558f275fe Refine #577 2016-02-26 08:54:53 +08:00
chentao c13cf6f5d2 Fix a issue in ProcessUtils 2016-02-26 08:45:43 +08:00
Max Lv cacde5cff1 Fix #584 2016-02-25 21:38:57 +08:00
Max Lv bb2bd82d73 Update README.md 2016-02-25 21:12:56 +08:00
Max Lv 0a46eedba1 Update README.md 2016-02-25 21:04:09 +08:00
Max Lv 63bc60e513 Update README.md 2016-02-25 21:03:04 +08:00
Max Lv d9eb0e5163 Merge pull request #583 from JLLK/master
Fix binder ipc issue when process died unexpected
2016-02-25 21:00:51 +08:00
chentao fc3d26d626 Fix binder ipc issue when process died unexpected 2016-02-25 00:04:57 +08:00
chentao 1bb3a6bf5d Add ShadowsocksDeathRecipient 2016-02-25 00:00:33 +08:00
chentao f6cab9b99c Add IOUtils 2016-02-24 23:58:57 +08:00
chentao a24d29196f Add ProcessUtils 2016-02-24 23:57:38 +08:00
Max Lv 2eb12ee2ae Bump version 2016-02-22 09:00:29 +08:00
Max Lv ef7701982d Fix #577 2016-02-22 08:59:57 +08:00
Max Lv bd942c688f Bump version 2016-02-18 17:36:19 +08:00
Max Lv 3f08a66aab Merge pull request #574 from JLLK/master
Replace Future.onFailure with Future.onComplete
2016-02-18 17:31:15 +08:00
Max Lv ae0801b71b Fix #575 2016-02-18 17:22:08 +08:00
Max Lv 241b84976f Bump version 2016-02-18 16:43:45 +08:00
chentao b76d089fb2 Avoid MatchError 2016-02-17 11:30:58 +08:00
chentao 2f4cdbce25 Replace Future.onFailure with Future.onComplete 2016-02-16 10:05:43 +08:00
Max Lv 8e2fc2b228 Merge pull request #572 from Mygod/master
Refine undo
2016-02-11 23:12:36 +08:00
Mygod d794632616 Refine undo 2016-02-11 21:09:50 +08:00
Max Lv 529b1a32d3 Merge pull request #571 from Mygod/master
Add option: bypass China only
2016-02-08 16:43:03 +08:00
Mygod 396b49dab6 Fix broken links 2016-02-08 16:06:51 +08:00
Mygod 06deb4bbcb Add option: bypass China only
Fix #569.

It could have worked without upgrading database by using an option called `bypass-china-only`. But I think we will get better readability this way.
2016-02-08 15:44:10 +08:00
Max Lv 8127b9f8e2 Merge pull request #570 from Mygod/master
General enhancements
2016-02-08 15:13:14 +08:00
Mygod 3556eebfeb Tasker: scroll to selected profile 2016-02-08 15:06:53 +08:00
Mygod 10e3b211e3 Ask user to refrain from further using NAT mode 2016-02-08 14:40:49 +08:00
Mygod 05981fb117 Add a prompt: per-app proxy requires NAT mode under Android 4.x 2016-02-08 14:25:14 +08:00
Max Lv 4258e95f1e Merge pull request #568 from Mygod/layout
Refine layout of StatusPreference
2016-02-08 13:53:15 +08:00
Mygod cd5c2ef8ef Fix rate display disappearing in StatusPreference
It turns out that `onCreateView` gets called every time `setSummary` is invoked, and thus restoring texts for `TextView` is mandatory.
2016-02-08 13:47:30 +08:00
Mygod 5a84854881 Refine layout using GridView 2016-02-08 12:53:21 +08:00
Mygod 0cf1585712 Refine traffic stat layout 2016-02-07 18:41:50 +08:00
Mygod b8d97dde03 Remove obsolete xml files 2016-02-07 16:18:53 +08:00
141 changed files with 3084 additions and 2285 deletions
+1
View File
@@ -21,6 +21,7 @@ local.sbt
*.iws
.idea/
out/
.d
#NDK
src/main/obj
+6
View File
@@ -0,0 +1,6 @@
-XX:MaxPermSize=512m
-Xms1g
-Xmx3g
-Xss2m
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC
+7 -5
View File
@@ -1,5 +1,8 @@
language: scala
jdk:
- oraclejdk8
sudo: false
addons:
@@ -13,7 +16,7 @@ addons:
- libncurses5:i386
scala:
- 2.11.7
- 2.11.8
before_cache:
- find $HOME/.sbt -name "*.lock" | xargs rm
@@ -24,15 +27,14 @@ cache:
- $HOME/.ivy2/cache
- $HOME/.sbt/boot
before_install:
install:
- ./travis-ci/setup.sh
- export NDK_CCACHE=ccache
- export ARCH=`uname -m`
- export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r10d
- export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r12b
- export ANDROID_HOME=$HOME/.android/android-sdk-linux
- export PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
- cp local.properties.travis local.properties
script:
- ./build.sh > /dev/null
- sbt android:package-release
- sbt native-build android:package-release
+8
View File
@@ -0,0 +1,8 @@
Shadowsocks-android was originally created in late 2013, by
Max Lv <max.c.lv@gmail.com>.
Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
people who have submitted patches, fixed bugs, added translations, and
generally made shadowsocks-android that much better:
https://github.com/shadowsocks/shadowsocks-android/graphs/contributors
+1
View File
@@ -0,0 +1 @@
Please check the [FAQ](https://github.com/shadowsocks/shadowsocks-android/wiki/FAQ) before submitting new issues.
+8 -12
View File
@@ -2,38 +2,33 @@
A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
Help to translate shadowsocks: http://crowdin.net/project/shadowsocks/invite
[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.github.shadowsocks)
<a href="https://play.google.com/store/apps/details?id=com.github.shadowsocks"><img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" height="48"></a>
### CI STATUS
[![Build Status](https://travis-ci.org/shadowsocks/shadowsocks-android.svg)](https://travis-ci.org/shadowsocks/shadowsocks-android)
[![Build Status](https://api.travis-ci.org/shadowsocks/shadowsocks-android.svg)](https://travis-ci.org/shadowsocks/shadowsocks-android)
### PREREQUISITES
* JDK 1.7
* JDK 1.8
* SBT 0.13.0+
* Android SDK r24+
* Android SDK r25+
* Android NDK r10d+
### BUILD
* Set environment variable `ANDROID_HOME` to `/path/to/android-sdk`
* Set environment variable `ANDROID_NDK_HOME` to `/path/to/android-ndk`
* Create your key following the instructions at http://developer.android.com/guide/publishing/app-signing.html#cert
* Create your key following the instructions at https://developer.android.com/studio/publish/app-signing.html
* Put your key in ~/.keystore
* Create `local.properties` from `local.properties.example` with your own key information
* Invoke the building like this
```bash
git submodule update --init
# Build native binaries
./build.sh
# Build the App
sbt clean android:package-release
sbt native-build clean android:package-release
```
#### BUILD on Mac OS X (with HomeBrew)
@@ -70,7 +65,8 @@ Help to translate shadowsocks: http://crowdin.net/project/shadowsocks/invite
### LICENSE
Copyright (C) 2015 Max Lv <max.c.lv@gmail.com>
Copyright (C) 2016 by Max Lv <<max.c.lv@gmail.com>> <br/>
Copyright (C) 2016 by Mygod Studio <<mygodstudio@gmail.com>>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
+32 -12
View File
@@ -2,11 +2,11 @@ import android.Keys._
android.Plugin.androidBuild
platformTarget in Android := "android-23"
platformTarget in Android := "android-24"
name := "shadowsocks"
scalaVersion := "2.11.7"
scalaVersion := "2.11.8"
compileOrder in Compile := CompileOrder.JavaThenScala
@@ -22,28 +22,48 @@ shrinkResources in Android := true
typedResources in Android := false
resConfigs in Android := Seq("ru", "zh", "zh-rCN")
resolvers += Resolver.jcenterRepo
resolvers += "JRAF" at "http://JRAF.org/static/maven/2"
useSupportVectors
libraryDependencies ++= Seq(
"dnsjava" % "dnsjava" % "2.1.7",
"com.github.kevinsawicki" % "http-request" % "6.0",
"commons-net" % "commons-net" % "3.4",
"eu.chainfire" % "libsuperuser" % "1.0.0.201602011018",
"com.google.zxing" % "android-integration" % "3.2.1",
"eu.chainfire" % "libsuperuser" % "1.0.0.201602271131",
"net.glxn.qrgen" % "android" % "2.0",
"com.google.android.gms" % "play-services-base" % "8.4.0",
"com.google.android.gms" % "play-services-ads" % "8.4.0",
"com.google.android.gms" % "play-services-analytics" % "8.4.0",
"com.android.support" % "design" % "23.1.1",
"com.google.android.gms" % "play-services-ads" % "9.2.0",
"com.google.android.gms" % "play-services-analytics" % "9.2.0",
"com.android.support" % "design" % "24.0.0",
"com.android.support" % "gridlayout-v7" % "24.0.0",
"com.android.support" % "cardview-v7" % "24.0.0",
"com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01",
"com.j256.ormlite" % "ormlite-core" % "4.48",
"com.j256.ormlite" % "ormlite-android" % "4.48",
"com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2"
"com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2",
"com.github.clans" % "fab" % "1.6.4",
"me.dm7.barcodescanner" % "zxing" % "1.8.4"
)
proguardOptions in Android ++= Seq("-keep class com.github.shadowsocks.** { <init>(...); }",
proguardVersion in Android := "5.2.1"
proguardOptions in Android ++= Seq("-keep class com.github.shadowsocks.**",
"-keep class com.github.shadowsocks.System { *; }",
"-keep class me.dm7.**",
"-keep class com.google.android.gms.**",
"-keepattributes *Annotation*",
"-dontnote com.j256.ormlite.**",
"-dontnote org.xbill.**",
"-dontwarn org.xbill.**")
lazy val nativeBuild = TaskKey[Unit]("native-build", "Build native executables")
nativeBuild := {
val logger = streams.value.log
Process("./build.sh") ! logger match {
case 0 => // Success!
case n => sys.error(s"Native build script exit code: $n")
}
}
Executable
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env perl
## ArchLinux install package via pacman: perl-net-cidr-lite
use strict;
use warnings;
use Net::CIDR::Lite;
my $cidr = Net::CIDR::Lite->new;
while (my $line=<>) {
$cidr->add($line);
}
foreach my $line( @{$cidr->list} ) {
print "<item>$line</item>\n";
}
+1 -36
View File
@@ -13,43 +13,8 @@ def main():
for line in sys.stdin:
china_list_set.add(IPy.IP(line))
# 添加内网地址
internal_list = IPy.IPSet(map(IPy.IP, [
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"112.124.47.0/24",
"114.114.114.0/24",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/29",
"192.0.2.0/24",
"192.88.99.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"224.0.0.0/4",
"240.0.0.0/4",
]))
china_list_set += internal_list
all = china_list_set
# 取反
# all = IPy.IPSet([IPy.IP("0.0.0.0/0")])
# 剔除所有孤立的C段
# for ip in china_list_set:
# all.discard(ip)
# filter = itertools.ifilter(lambda x: len(x) <= 65536, all)
# for ip in filter:
# all.discard(ip)
# all.add(IPy.IP(ip.strNormal(0)).make_net('255.255.0.0'))
# 输出结果
for ip in all:
for ip in china_list_set:
print '<item>' + str(ip) + '</item>'
-5
View File
@@ -1,5 +0,0 @@
#!/bin/bash
convert shadow.png -resize 48x48 src/main/res/drawable-mdpi/ic_launcher.png
convert shadow.png -resize 72x72 src/main/res/drawable-hdpi/ic_launcher.png
convert shadow.png -resize 96x96 src/main/res/drawable-xhdpi/ic_launcher.png
convert shadow.png -resize 144x144 src/main/res/drawable-xxhdpi/ic_launcher.png
+3 -9
View File
@@ -1,11 +1,5 @@
resolvers += Resolver.url("scalasbt releases", new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-snapshots"))(Resolver.ivyStylePatterns)
addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.6")
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.5.16")
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.10")
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.7.0-SNAPSHOT")
resolvers += Resolver.url("rtimush/sbt-plugin-snapshots", new URL("https://dl.bintray.com/rtimush/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.9-6-g5a7705c")
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")
+58 -20
View File
@@ -1,15 +1,21 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks"
android:versionCode="129"
android:versionName="2.9.7">
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
android:versionCode="138"
android:versionName="2.10.5">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
<uses-feature android:name="android.software.leanback"
android:required="false" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<uses-sdk
android:minSdkVersion="16"
@@ -22,7 +28,8 @@
android:icon="@drawable/ic_launcher"
android:backupAgent=".ShadowsocksBackupAgent"
android:label="@string/app_name"
android:theme="@style/Theme.Material">
android:theme="@style/Theme.Material"
android:banner="@drawable/ic_start_connected">
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
@@ -40,24 +47,17 @@
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".ParserActivity"
android:theme="@style/PopupTheme"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="ss"/>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</activity>
<activity
android:name=".ShadowsocksRunnerActivity"
android:theme="@android:style/Theme.NoDisplay"
android:excludeFromRecents="true"
android:launchMode="singleTask">
</activity>
@@ -65,18 +65,37 @@
android:name=".ProfileManagerActivity"
android:label="@string/profiles"
android:parentActivityName=".Shadowsocks"
android:exported="false"
android:excludeFromRecents="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="com.github.shadowsocks.ProfileManagerActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="ss"/>
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="ss" />
</intent-filter>
</activity>
<activity
android:name=".ScannerActivity"
android:label="@string/add_profile_methods_scan_qr_code"
android:parentActivityName=".ProfileManagerActivity"
android:excludeFromRecents="true"
android:launchMode="singleTask"/>
<activity
android:name=".AppManager"
android:label="@string/proxied_apps"
android:parentActivityName=".Shadowsocks"
android:excludeFromRecents="true"
android:launchMode="singleTask"/>
<activity android:name=".TaskerActivity"
@@ -86,6 +105,17 @@
</intent-filter>
</activity>
<activity android:name=".ShadowsocksQuickSwitchActivity"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:taskAffinity=""
android:theme="@style/PopupTheme.QuickSwitch">
<intent-filter>
<action android:name="com.github.shadowsocks.QUICK_SWITCH" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<service
android:name=".ShadowsocksRunnerService"
android:exported="false">
@@ -93,13 +123,13 @@
<service
android:name=".ShadowsocksNatService"
android:process=":nat"
android:process=":bg"
android:exported="false">
</service>
<service
android:name=".ShadowsocksVpnService"
android:process=":vpn"
android:process=":bg"
android:label="@string/app_name"
android:permission="android.permission.BIND_VPN_SERVICE"
android:exported="false">
@@ -108,14 +138,22 @@
</intent-filter>
</service>
<receiver android:name=".ShadowsocksReceiver">
<service android:name=".ShadowsocksTileService" android:label="@string/quick_toggle"
android:process=":bg"
android:icon="@drawable/ic_start_connected"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
<receiver android:name=".BootReceiver" android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="com.github.shadowsocks.ACTION_UPDATE_STATE"/>
</intent-filter>
</receiver>
<receiver android:name=".TaskerReceiver">
<receiver android:name=".TaskerReceiver" tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="com.twofortyfouram.locale.intent.action.FIRE_SETTING"/>
</intent-filter>
@@ -1,3 +0,0 @@
package com.github.shadowsocks.aidl;
parcelable Config;
@@ -1,97 +0,0 @@
package com.github.shadowsocks.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Config implements Parcelable {
public boolean isProxyApps = false;
public boolean isBypassApps = false;
public boolean isUdpDns = false;
public boolean isAuth = false;
public boolean isIpv6 = false;
public String profileName = "Untitled";
public String proxy = "127.0.0.1";
public String sitekey = "null";
public String route = "all";
public String encMethod = "rc4";
public String proxiedAppString = "";
public int remotePort = 1984;
public int localPort = 1080;
public int profileId = 0;
public static final Parcelable.Creator<Config> CREATOR = new Parcelable.Creator<Config>() {
public Config createFromParcel(Parcel in) {
return new Config(in);
}
public Config[] newArray(int size) {
return new Config[size];
}
};
public Config(boolean isProxyApps, boolean isBypassApps,
boolean isUdpDns, boolean isAuth, boolean isIpv6, String profileName, String proxy, String sitekey,
String encMethod, String proxiedAppString, String route, int remotePort, int localPort, int profileId) {
this.isProxyApps = isProxyApps;
this.isBypassApps = isBypassApps;
this.isUdpDns = isUdpDns;
this.isAuth = isAuth;
this.isIpv6 = isIpv6;
this.profileName = profileName;
this.proxy = proxy;
this.sitekey = sitekey;
this.encMethod = encMethod;
this.proxiedAppString = proxiedAppString;
this.route = route;
this.remotePort = remotePort;
this.localPort = localPort;
this.profileId = profileId;
}
private Config(Parcel in) {
readFromParcel(in);
}
public void readFromParcel(Parcel in) {
isProxyApps = in.readInt() == 1;
isBypassApps = in.readInt() == 1;
isUdpDns = in.readInt() == 1;
isAuth = in.readInt() == 1;
isIpv6 = in.readInt() == 1;
profileName = in.readString();
proxy = in.readString();
sitekey = in.readString();
encMethod = in.readString();
proxiedAppString = in.readString();
route = in.readString();
remotePort = in.readInt();
localPort = in.readInt();
profileId = in.readInt();
}
@Override public int describeContents() {
return 0;
}
@Override public void writeToParcel(Parcel out, int flags) {
out.writeInt(isProxyApps ? 1 : 0);
out.writeInt(isBypassApps ? 1 : 0);
out.writeInt(isUdpDns ? 1 : 0);
out.writeInt(isAuth ? 1 : 0);
out.writeInt(isIpv6 ? 1 : 0);
out.writeString(profileName);
out.writeString(proxy);
out.writeString(sitekey);
out.writeString(encMethod);
out.writeString(proxiedAppString);
out.writeString(route);
out.writeInt(remotePort);
out.writeInt(localPort);
out.writeInt(profileId);
}
}
@@ -1,15 +1,12 @@
package com.github.shadowsocks.aidl;
import com.github.shadowsocks.aidl.Config;
import com.github.shadowsocks.aidl.IShadowsocksServiceCallback;
interface IShadowsocksService {
int getMode();
int getState();
oneway void registerCallback(IShadowsocksServiceCallback cb);
oneway void unregisterCallback(IShadowsocksServiceCallback cb);
oneway void start(in Config config);
oneway void stop();
oneway void use(in int profileId);
}
+6 -5
View File
@@ -274,7 +274,8 @@ img {
</head>
<body>
<p>A <a href="http://shadowsocks.org">Shadowsocks</a> client for Android, written in Scala.</p>
<p>Copyright (C) 2014 Max Lv <a href="&#x6d;&#97;&#x69;&#108;&#116;&#111;&#x3a;&#x6d;&#97;x&#46;&#99;.&#108;&#118;&#x40;&#103;&#109;&#97;&#x69;&#108;&#46;&#x63;&#x6f;&#109;">&#x6d;&#97;&#x78;.&#x63;&#x2e;&#108;v&#64;&#x67;&#109;&#x61;&#x69;&#108;&#x2e;&#99;&#111;&#109;</a></p>
<p>Copyright (C) 2016 by Max Lv <a href="&#x6d;&#97;&#x69;&#108;&#116;&#111;&#x3a;&#x6d;&#97;x&#46;&#99;.&#108;&#118;&#x40;&#103;&#109;&#97;&#x69;&#108;&#46;&#x63;&#x6f;&#109;">&#x6d;&#97;&#x78;.&#x63;&#x2e;&#108;v&#64;&#x67;&#109;&#x61;&#x69;&#108;&#x2e;&#99;&#111;&#109;</a></p>
<p>Copyright (C) 2016 by Mygod Studio <a href="mygodstudio@gmail.com">mygodstudio@gmail.com</a></p>
<p>This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
@@ -289,11 +290,11 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http
<h3>Open Source Licenses</h3>
<ul>
<li>shadowsocks-libev: <a href="https://github.com/shadowsocks/shadowsocks-libev/blob/master/LICENSE">GPLv3</a></li>
<li>tun2socks: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/badvpn/COPYING">BSD</a></li>
<li>redsocks: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/redsocks/README">APL 2.0</a></li>
<li>OpenSSL: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/openssl/NOTICE">OpenSSL</a></li>
<li>tun2socks: <a href="https://github.com/shadowsocks/badvpn/blob/shadowsocks-android/COPYING">BSD</a></li>
<li>redsocks: <a href="https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README">APL 2.0</a></li>
<li>OpenSSL: <a href="https://github.com/shadowsocks/openssl-android/blob/master/NOTICE">OpenSSL</a></li>
<li>pdnsd: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/pdnsd/COPYING">GPLv3</a></li>
<li>libev: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libev/LICENSE">GPLv2</a></li>
<li>libev: <a href="https://github.com/shadowsocks/libevent/blob/shadowsocks-android/LICENSE">GPLv2</a></li>
<li>libevent: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libevent/LICENSE">BSD</a></li>
</ul>
+2
View File
@@ -386,6 +386,7 @@ LOCAL_MODULE := ss-local
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_LOCAL \
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H \
-DCONNECT_IN_PROGRESS=EINPROGRESS \
-I$(LOCAL_PATH)/include \
-I$(LOCAL_PATH)/libev \
-I$(LOCAL_PATH)/libancillary \
@@ -414,6 +415,7 @@ LOCAL_MODULE := ss-tunnel
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_TUNNEL \
-DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \
-DCONNECT_IN_PROGRESS=EINPROGRESS \
-I$(LOCAL_PATH)/libev \
-I$(LOCAL_PATH)/libancillary \
-I$(LOCAL_PATH)/include \
+1 -1
View File
@@ -1,4 +1,4 @@
APP_ABI := armeabi-v7a x86
APP_PLATFORM := android-16
APP_STL := stlport_static
NDK_TOOLCHAIN_VERSION := 4.9
NDK_TOOLCHAIN_VERSION := clang
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
</vector>
@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z"/>
</vector>
@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z"/>
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:colorControlHighlight">
<item>
<color android:color="@color/material_accent_300"/>
</item>
</ripple>
Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/material_accent_300"/>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,10l5,5 5,-5z"/>
</vector>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/>
</vector>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19,2h-4.18C14.4,0.84 13.3,0 12,0c-1.3,0 -2.4,0.84 -2.82,2L5,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM12,2c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM19,20L5,20L5,4h2v3h10L17,4h2v16z"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,20L4,20L4,4h16v16zM18,6h-5c-1.1,0 -2,0.9 -2,2v2.28c-0.6,0.35 -1,0.98 -1,1.72 0,1.1 0.9,2 2,2s2,-0.9 2,-2c0,-0.74 -0.4,-1.38 -1,-1.72L13,8h3v8L8,16L8,8h2L10,6L6,6v12h12L18,6z"/>
</vector>
@@ -5,5 +5,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96z"/>
android:pathData="M18,7l-1.41,-1.41 -6.34,6.34 1.41,1.41L18,7zM22.24,5.59L11.66,16.17 7.48,12l-1.41,1.41L11.66,19l12,-12 -1.42,-1.41zM0.41,13.41L6,19l1.41,-1.41L1.83,12 0.41,13.41z"/>
</vector>
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"/>
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z"/>
</vector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView android:text="@string/stat" android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary" android:ellipsize="marquee"
android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<TextView android:id="@+id/connection_test" android:gravity="end"
android:textSize="14sp" android:textColor="?android:attr/textColorSecondary"
android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/>
</LinearLayout>
+2 -2
View File
@@ -45,10 +45,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<ListView
<android.support.v7.widget.RecyclerView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/applistview"
android:visibility="gone"/>
</FrameLayout>
</LinearLayout>
</LinearLayout>
+12 -12
View File
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?android:attr/selectableItemBackground">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:id="@+id/itemicon"
@@ -15,20 +16,19 @@
android:paddingTop="2dp"
android:paddingBottom="2dp"/>
<TextView
android:id="@+id/itemtext"
<Switch
android:id="@+id/itemcheck"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:ellipsize="end"
android:textSize="18sp"/>
<Switch
android:id="@+id/itemcheck"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginLeft="8dp"
android:textSize="18sp"
android:textColor="?android:attr/textColorSecondary"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"/>
</LinearLayout>
+51 -4
View File
@@ -3,14 +3,61 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:ignore="UnknownIdInLayout" android:clipChildren="false">
<include layout="@layout/toolbar_light_dark" />
<LinearLayout android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_below="@+id/toolbar"
android:animateLayoutChanges="true">
<include layout="@layout/toolbar_light_dark" />
<LinearLayout android:id="@+id/stat" android:elevation="4dp" android:visibility="gone"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical"
android:paddingStart="16dip" android:paddingEnd="88dip" android:focusable="true"
android:paddingLeft="16dip" android:paddingRight="88dip"
android:paddingTop="16dip" android:paddingBottom="16dip"
android:background="@drawable/background_stat" android:orientation="vertical">
<include layout="@layout/layout_main_stat_title"/>
<android.support.v7.widget.GridLayout android:layout_width="match_parent"
android:layout_height="wrap_content" app:columnCount="4">
<TextView app:layout_column="0" style="@style/TextAppearance.AppCompat.Body2"
android:ellipsize="marquee" android:text="@string/sent"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="24dp" android:layout_marginEnd="24dp" android:gravity="end"/>
<TextView app:layout_column="1" android:id="@+id/tx" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary" android:ellipsize="marquee"
android:layout_width="0dp" android:layout_height="wrap_content"
app:layout_columnWeight="1" app:layout_gravity="fill_horizontal"/>
<TextView app:layout_column="2" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary"
android:ellipsize="marquee" android:text="▲"
android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<TextView app:layout_column="3" android:id="@+id/txRate" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary" android:ellipsize="marquee"
android:layout_width="0dp" android:layout_height="wrap_content" app:layout_columnWeight="1"
app:layout_gravity="fill_horizontal" android:gravity="end"/>
<TextView app:layout_row="1" app:layout_column="0" style="@style/TextAppearance.AppCompat.Body2"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="24dp" android:layout_marginEnd="24dp" android:gravity="end"
android:ellipsize="marquee" android:text="@string/received"/>
<TextView app:layout_row="1" app:layout_column="1" android:id="@+id/rx" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary" android:ellipsize="marquee"
android:layout_width="0dp" android:layout_height="wrap_content" app:layout_columnWeight="1"
app:layout_gravity="fill_horizontal" />
<TextView app:layout_row="1" app:layout_column="2" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary" android:ellipsize="marquee"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="▼"/>
<TextView app:layout_row="1" app:layout_column="3" android:id="@+id/rxRate" android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary" android:ellipsize="marquee"
android:layout_width="0dp" android:layout_height="wrap_content" app:layout_columnWeight="1"
app:layout_gravity="fill_horizontal" android:gravity="end"/>
</android.support.v7.widget.GridLayout>
</LinearLayout>
</LinearLayout>
<fragment android:name="com.github.shadowsocks.ShadowsocksSettings"
android:id="@android:id/content" android:layout_below="@+id/toolbar"
android:id="@android:id/content" android:layout_below="@+id/title_bar"
android:layout_width="match_parent" android:layout_height="match_parent"/>
<com.github.jorgecastilloprz.FABProgressCircle android:id="@+id/fabProgressCircle" app:reusable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:elevation="6dp"
android:layout_alignBottom="@+id/toolbar"
android:layout_alignBottom="@+id/title_bar"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="16dp"
@@ -19,7 +66,7 @@
<android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:backgroundTint="@color/material_blue_grey_700"
android:src="@drawable/ic_start_idle"
app:srcCompat="@drawable/ic_start_idle"
app:pressedTranslationZ="6dp" app:borderWidth="0dp" />
</com.github.jorgecastilloprz.FABProgressCircle>
</RelativeLayout>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView android:text="@string/stat" android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary" android:ellipsize="marquee"
android:layout_width="match_parent" android:layout_height="wrap_content"/>
<TextView android:id="@+id/connection_test"
android:textSize="14sp" android:textColor="?android:attr/textColorSecondary"
android:layout_width="match_parent" android:layout_height="wrap_content"/>
</LinearLayout>
+58 -5
View File
@@ -1,16 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<include layout="@layout/toolbar_light_dark" />
<android.support.design.widget.CoordinatorLayout android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_height="0dp" android:layout_weight="1">
<android.support.v7.widget.RecyclerView android:id="@+id/profilesList"
app:layout_behavior="com.github.shadowsocks.widget.AutoPaddingBehavior"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"/>
<com.github.clans.fab.FloatingActionMenu
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="bottom|end"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
app:menu_colorNormal="@color/material_accent_500"
app:menu_colorPressed="@color/material_accent_700"
app:fab_colorRipple="@android:color/white"
app:layout_behavior="com.github.shadowsocks.widget.FloatingActionMenuBehavior">
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab_manual_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fab_colorNormal="@color/material_accent_500"
app:fab_colorPressed="@color/material_accent_700"
app:fab_colorRipple="@android:color/white"
app:fab_size="mini"
app:fab_label="@string/add_profile_methods_manual_settings"
/>
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab_qrcode_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fab_colorNormal="@color/material_accent_500"
app:fab_colorPressed="@color/material_accent_700"
app:fab_colorRipple="@android:color/white"
app:fab_size="mini"
app:fab_label="@string/add_profile_methods_scan_qr_code"
/>
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab_nfc_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fab_colorNormal="@color/material_accent_500"
app:fab_colorPressed="@color/material_accent_700"
app:fab_colorRipple="@android:color/white"
app:fab_size="mini"
app:fab_label="NFC"
/>
<com.github.clans.fab.FloatingActionButton
android:id="@+id/fab_import_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fab_colorNormal="@color/material_accent_500"
app:fab_colorPressed="@color/material_accent_700"
app:fab_colorRipple="@android:color/white"
app:fab_size="mini"
app:fab_label="@string/action_import"
/>
</com.github.clans.fab.FloatingActionMenu>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
+11 -4
View File
@@ -1,13 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Based on: https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/select_dialog_singlechoice_material.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/container"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="20dp"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingLeft="20dp"
android:paddingRight="?attr/dialogPreferredPadding">
android:paddingRight="?attr/dialogPreferredPadding"
android:focusable="true"
android:nextFocusRight="@+id/share">
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="0dp"
@@ -23,11 +27,14 @@
android:drawablePadding="20dp"
android:maxLines="4"
android:scrollHorizontally="false" />
<ImageView android:id="@+id/qrcode"
<ImageView android:id="@+id/share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_social_share"
app:srcCompat="@drawable/ic_social_share"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/qrcode"/>
android:contentDescription="@string/share"
android:focusable="true"
android:nextFocusLeft="@+id/container"/>
</LinearLayout>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_margin="8dp"
android:layout_gravity="center_vertical"
app:cardElevation="5dp"
app:cardBackgroundColor="#EEEEEE">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<include layout="@layout/toolbar_light_dark"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/profilesList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.v7.widget.CardView>
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include layout="@layout/toolbar_light_dark" />
</FrameLayout>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="80dp" android:maxWidth="80dp" android:gravity="center"
android:textSize="70sp" android:textColor="#ffffffff"
android:background="#99000088" android:padding="10dp"
android:visibility="invisible"/>
-108
View File
@@ -1,108 +0,0 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/widget_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingEnd="?android:attr/scrollbarSize"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical" >
<TableLayout
android:layout_marginLeft="15dip"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:stretchColumns="3"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_column="0"
android:layout_span="2"
android:id="@android:id/title"
android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_column="3"
android:id="@android:id/summary"
android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_column="0"
style="@style/TextAppearance.AppCompat.Body2"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:gravity="end"
android:text="@string/sent" />
<TextView
android:layout_column="1"
android:id="@+id/tx"
style="@style/TextAppearance.AppCompat.Caption"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:text="0 Byte" />
<TextView
android:layout_column="3"
android:id="@+id/txRate"
style="@style/TextAppearance.AppCompat.Caption"
android:ellipsize="marquee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:text="▲ 0 B/s" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_column="0"
style="@style/TextAppearance.AppCompat.Body2"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:gravity="end"
android:text="@string/received"/>
<TextView
android:layout_column="1"
android:id="@+id/rx"
style="@style/TextAppearance.AppCompat.Caption"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:text="0 Byte" />
<TextView
android:layout_column="3"
android:id="@+id/rxRate"
style="@style/TextAppearance.AppCompat.Caption"
android:ellipsize="marquee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:text="▼ 0 B/s" />
</TableRow>
</TableLayout>
</LinearLayout>
+18 -5
View File
@@ -1,8 +1,21 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_apply_all"
android:title="@string/action_apply_all"
android:icon="@drawable/ic_done_all"
android:alphabeticShortcut="a"
android:numericShortcut="1"
app:showAsAction="always"/>
<item android:id="@+id/action_export"
android:title="@string/action_export"
android:showAsAction="never" />
android:title="@string/action_export"
android:icon="@drawable/ic_content_copy"
app:showAsAction="ifRoom"
android:alphabeticShortcut="e"
android:numericShortcut="2"/>
<item android:id="@+id/action_import"
android:title="@string/action_import"
android:showAsAction="never" />
android:title="@string/action_import"
android:icon="@drawable/ic_content_paste"
app:showAsAction="ifRoom"
android:alphabeticShortcut="i"
android:numericShortcut="3"/>
</menu>
+6 -16
View File
@@ -1,20 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:title="@string/add_profile"
android:icon="@drawable/ic_content_add"
android:alphabeticShortcut="a"
android:numericShortcut="0"
app:showAsAction="always">
<menu>
<item android:id="@+id/scan_qr_code"
android:title="@string/add_profile_methods_scan_qr_code"
android:alphabeticShortcut="s"
android:numericShortcut="1"/>
<item android:id="@+id/manual_settings"
android:title="@string/add_profile_methods_manual_settings"
android:alphabeticShortcut="m"
android:numericShortcut="2"/>
</menu>
</item>
<item android:id="@+id/action_export"
android:title="@string/action_export"
android:alphabeticShortcut="e"
android:numericShortcut="1"
android:icon="@drawable/ic_content_copy"
app:showAsAction="always"/>
</menu>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="proxied_apps_summary">Установить прокси для выбранных приложений</string>
</resources>
+140
View File
@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="quick_toggle">Подключение</string>
<!-- global/misc category -->
<string name="misc_cat">Разное</string>
<string name="profile">Профиль</string>
<string name="profile_summary">Переключить на другой профиль или добавить новые</string>
<string name="nat">Режим NAT (не рекомендуется)</string>
<string name="nat_summary">Использовать режим NAT вместо VPN. Требует ROOT прав.</string>
<string name="stat">Сетевая Активность</string>
<string name="stat_summary">Отправлено: \t\t\t\t\t%3$s\t↑\t%1$s/s\nПолучено: \t%4$s\t↓\t%2$s/s</string>
<string name="stat_profiles">\n%1$s↑\t%2$s↓</string>
<string name="traffic_summary">%1$s/s↑\t%2$s/s↓</string>
<plurals name="bytes">
<item quantity="one">Byte</item>
<item quantity="other">Bytes</item>
</plurals>
<string name="connection_test_pending">Проверить подключение</string>
<string name="connection_test_testing">Проверка…</string>
<string name="connection_test_available">Успешно: %dms задержка</string>
<string name="connection_test_error">Сбой проверки интернет подключения: %s</string>
<string name="connection_test_fail">Интернет Недоступен</string>
<string name="connection_test_error_status_code">Код ошибки: #%d</string>
<!-- proxy category -->
<string name="proxy_cat">Настройки Сервера</string>
<string name="profile_name">Имя Профиля</string>
<string name="proxy">Сервер</string>
<string name="proxy_summary">Имя или IP удалённого сервера</string>
<string name="remote_port">Удалённый порт</string>
<string name="remote_port_summary">%d (номер порта удалённого сервера)</string>
<string name="port">Локальный порт</string>
<string name="port_summary">%d (номер порта локального сервера)</string>
<string name="sitekey">Пароль</string>
<string name="sitekey_summary">Пароль удалённого сервера</string>
<string name="enc_method">Метод Шифрования</string>
<!-- feature category -->
<string name="feature_cat">Дополнительные Настройки</string>
<string name="ipv6">IPv6 Маршрут</string>
<string name="ipv6_summary">Перенаправлять IPv6 траффик на удалённый сервер</string>
<string name="onetime_auth">Единоразовая Аутентификация</string>
<string name="onetime_auth_summary">Включить единоразовую аутентификацию</string>
<string name="http_proxy">HTTP Прокси</string>
<string name="http_proxy_summary">Локальный HTTP прокси</string>
<string name="dns_proxy">DNS Прокси</string>
<string name="dns_proxy_summary">Перенаправлять DNS запросы на удалённый сервер</string>
<string name="auto_set_gfwlist">CHN Маршрут</string>
<string name="auto_set_gfwlist_summary">Игнорировать все сайты находящиеся в Китае</string>
<string name="route_list">Маршрут</string>
<string name="proxied_apps">Прокси для выбранных приложений</string>
<string name="proxied_apps_summary">Установить прокси для выбранных приложений, требует режим NAT под Android 4.x</string>
<string name="on">Вкл</string>
<string name="bypass_apps">В обход прокси</string>
<string name="bypass_apps_summary">Включите эту опцию для работы выбранных приложений в обход прокси</string>
<string name="auto_connect">Авто Подключение</string>
<string name="auto_connect_summary">Запускать Shadowsocks при включении</string>
<string name="udp_dns">Проброс UDP</string>
<string name="udp_dns_summary">Пробрасывать UDP пакеты на удалённый сервер</string>
<!-- notification category -->
<string name="forward_success">Shadowsocks запущен.</string>
<string name="invalid_server">Неправильное имя сервера</string>
<string name="service_failed">Ошибка при подключении к удалённому серверу</string>
<string name="nat_deprecated">ВНИМАНИЕ:режим NAT не работает в Android 5.0</string>
<string name="nat_no_root">Режим NAT требует наличия ROOT прав</string>
<string name="switch_to_vpn">Переключить на режим VPN</string>
<string name="stop">Остановить</string>
<string name="stopping">Останавливается…</string>
<string name="vpn_error">%s</string>
<string name="reboot_required">Сбой запуска VPN сервиса. Требуется перезагрузка Вашего устройства.</string>
<string name="quick_switch">Переключить</string>
<!-- alert category -->
<string name="close">Закрыть</string>
<string name="proxy_empty">Прокси/Пароль не должны быть пустыми</string>
<string name="connect">Подключить</string>
<string name="initializing">Инициализация…</string>
<string name="recovering">Сброс…</string>
<string name="loading">Загрузка…</string>
<string name="remove_profile">Удалить этот профиль "%s"?</string>
<!-- menu category -->
<string name="profiles">Профили</string>
<string name="settings">Настройки</string>
<string name="recovery">Сброс</string>
<string name="recovery_summary">Сброс всех фоновых задач</string>
<string name="about">О приложении</string>
<string name="about_title">Shadowsocks %s</string>
<string name="share">Поделиться</string>
<string name="share_message">Сканировать QR код или использовать Android Beam (NFC)</string>
<string name="share_message_without_nfc">Сканировать QR код</string>
<string name="share_message_nfc_disabled">Сканировать QR код\nAndroid Beam отключен</string>
<string name="turn_on_nfc">Включить NFC &amp; Android Beam</string>
<string name="flush_dnscache">Очистить кэш DNS</string>
<string name="flush_dnscache_summary">Работает только в режиме NAT</string>
<string name="flush_dnscache_summary_root">Работает только в режиме NAT. Требует наличия ROOT прав.</string>
<string name="flush_dnscache_no_root">Очистка кэша DNS не работает без налиичя ROOT прав</string>
<string name="flushing">Очистка</string>
<string name="add_profile">Добавить Профиль</string>
<string name="action_apply_all">Применить настройки для всех профилей</string>
<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>
<!-- profile -->
<string name="profile_manager_dialog">Profiles</string>
<string name="profile_manager_dialog_content">&#8226; Нажмите для выбора профиля;\n&#8226; Сдвиньте влево/вправо или нажмите влево
чтобы удалить;\n&#8226; Подержите чтобы изменить порядок профилей.</string>
<string name="gotcha">Gotcha!</string>
<string name="add_profile_dialog">Добавить этот Профиль Shadowsocks?</string>
<string name="add_profile_methods_scan_qr_code">Сканировать QR код</string>
<string name="add_profile_methods_manual_settings">Настройка вручную</string>
<string name="add_profile_nfc_hint_title">Использовать Android Beam (NFC) для добавления профиля</string>
<string name="add_profile_nfc_hint">Оставьте экран включённым на обоих устройствах, на втором устойстве нажмите кнопку профиля "поделиться", поднисите устройства друг к другу (тыльными сторонами).\nТак же Вы можете сканировать nfc метку.</string>
<string name="add_profile_scanner_permission_required">Разрешение камеры требуется для сканирования QR код.</string>
<string name="copy_url">Копировать URL</string>
<plurals name="removed">
<item quantity="one">Удалён</item>
<item quantity="other">%d элементы удалены</item>
</plurals>
<string name="undo">Вернуть</string>
<!-- tasker -->
<string name="toggle_service_state">Запустить сервисStart the service</string>
<string name="start_service_default">Подключиться к текущему серверу</string>
<string name="start_service">Подключиться к %s</string>
<string name="stop_service">Переключить на %s</string>
<string name="profile_default">Использовать текущий профиль</string>
<!-- status -->
<string name="sent">Отправлено:</string>
<string name="received">Получено:</string>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="proxied_apps_summary">Set proxy for selected apps</string>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="proxied_apps_summary">为应用程序分别设置代理</string>
</resources>
+139
View File
@@ -0,0 +1,139 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">影梭</string>
<string name="quick_toggle">开关</string>
<string name="misc_cat">其他</string>
<string name="proxy_cat">服务器设置</string>
<string name="profile_name">配置名称</string>
<string name="profile">配置文件</string>
<string name="profile_summary">新建或切换到其他配置文件</string>
<string name="proxy">服务器</string>
<string name="proxy_summary">远程服务器的地址</string>
<string name="remote_port">远程端口</string>
<string name="remote_port_summary">%d(远程服务器的端口号)</string>
<string name="port">本地端口</string>
<string name="port_summary">%d(本地客户端的端口号)</string>
<string name="sitekey">密码</string>
<string name="sitekey_summary">远程服务器的密码</string>
<string name="enc_method">加密方法</string>
<string name="feature_cat">功能设置</string>
<string name="http_proxy">HTTP 代理服务器</string>
<string name="http_proxy_summary">本地 HTTP 代理</string>
<string name="dns_proxy">DNS 代理</string>
<string name="dns_proxy_summary">重定向 DNS 查询到远程服务器</string>
<string name="auto_set_gfwlist">国内路由</string>
<string name="auto_set_gfwlist_summary">绕过所有位于中国的网站</string>
<string name="route_list">路由</string>
<string name="proxied_apps">分应用代理</string>
<string name="proxied_apps_summary">为应用程序分别设置代理,在 4.x 下需要启用 NAT 模式</string>
<string name="on">开</string>
<string name="bypass_apps">绕行模式</string>
<string name="bypass_apps_summary">启用该选项,以使所选应用程序的流量不经过代理</string>
<string name="auto_connect">自动连接</string>
<string name="auto_connect_summary">随系统启动后台服务</string>
<string name="forward_success">后台服务已开始运行。</string>
<string name="service_failed">无法连接远程服务器</string>
<string name="invalid_server">服务器名无效</string>
<string name="nat_deprecated">警告:在 Android 5.0 及更高版本中不建议使用 NAT 模式</string>
<string name="nat_no_root">NAT 模式需要 ROOT 权限</string>
<string name="switch_to_vpn">切换到 VPN 模式</string>
<string name="stop">停止</string>
<string name="quick_switch">切换</string>
<string name="stopping">正在关闭……</string>
<string name="vpn_error">后台服务启动失败:%s</string>
<string name="reboot_required">VPN 服务启动失败。你可能需要重启设备。</string>
<string name="close">关闭</string>
<string name="proxy_empty">代理服务器地址及密码不能为空</string>
<string name="connect">连接</string>
<string name="initializing">正在初始化……</string>
<string name="recovering">重置中……</string>
<string name="loading">正在加载……</string>
<string name="profiles">配置文件</string>
<string name="settings">设置选项</string>
<string name="remove_profile">删除此配置文件「%s」?</string>
<string name="recovery">重置</string>
<string name="recovery_summary">重置所有后台服务</string>
<string name="about">关于</string>
<string name="about_title">影梭(shadowsocks)%s</string>
<string name="flush_dnscache">刷新 DNS 缓存</string>
<string name="flush_dnscache_summary">只需在 NAT 模式下使用</string>
<string name="flush_dnscache_summary_root">只需在 NAT 模式下使用,需要 ROOT 权限</string>
<string name="flush_dnscache_no_root">在没有 ROOT 权限的情况下无法刷新 DNS 缓存</string>
<string name="flushing">刷新中……</string>
<string name="share">分享</string>
<string name="share_message">扫描二维码或使用 Android Beam (NFC)</string>
<string name="share_message_without_nfc">扫描二维码</string>
<string name="share_message_nfc_disabled">扫描二维码\nAndroid Beam 被禁用</string>
<string name="turn_on_nfc">打开 NFC &amp; Android Beam</string>
<string name="add_profile">添加配置文件</string>
<string name="nat">NAT 模式 (仅限调试)</string>
<string name="nat_summary">从 VPN 模式切换为 NAT 模式,需要 ROOT 权限</string>
<string name="udp_dns">UDP 转发</string>
<string name="udp_dns_summary">由远程服务器转发 UDP 协议的数据包</string>
<string name="onetime_auth">一次性认证</string>
<string name="onetime_auth_summary">启用一次性认证</string>
<string name="ipv6">IPv6 路由</string>
<string name="ipv6_summary">向远程服务器转发 IPv6 流量</string>
<string name="stat">网络流量</string>
<string name="stat_summary">发送: \t%3$s\t↑\t%1$s/s\n接收: \t%4$s\t↓\t%2$s/s</string>
<plurals name="bytes">
<item quantity="other">字节</item>
</plurals>
<string name="connection_test_pending">检查网络连接</string>
<string name="connection_test_testing">测试中……</string>
<string name="connection_test_available">连接有效: 延时 %d 毫秒</string>
<string name="connection_test_fail">无互联网连接</string>
<string name="connection_test_error">失败:%s</string>
<string name="connection_test_error_status_code">状态码无效(#%d)</string>
<!-- profile -->
<string name="profile_manager_dialog">配置文件</string>
<string name="profile_manager_dialog_content">&#8226; 点击选择配置文件;\n&#8226; 向左/右滑动或按左删除;\n&#8226;
长按拖动改变顺序。</string>
<string name="gotcha">好的</string>
<string name="copy_url">复制 URL</string>
<string name="add_profile_dialog">为影梭添加此配置文件?</string>
<string name="add_profile_methods_scan_qr_code">扫描二维码</string>
<string name="add_profile_methods_manual_settings">手动设置</string>
<string name="add_profile_nfc_hint_title">使用 Android Beam (NFC) 来添加配置</string>
<string name="add_profile_nfc_hint">保持两台设备的屏幕亮起,在另外一台设备上,点击配置文件的分享按钮,将它们靠在一起(背靠背)。\n你也可以扫描 NFC 标签。</string>
<string name="add_profile_scanner_permission_required">扫描二维码需要相机权限。</string>
<string-array name="route_entry">
<item>全局</item>
<item>绕过局域网地址</item>
<item>绕过中国大陆地址</item>
<item>绕过局域网及中国大陆地址</item>
</string-array>
<string name="action_apply_all">应用设置到所有配置文件</string>
<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>
<plurals name="removed">
<item quantity="one">已删除</item>
<item quantity="other">已删除 %d 项</item>
</plurals>
<string name="undo">撤销</string>
<string name="toggle_service_state">启动服务</string>
<string name="start_service_default">连接到当前服务器</string>
<string name="start_service">连接到 %s</string>
<string name="stop_service">切换到 %s</string>
<string name="profile_default">使用当前配置</string>
<!-- status -->
<string name="sent">发送:</string>
<string name="received">接收:</string>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="proxied_apps_summary">為已選擇的應用程式設定 Proxy</string>
</resources>
+118 -98
View File
@@ -1,121 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">影梭</string>
<string name="global_cat">全局设置</string>
<string name="app_name">Shadowsocks</string>
<string name="quick_toggle">開關</string>
<string name="misc_cat">其他</string>
<string name="proxy_cat">服务器设置</string>
<string name="profile_name">配置名称</string>
<string name="profile">配置文件</string>
<string name="profile_summary">新建或切换到其他配置文件</string>
<string name="proxy">服务器</string>
<string name="proxy_summary">远程服务器的地址</string>
<string name="remote_port">远程端口</string>
<string name="remote_port_summary">%d(远程服务器的端口号)</string>
<string name="port">本地端口</string>
<string name="port_summary">%d(本地客户端的端口号)</string>
<string name="sitekey">密码</string>
<string name="sitekey_summary">远程服务器的密码</string>
<string name="proxy_cat">伺服器設定</string>
<string name="profile_name">設定檔名稱</string>
<string name="profile">設定檔</string>
<string name="profile_summary">切換至其他設定檔或新增新設定檔</string>
<string name="proxy">伺服器</string>
<string name="proxy_summary">遠端伺服器的 IP 位址或主機名稱</string>
<string name="remote_port">遠端連接埠</string>
<string name="remote_port_summary">%d(遠端伺服器的連接埠號碼)</string>
<string name="port">連接埠號碼</string>
<string name="port_summary">%d(本機伺服器的連接埠號碼)</string>
<string name="sitekey">密碼</string>
<string name="sitekey_summary">遠端伺服器的密碼</string>
<string name="enc_method">加密方法</string>
<string name="feature_cat">功能设置</string>
<string name="http_proxy">HTTP 代理服务器</string>
<string name="http_proxy_summary">本地 HTTP 代理</string>
<string name="dns_proxy">DNS 代理</string>
<string name="dns_proxy_summary">重定向 DNS 查询到远程服务器</string>
<string name="auto_set_gfwlist">国内路由</string>
<string name="auto_set_gfwlist_summary">绕过所有位于中国的网站</string>
<string name="feature_cat">功能設定</string>
<string name="http_proxy">HTTP Proxy</string>
<string name="http_proxy_summary">本機 HTTP Proxy</string>
<string name="dns_proxy">DNS Proxy</string>
<string name="dns_proxy_summary">重新導向 DNS 查詢至遠端</string>
<string name="auto_set_gfwlist">中國大陸路由</string>
<string name="auto_set_gfwlist_summary">略過一切中國大陸的網站</string>
<string name="route_list">路由</string>
<string name="proxied_apps">分应用代理</string>
<string name="proxied_apps_summary">为应用程序分别设置代理</string>
<string name="on">开</string>
<string name="bypass_apps">绕行模式</string>
<string name="bypass_apps_summary">启用该选项,以使所选应用程序的流量不经过代理</string>
<string name="auto_connect">自动连接</string>
<string name="auto_connect_summary">随系统启动后台服务</string>
<string name="forward_success">后台服务已开始运行。</string>
<string name="service_failed">无法连接远程服务器</string>
<string name="nat_no_root">NAT 模式需要 ROOT 权限</string>
<string name="switch_to_vpn">切换到 VPN 模式</string>
<string name="stop">停止服务</string>
<string name="stopping">正在关闭……</string>
<string name="vpn_error">后台服务启动失败:%s</string>
<string name="reboot_required">VPN 服务启动失败。你可能需要重启设备。</string>
<string name="close">关闭</string>
<string name="proxy_empty">代理服务器地址及密码不能为空</string>
<string name="connect">连接</string>
<string name="initializing">正在初始化……</string>
<string name="recovering">重置中……</string>
<string name="loading">正在加载……</string>
<string name="profiles">配置文件</string>
<string name="settings">设置选项</string>
<string name="remove_profile">删除此配置文件「%s」?</string>
<string name="recovery">重置</string>
<string name="recovery_summary">重置所有后台服务</string>
<string name="about">关于</string>
<string name="about_title">影梭(shadowsocks)%s</string>
<string name="flush_dnscache">刷新 DNS 缓存</string>
<string name="flush_dnscache_summary">只需在 NAT 模式下使用</string>
<string name="flush_dnscache_summary_root">只需在 NAT 模式下使用,需要 ROOT 权限</string>
<string name="flush_dnscache_no_root">在没有 ROOT 权限的情况下无法刷新 DNS 缓存</string>
<string name="flushing">刷新中……</string>
<string name="qrcode">二维码</string>
<string name="add_profile">添加配置文件</string>
<string name="proxied_apps">個別應用程式的 Proxy</string>
<string name="proxied_apps_summary">為已選擇的應用程式設定 Proxy,在 Android 4.X 以下需要開啟 NAT 模式</string>
<string name="on">開</string>
<string name="bypass_apps">略過模式</string>
<string name="bypass_apps_summary">啟用此選項,會略過已選擇的應用程式</string>
<string name="auto_connect">自動連線</string>
<string name="auto_connect_summary">在裝置啟動時啟用 Shadowsocks</string>
<string name="forward_success">Shadowsocks 已啟動。</string>
<string name="service_failed">連線至遠端伺服器失敗</string>
<string name="invalid_server">伺服器名稱無效</string>
<string name="nat_deprecated">警告:自 Android 5.0 開始, NAT 模式已過時</string>
<string name="nat_no_root">NAT 模式需要 ROOT 權限</string>
<string name="switch_to_vpn">切換至 VPN 模式</string>
<string name="stop">停止</string>
<string name="quick_switch">切換</string>
<string name="stopping">關閉中……</string>
<string name="vpn_error">%s</string>
<string name="reboot_required">VPN 服務啟動失敗。您或許需要重新啟動您的裝置。</string>
<string name="close">關閉</string>
<string name="proxy_empty">Proxy 或密碼不可以空白</string>
<string name="connect">連線</string>
<string name="initializing">起始中……</string>
<string name="recovering">重設中……</string>
<string name="loading">載入中……</string>
<string name="profiles">設定檔</string>
<string name="settings">設定</string>
<string name="remove_profile">移除此設定檔 "%s"?</string>
<string name="recovery">重設</string>
<string name="recovery_summary">重設一切背景服務</string>
<string name="about">關於</string>
<string name="about_title">Shadowsocks %s</string>
<string name="flush_dnscache">清除 DNS 快取</string>
<string name="flush_dnscache_summary">僅在 NAT 模式可用</string>
<string name="flush_dnscache_summary_root">僅在 NAT 模式可用,需要 ROOT 權限</string>
<string name="flush_dnscache_no_root">在無 ROOT 權限時清除 DNS 快取無法進行</string>
<string name="flushing">清除中……</string>
<string name="share">分享</string>
<string name="share_message">掃描 QR 碼或者使用 Android Beam (NFC)</string>
<string name="share_message_without_nfc">掃描 QR 碼</string>
<string name="share_message_nfc_disabled">掃描 QR 碼\nAndroid Beam 被停用</string>
<string name="turn_on_nfc">啟用 NFC &amp; Android Beam</string>
<string name="add_profile">新增設定檔</string>
<string name="nat">NAT 模式 (仅限调试)</string>
<string name="nat_summary">从 VPN 模式切换为 NAT 模式,需要 ROOT 权限</string>
<string name="nat">NAT 模式 (已過時)</string>
<string name="nat_summary">使用 NAT 模式代替 VPN 模式,需要 ROOT 權限</string>
<string name="udp_dns">UDP 转发</string>
<string name="udp_dns_summary">由远程服务器转发 UDP 协议的数据包</string>
<string name="udp_dns">UDP 轉送</string>
<string name="udp_dns_summary">向遠端轉送 UDP 封包</string>
<string name="onetime_auth">一次性认证</string>
<string name="onetime_auth_summary">启用一次性认证(实验性)</string>
<string name="onetime_auth">單次驗證</string>
<string name="onetime_auth_summary">啟用單次驗證</string>
<string name="ipv6">IPv6 路由</string>
<string name="ipv6_summary">向远程服务器转发 IPv6 流量</string>
<string name="ipv6_summary">向遠端重新導向 IPv6 流量</string>
<string name="stat">网络流量</string>
<string name="stat_summary">发送: \t%3$s\t↑\t%1$s/s\n接收: \t%4$s\t↓\t%2$s/s</string>
<string name="stat">網路流量</string>
<string name="stat_summary">傳送: \t%3$s\t↑\t%1$s/s\n接收: \t%4$s\t↓\t%2$s/s</string>
<plurals name="bytes">
<item quantity="other">位元組</item>
</plurals>
<string name="connection_test_pending">检查网络连接</string>
<string name="connection_test_testing">测试中……</string>
<string name="connection_test_available">连接有效: 延时 %d 毫秒</string>
<string name="connection_test_fail">无互联网连接</string>
<string name="connection_test_error">失败:%s</string>
<string name="connection_test_error_status_code">状态码无效(#%d)</string>
<string name="connection_test_pending">檢查連線能力</string>
<string name="connection_test_testing">測試中……</string>
<string name="connection_test_available">成功: %d 毫秒延遲</string>
<string name="connection_test_fail">無法使用網際網路</string>
<string name="connection_test_error">偵測出網際網路連線失敗: %s</string>
<string name="connection_test_error_status_code">錯誤碼: #%d</string>
<!-- profile -->
<string name="profile_manager_dialog">配置文件</string>
<string name="profile_manager_dialog_content">&#8226; 点击选择配置文件;\n&#8226; 滑动删除;\n&#8226;
长按拖动改变顺序。</string>
<string name="gotcha">好的</string>
<string name="add_profile_dialog">为影梭添加此配置文件?</string>
<string name="add_profile_methods_scan_qr_code">扫描二维码</string>
<string name="add_profile_methods_manual_settings">手动设置</string>
<string name="profile_manager_dialog">設定檔</string>
<string name="profile_manager_dialog_content">&#8226; 輕觸選擇一個設定檔;\n&#8226; 向左/右撥動或按左移除;\n&#8226;
按住後上下撥動設定檔重新排序。</string>
<string name="gotcha">我懂了!</string>
<string name="copy_url">複製 URL</string>
<string name="add_profile_dialog">為 Shadowsocks 新增此設定檔?</string>
<string name="add_profile_methods_scan_qr_code">掃描 QR 碼</string>
<string name="add_profile_methods_manual_settings">手動設定</string>
<string name="add_profile_nfc_hint_title">使用 Android Beam (NFC) 來新增設定檔</string>
<string name="add_profile_nfc_hint">
保持兩台設備的屏幕亮起,在另外一台設備上,點擊設定檔的分享按鈕,將它們靠在一起(背靠背)。\n你也可以掃描 NFC 標籤。</string>
<string name="add_profile_scanner_permission_required">掃描 QR 碼需要相機權限。</string>
<string-array name="route_entry">
<item>全局</item>
<item>绕过局域网地址</item>
<item>绕过局域网及中国大陆地址</item>
<item>全域</item>
<item>略過區域網路位址</item>
<item>略過中國大陸位址</item>
<item>略過區域網路及中國大陸位址</item>
</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="action_apply_all">應用設置到所有配置文件</string>
<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="removed">已删除</string>
<string name="undo">撤销</string>
<string name="toggle_service_state">启动服务</string>
<string name="start_service_default">连接到当前服务器</string>
<string name="start_service">连接到 %s</string>
<string name="stop_service">切换到 %s</string>
<string name="profile_default">使用当前配置</string>
<plurals name="removed">
<item quantity="one">已移除</item>
<item quantity="other">已移除 %d 項</item>
</plurals>
<string name="undo">復原</string>
<string name="toggle_service_state">啟動服務</string>
<string name="start_service_default">連線至目前的伺服器</string>
<string name="start_service">連線至 %s</string>
<string name="stop_service">切換至 %s</string>
<string name="profile_default">使用目前的設定檔</string>
<!-- status -->
<string name="sent">发送:</string>
<string name="sent">傳送:</string>
<string name="received">接收:</string>
<string name="check_connectivity">检查网络连接</string>
</resources>
+2
View File
@@ -45,6 +45,7 @@
<string-array name="route_entry">
<item>All</item>
<item>Bypass LAN</item>
<item>Bypass China</item>
<item>Bypass LAN &amp; China</item>
</string-array>
@@ -52,6 +53,7 @@
<item>all</item>
<item>bypass-lan</item>
<item>bypass-china</item>
<item>bypass-lan-china</item>
</string-array>
<string-array name="private_route">
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More