Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
com.ccwangluo.accelerator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
com.ccwangluo.accelerator
Commits
6dede5c0
Commit
6dede5c0
authored
Mar 12, 2016
by
Mygod
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import/export one/all ss urls
parent
fb3f7429
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
67 additions
and
33 deletions
+67
-33
src/main/res/menu/app_manager_menu.xml
src/main/res/menu/app_manager_menu.xml
+9
-5
src/main/res/menu/profile_manager_menu.xml
src/main/res/menu/profile_manager_menu.xml
+8
-0
src/main/res/values-zh/strings.xml
src/main/res/values-zh/strings.xml
+1
-0
src/main/res/values/strings.xml
src/main/res/values/strings.xml
+1
-0
src/main/scala/com/github/shadowsocks/AppManager.scala
src/main/scala/com/github/shadowsocks/AppManager.scala
+16
-20
src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala
...scala/com/github/shadowsocks/ProfileManagerActivity.scala
+29
-5
src/main/scala/com/github/shadowsocks/utils/Parser.scala
src/main/scala/com/github/shadowsocks/utils/Parser.scala
+3
-3
No files found.
src/main/res/menu/app_manager_menu.xml
View file @
6dede5c0
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:id=
"@+id/action_export"
android:title=
"@string/action_export"
android:showAsAction=
"never"
/>
<item
android:id=
"@+id/action_import"
<item
android:id=
"@+id/action_import"
android:title=
"@string/action_import"
android:title=
"@string/action_import"
android:showAsAction=
"never"
/>
android:showAsAction=
"never"
android:alphabeticShortcut=
"i"
android:numericShortcut=
"1"
/>
<item
android:id=
"@+id/action_export"
android:title=
"@string/action_export"
android:showAsAction=
"never"
android:alphabeticShortcut=
"e"
android:numericShortcut=
"2"
/>
</menu>
</menu>
src/main/res/menu/profile_manager_menu.xml
View file @
6dede5c0
...
@@ -15,6 +15,14 @@
...
@@ -15,6 +15,14 @@
android:title=
"@string/add_profile_methods_manual_settings"
android:title=
"@string/add_profile_methods_manual_settings"
android:alphabeticShortcut=
"m"
android:alphabeticShortcut=
"m"
android:numericShortcut=
"2"
/>
android:numericShortcut=
"2"
/>
<item
android:id=
"@+id/action_import"
android:title=
"@string/action_import"
android:alphabeticShortcut=
"i"
android:numericShortcut=
"3"
/>
<item
android:id=
"@+id/action_export"
android:title=
"@string/action_export"
android:alphabeticShortcut=
"e"
android:numericShortcut=
"4"
/>
</menu>
</menu>
</item>
</item>
</menu>
</menu>
src/main/res/values-zh/strings.xml
View file @
6dede5c0
...
@@ -90,6 +90,7 @@
...
@@ -90,6 +90,7 @@
<string
name=
"profile_manager_dialog_content"
>
•
点击选择配置文件;\n
•
滑动删除;\n
•
<string
name=
"profile_manager_dialog_content"
>
•
点击选择配置文件;\n
•
滑动删除;\n
•
长按拖动改变顺序。
</string>
长按拖动改变顺序。
</string>
<string
name=
"gotcha"
>
好的
</string>
<string
name=
"gotcha"
>
好的
</string>
<string
name=
"copy_url"
>
复制 URL
</string>
<string
name=
"add_profile_dialog"
>
为影梭添加此配置文件?
</string>
<string
name=
"add_profile_dialog"
>
为影梭添加此配置文件?
</string>
<string
name=
"add_profile_methods_scan_qr_code"
>
扫描二维码
</string>
<string
name=
"add_profile_methods_scan_qr_code"
>
扫描二维码
</string>
<string
name=
"add_profile_methods_manual_settings"
>
手动设置
</string>
<string
name=
"add_profile_methods_manual_settings"
>
手动设置
</string>
...
...
src/main/res/values/strings.xml
View file @
6dede5c0
...
@@ -113,6 +113,7 @@
...
@@ -113,6 +113,7 @@
<string
name=
"add_profile_dialog"
>
Add this Shadowsocks Profile?
</string>
<string
name=
"add_profile_dialog"
>
Add this Shadowsocks Profile?
</string>
<string
name=
"add_profile_methods_scan_qr_code"
>
Scan QR code
</string>
<string
name=
"add_profile_methods_scan_qr_code"
>
Scan QR code
</string>
<string
name=
"add_profile_methods_manual_settings"
>
Manual Settings
</string>
<string
name=
"add_profile_methods_manual_settings"
>
Manual Settings
</string>
<string
name=
"copy_url"
>
Copy URL
</string>
<plurals
name=
"removed"
>
<plurals
name=
"removed"
>
<item
quantity=
"one"
>
Removed
</item>
<item
quantity=
"one"
>
Removed
</item>
<item
quantity=
"other"
>
%d items removed
</item>
<item
quantity=
"other"
>
%d items removed
</item>
...
...
src/main/scala/com/github/shadowsocks/AppManager.scala
View file @
6dede5c0
...
@@ -154,26 +154,22 @@ class AppManager extends AppCompatActivity with OnCheckedChangeListener with OnC
...
@@ -154,26 +154,22 @@ class AppManager extends AppCompatActivity with OnCheckedChangeListener with OnC
return
true
return
true
case
R
.
id
.
action_import
=>
case
R
.
id
.
action_import
=>
if
(
clipboard
.
hasPrimaryClip
)
{
if
(
clipboard
.
hasPrimaryClip
)
{
val
clipdata
=
clipboard
.
getPrimaryClip
val
proxiedAppSequence
=
clipboard
.
getPrimaryClip
.
getItemAt
(
0
).
getText
val
label
=
clipdata
.
getDescription
.
getLabel
if
(
proxiedAppSequence
!=
null
)
{
if
(
label
==
Key
.
proxied
)
{
val
proxiedAppString
=
proxiedAppSequence
.
toString
val
proxiedAppSequence
=
clipdata
.
getItemAt
(
0
).
getText
if
(!
proxiedAppString
.
isEmpty
)
{
if
(
proxiedAppSequence
!=
null
)
{
val
editor
=
prefs
.
edit
val
proxiedAppString
=
proxiedAppSequence
.
toString
val
i
=
proxiedAppString
.
indexOf
(
'\n'
)
if
(!
proxiedAppString
.
isEmpty
)
{
if
(
i
<
0
)
val
editor
=
prefs
.
edit
editor
.
putBoolean
(
Key
.
isBypassApps
,
proxiedAppString
.
toBoolean
).
putString
(
Key
.
proxied
,
""
).
apply
()
val
i
=
proxiedAppString
.
indexOf
(
'\n'
)
else
editor
.
putBoolean
(
Key
.
isBypassApps
,
proxiedAppString
.
substring
(
0
,
i
).
toBoolean
)
if
(
i
<
0
)
.
putString
(
Key
.
proxied
,
proxiedAppString
.
substring
(
i
+
1
)).
apply
()
editor
.
putBoolean
(
Key
.
isBypassApps
,
proxiedAppString
.
toBoolean
).
putString
(
Key
.
proxied
,
""
).
apply
()
Toast
.
makeText
(
this
,
R
.
string
.
action_import_msg
,
Toast
.
LENGTH_SHORT
).
show
()
else
editor
.
putBoolean
(
Key
.
isBypassApps
,
proxiedAppString
.
substring
(
0
,
i
).
toBoolean
)
// Restart activity
.
putString
(
Key
.
proxied
,
proxiedAppString
.
substring
(
i
+
1
)).
apply
()
appListView
.
setVisibility
(
View
.
GONE
)
Toast
.
makeText
(
this
,
R
.
string
.
action_import_msg
,
Toast
.
LENGTH_SHORT
).
show
()
loadingView
.
setVisibility
(
View
.
VISIBLE
)
// Restart activity
reloadApps
()
appListView
.
setVisibility
(
View
.
GONE
)
return
true
loadingView
.
setVisibility
(
View
.
VISIBLE
)
reloadApps
()
return
true
}
}
}
}
}
}
}
...
...
src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala
View file @
6dede5c0
package
com.github.shadowsocks
package
com.github.shadowsocks
import
android.content.
Intent
import
android.content.
_
import
android.os.
{
Bundle
,
Handler
}
import
android.os.
{
Bundle
,
Handler
}
import
android.support.v7.app.
{
AlertDialog
,
AppCompatActivity
}
import
android.support.v7.app.
{
AlertDialog
,
AppCompatActivity
}
import
android.support.v7.widget.RecyclerView.ViewHolder
import
android.support.v7.widget.RecyclerView.ViewHolder
...
@@ -32,17 +32,20 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
...
@@ -32,17 +32,20 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
{
{
val
qrcode
=
itemView
.
findViewById
(
R
.
id
.
qrcode
)
val
qrcode
=
itemView
.
findViewById
(
R
.
id
.
qrcode
)
qrcode
.
setOnClickListener
((
v
:
View
)
=>
{
qrcode
.
setOnClickListener
(
_
=>
{
val
url
=
Parser
.
generate
(
item
)
val
image
=
new
ImageView
(
ProfileManagerActivity
.
this
)
val
image
=
new
ImageView
(
ProfileManagerActivity
.
this
)
image
.
setLayoutParams
(
new
LinearLayout
.
LayoutParams
(-
1
,
-
1
))
image
.
setLayoutParams
(
new
LinearLayout
.
LayoutParams
(-
1
,
-
1
))
val
qrcode
=
QRCode
.
from
(
Parser
.
generate
(
item
)
)
val
qrcode
=
QRCode
.
from
(
url
)
.
withSize
(
Utils
.
dpToPx
(
ProfileManagerActivity
.
this
,
250
),
Utils
.
dpToPx
(
ProfileManagerActivity
.
this
,
250
))
.
withSize
(
Utils
.
dpToPx
(
ProfileManagerActivity
.
this
,
250
),
Utils
.
dpToPx
(
ProfileManagerActivity
.
this
,
250
))
.
asInstanceOf
[
QRCode
].
bitmap
()
.
asInstanceOf
[
QRCode
].
bitmap
()
image
.
setImageBitmap
(
qrcode
)
image
.
setImageBitmap
(
qrcode
)
new
AlertDialog
.
Builder
(
ProfileManagerActivity
.
this
)
new
AlertDialog
.
Builder
(
ProfileManagerActivity
.
this
)
.
setCancelable
(
true
)
.
setCancelable
(
true
)
.
setNegativeButton
(
R
.
string
.
close
,
null
)
.
setPositiveButton
(
R
.
string
.
close
,
null
)
.
setNegativeButton
(
R
.
string
.
copy_url
,
((
_
,
_
)
=>
clipboard
.
setPrimaryClip
(
ClipData
.
newPlainText
(
null
,
url
)))
:
DialogInterface.OnClickListener
)
.
setView
(
image
)
.
setView
(
image
)
.
create
()
.
create
()
.
show
()
.
show
()
...
@@ -144,6 +147,8 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
...
@@ -144,6 +147,8 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
private
lazy
val
profilesAdapter
=
new
ProfilesAdapter
private
lazy
val
profilesAdapter
=
new
ProfilesAdapter
private
var
undoManager
:
UndoSnackbarManager
[
Profile
]
=
_
private
var
undoManager
:
UndoSnackbarManager
[
Profile
]
=
_
private
lazy
val
clipboard
=
getSystemService
(
Context
.
CLIPBOARD_SERVICE
).
asInstanceOf
[
ClipboardManager
]
override
def
onCreate
(
savedInstanceState
:
Bundle
)
{
override
def
onCreate
(
savedInstanceState
:
Bundle
)
{
super
.
onCreate
(
savedInstanceState
)
super
.
onCreate
(
savedInstanceState
)
setContentView
(
R
.
layout
.
layout_profiles
)
setContentView
(
R
.
layout
.
layout_profiles
)
...
@@ -216,7 +221,7 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
...
@@ -216,7 +221,7 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
Parser
.
findAll
(
scanResult
.
getContents
).
foreach
(
ShadowsocksApplication
.
profileManager
.
createProfile
)
Parser
.
findAll
(
scanResult
.
getContents
).
foreach
(
ShadowsocksApplication
.
profileManager
.
createProfile
)
}
}
def
onMenuItemClick
(
item
:
MenuItem
)
=
item
.
getItemId
match
{
def
onMenuItemClick
(
item
:
MenuItem
)
:
Boolean
=
item
.
getItemId
match
{
case
R
.
id
.
scan_qr_code
=>
case
R
.
id
.
scan_qr_code
=>
val
integrator
=
new
IntentIntegrator
(
this
)
val
integrator
=
new
IntentIntegrator
(
this
)
val
list
=
new
java
.
util
.
ArrayList
(
IntentIntegrator
.
TARGET_ALL_KNOWN
)
val
list
=
new
java
.
util
.
ArrayList
(
IntentIntegrator
.
TARGET_ALL_KNOWN
)
...
@@ -229,6 +234,25 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
...
@@ -229,6 +234,25 @@ class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClickListe
ShadowsocksApplication
.
switchProfile
(
ShadowsocksApplication
.
profileManager
.
save
.
id
)
ShadowsocksApplication
.
switchProfile
(
ShadowsocksApplication
.
profileManager
.
save
.
id
)
finish
finish
true
true
case
R
.
id
.
action_import
=>
if
(
clipboard
.
hasPrimaryClip
)
{
val
profiles
=
Parser
.
findAll
(
clipboard
.
getPrimaryClip
.
getItemAt
(
0
).
getText
)
if
(
profiles
.
nonEmpty
)
{
profiles
.
foreach
(
ShadowsocksApplication
.
profileManager
.
createProfile
)
Toast
.
makeText
(
this
,
R
.
string
.
action_import_msg
,
Toast
.
LENGTH_SHORT
).
show
return
true
}
}
Toast
.
makeText
(
this
,
R
.
string
.
action_import_err
,
Toast
.
LENGTH_SHORT
).
show
true
case
R
.
id
.
action_export
=>
ShadowsocksApplication
.
profileManager
.
getAllProfiles
match
{
case
Some
(
profiles
)
=>
clipboard
.
setPrimaryClip
(
ClipData
.
newPlainText
(
null
,
profiles
.
map
(
Parser
.
generate
).
mkString
(
"\n"
)))
Toast
.
makeText
(
this
,
R
.
string
.
action_export_msg
,
Toast
.
LENGTH_SHORT
).
show
case
_
=>
Toast
.
makeText
(
this
,
R
.
string
.
action_export_err
,
Toast
.
LENGTH_SHORT
).
show
}
true
case
_
=>
false
case
_
=>
false
}
}
}
}
src/main/scala/com/github/shadowsocks/utils/Parser.scala
View file @
6dede5c0
...
@@ -46,12 +46,12 @@ import com.github.shadowsocks.database.Profile
...
@@ -46,12 +46,12 @@ import com.github.shadowsocks.database.Profile
object
Parser
{
object
Parser
{
val
TAG
=
"ShadowParser"
val
TAG
=
"ShadowParser"
private
val
pattern
=
"(?i)ss://([A-Za-z0-9+
/=
]+)"
.
r
private
val
pattern
=
"(?i)ss://([A-Za-z0-9+
-/=_
]+)"
.
r
def
generate
(
profile
:
Profile
)
:
String
=
"ss://"
+
Base64
.
encodeToString
(
"%s:%s@%s:%d"
.
formatLocal
(
Locale
.
ENGLISH
,
def
generate
(
profile
:
Profile
)
:
String
=
"ss://"
+
Base64
.
encodeToString
(
"%s:%s@%s:%d"
.
formatLocal
(
Locale
.
ENGLISH
,
profile
.
method
,
profile
.
password
,
profile
.
host
,
profile
.
remotePort
).
getBytes
,
Base64
.
NO_PADDING
)
profile
.
method
,
profile
.
password
,
profile
.
host
,
profile
.
remotePort
).
getBytes
,
Base64
.
NO_PADDING
|
Base64
.
NO_WRAP
)
def
findAll
(
data
:
String
)
=
pattern
.
findAllMatchIn
(
data
).
map
(
m
=>
try
{
def
findAll
(
data
:
CharSequence
)
=
pattern
.
findAllMatchIn
(
data
).
map
(
m
=>
try
{
val
content
=
new
String
(
Base64
.
decode
(
m
.
group
(
1
),
Base64
.
NO_PADDING
),
"UTF-8"
)
val
content
=
new
String
(
Base64
.
decode
(
m
.
group
(
1
),
Base64
.
NO_PADDING
),
"UTF-8"
)
val
methodIdx
=
content
.
indexOf
(
':'
)
val
methodIdx
=
content
.
indexOf
(
':'
)
val
passwordIdx
=
content
.
lastIndexOf
(
'@'
)
val
passwordIdx
=
content
.
lastIndexOf
(
'@'
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment