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
ef519a85
Commit
ef519a85
authored
Dec 19, 2017
by
Mygod
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Clean up ServiceButton related code
parent
540b1d37
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
53 additions
and
35 deletions
+53
-35
mobile/src/main/java/com/github/shadowsocks/MainActivity.kt
mobile/src/main/java/com/github/shadowsocks/MainActivity.kt
+3
-17
mobile/src/main/java/com/github/shadowsocks/widget/ServiceButton.kt
.../main/java/com/github/shadowsocks/widget/ServiceButton.kt
+43
-16
mobile/src/main/res/color/background_service.xml
mobile/src/main/res/color/background_service.xml
+5
-0
mobile/src/main/res/layout/layout_main.xml
mobile/src/main/res/layout/layout_main.xml
+2
-2
No files found.
mobile/src/main/java/com/github/shadowsocks/MainActivity.kt
View file @
ef519a85
...
...
@@ -31,14 +31,12 @@ import android.nfc.NfcAdapter
import
android.os.Bundle
import
android.os.SystemClock
import
android.support.customtabs.CustomTabsIntent
import
android.support.design.widget.FloatingActionButton
import
android.support.design.widget.Snackbar
import
android.support.v4.content.ContextCompat
import
android.support.v7.app.AlertDialog
import
android.support.v7.app.AppCompatActivity
import
android.support.v7.content.res.AppCompatResources
import
android.support.v7.preference.PreferenceDataStore
import
android.support.v7.widget.TooltipCompat
import
android.util.Log
import
android.view.View
import
android.widget.TextView
...
...
@@ -87,8 +85,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe
}
// UI
private
lateinit
var
fab
:
FloatingActionButton
private
val
fabHelper
by
lazy
{
ServiceButton
(
fab
)
}
private
lateinit
var
fab
:
ServiceButton
internal
var
crossfader
:
Crossfader
<
CrossFadeSlidingPaneLayout
>?
=
null
internal
lateinit
var
drawer
:
Drawer
private
var
previousSelectedDrawer
:
Long
=
0
// it's actually lateinit
...
...
@@ -110,9 +107,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe
}
catch
(
_
:
ActivityNotFoundException
)
{
}
// ignore
fun
launchUrl
(
uri
:
String
)
=
launchUrl
(
Uri
.
parse
(
uri
))
private
val
greyTint
by
lazy
{
ContextCompat
.
getColorStateList
(
this
,
R
.
color
.
material_primary_500
)
}
private
val
greenTint
by
lazy
{
ContextCompat
.
getColorStateList
(
this
,
R
.
color
.
material_green_700
)
}
// service
var
state
=
BaseService
.
IDLE
override
val
serviceCallback
:
IShadowsocksServiceCallback
.
Stub
by
lazy
{
...
...
@@ -130,7 +124,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe
}
fun
changeState
(
state
:
Int
,
msg
:
String
?
=
null
,
animate
:
Boolean
=
false
)
{
fab
Helper
.
changeState
(
state
,
animate
)
fab
.
changeState
(
state
,
animate
)
when
(
state
)
{
BaseService
.
CONNECTING
->
statusText
.
setText
(
R
.
string
.
connecting
)
BaseService
.
CONNECTED
->
statusText
.
setText
(
R
.
string
.
vpn_connected
)
...
...
@@ -145,20 +139,12 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe
}
}
this
.
state
=
state
if
(
state
==
BaseService
.
CONNECTED
)
{
fab
.
backgroundTintList
=
greenTint
TooltipCompat
.
setTooltipText
(
fab
,
getString
(
R
.
string
.
stop
))
}
else
{
fab
.
backgroundTintList
=
greyTint
TooltipCompat
.
setTooltipText
(
fab
,
getString
(
R
.
string
.
connect
))
if
(
state
!=
BaseService
.
CONNECTED
)
{
updateTraffic
(-
1
,
0
,
0
,
0
,
0
)
testCount
+=
1
// suppress previous test messages
}
ProfilesFragment
.
instance
?.
profilesAdapter
?.
notifyDataSetChanged
()
// refresh button enabled state
stateListener
?.
invoke
(
state
)
fab
.
isEnabled
=
false
if
(
state
==
BaseService
.
CONNECTED
||
state
==
BaseService
.
STOPPED
)
app
.
handler
.
postDelayed
(
{
fab
.
isEnabled
=
state
==
BaseService
.
CONNECTED
||
state
==
BaseService
.
STOPPED
},
1000
)
}
fun
updateTraffic
(
profileId
:
Int
,
txRate
:
Long
,
rxRate
:
Long
,
txTotal
:
Long
,
rxTotal
:
Long
)
{
txText
.
text
=
TrafficMonitor
.
formatTraffic
(
txTotal
)
...
...
mobile/src/main/java/com/github/shadowsocks/widget/ServiceButton.kt
View file @
ef519a85
...
...
@@ -20,19 +20,38 @@
package
com.github.shadowsocks.widget
import
android.content.Context
import
android.graphics.drawable.Drawable
import
android.support.annotation.DrawableRes
import
android.support.design.widget.FloatingActionButton
import
android.support.graphics.drawable.Animatable2Compat
import
android.support.graphics.drawable.AnimatedVectorDrawableCompat
import
android.support.v7.widget.TooltipCompat
import
android.util.AttributeSet
import
android.view.View
import
com.github.shadowsocks.App
import
com.github.shadowsocks.R
import
com.github.shadowsocks.bg.BaseService
import
java.util.*
class
ServiceButton
(
private
val
fab
:
FloatingActionButton
)
:
Animatable2Compat
.
AnimationCallback
()
{
class
ServiceButton
@JvmOverloads
constructor
(
context
:
Context
,
attrs
:
AttributeSet
?
=
null
,
defStyleAttr
:
Int
=
0
)
:
FloatingActionButton
(
context
,
attrs
,
defStyleAttr
)
{
private
val
callback
=
object
:
Animatable2Compat
.
AnimationCallback
()
{
override
fun
onAnimationEnd
(
drawable
:
Drawable
)
{
super
.
onAnimationEnd
(
drawable
)
var
next
=
animationQueue
.
peek
()
?:
return
if
(
next
.
current
==
drawable
)
{
animationQueue
.
pop
()
next
=
animationQueue
.
peek
()
?:
return
}
setImageDrawable
(
next
)
next
.
start
()
}
}
private
fun
createIcon
(
@DrawableRes
resId
:
Int
):
AnimatedVectorDrawableCompat
{
val
result
=
AnimatedVectorDrawableCompat
.
create
(
fab
.
context
,
resId
)
!!
result
.
registerAnimationCallback
(
this
)
val
result
=
AnimatedVectorDrawableCompat
.
create
(
context
,
resId
)
!!
result
.
registerAnimationCallback
(
callback
)
return
result
}
...
...
@@ -42,6 +61,14 @@ class ServiceButton(private val fab: FloatingActionButton) : Animatable2Compat.A
private
val
iconStopping
by
lazy
{
createIcon
(
R
.
drawable
.
ic_service_stopping
)
}
private
val
animationQueue
=
ArrayDeque
<
AnimatedVectorDrawableCompat
>()
private
var
checked
=
false
override
fun
onCreateDrawableState
(
extraSpace
:
Int
):
IntArray
{
val
drawableState
=
super
.
onCreateDrawableState
(
extraSpace
+
1
)
if
(
checked
)
View
.
mergeDrawableStates
(
drawableState
,
intArrayOf
(
android
.
R
.
attr
.
state_checked
))
return
drawableState
}
fun
changeState
(
state
:
Int
,
animate
:
Boolean
)
{
when
(
state
)
{
BaseService
.
CONNECTING
->
changeState
(
iconConnecting
,
animate
)
...
...
@@ -49,6 +76,17 @@ class ServiceButton(private val fab: FloatingActionButton) : Animatable2Compat.A
BaseService
.
STOPPING
->
changeState
(
iconStopping
,
animate
)
else
->
changeState
(
iconStopped
,
animate
)
}
if
(
state
==
BaseService
.
CONNECTED
)
{
checked
=
true
TooltipCompat
.
setTooltipText
(
this
,
context
.
getString
(
R
.
string
.
stop
))
}
else
{
checked
=
false
TooltipCompat
.
setTooltipText
(
this
,
context
.
getString
(
R
.
string
.
connect
))
}
refreshDrawableState
()
isEnabled
=
false
if
(
state
==
BaseService
.
CONNECTED
||
state
==
BaseService
.
STOPPED
)
App
.
app
.
handler
.
postDelayed
(
{
isEnabled
=
state
==
BaseService
.
CONNECTED
||
state
==
BaseService
.
STOPPED
},
1000
)
}
private
fun
counters
(
a
:
AnimatedVectorDrawableCompat
,
b
:
AnimatedVectorDrawableCompat
):
Boolean
=
...
...
@@ -62,26 +100,15 @@ class ServiceButton(private val fab: FloatingActionButton) : Animatable2Compat.A
if
(
animationQueue
.
size
<
2
||
!
counters
(
animationQueue
.
last
,
icon
))
{
animationQueue
.
add
(
icon
)
if
(
animationQueue
.
size
==
1
)
{
fab
.
setImageDrawable
(
icon
)
setImageDrawable
(
icon
)
icon
.
start
()
}
}
else
animationQueue
.
removeLast
()
}
else
{
animationQueue
.
peekFirst
()
?.
stop
()
animationQueue
.
clear
()
fab
.
setImageDrawable
(
icon
)
setImageDrawable
(
icon
)
icon
.
stop
()
}
}
override
fun
onAnimationEnd
(
drawable
:
Drawable
)
{
super
.
onAnimationEnd
(
drawable
)
var
next
=
animationQueue
.
peek
()
?:
return
if
(
next
.
current
==
drawable
)
{
animationQueue
.
pop
()
next
=
animationQueue
.
peek
()
?:
return
}
fab
.
setImageDrawable
(
next
)
next
.
start
()
}
}
mobile/src/main/res/color/background_service.xml
0 → 100644
View file @
ef519a85
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:color=
"@color/material_green_700"
android:state_checked=
"true"
/>
<item
android:color=
"@color/material_primary_500"
/>
</selector>
mobile/src/main/res/layout/layout_main.xml
View file @
ef519a85
...
...
@@ -77,11 +77,11 @@
android:layout_marginEnd=
"16dp"
android:layout_marginTop=
"-28dp"
android:elevation=
"6dp"
>
<
android.support.design.widget.FloatingAction
Button
<
com.github.shadowsocks.widget.Service
Button
android:id=
"@+id/fab"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
app:backgroundTint=
"@color/
material_primary_500
"
app:backgroundTint=
"@color/
background_service
"
app:fabSize=
"normal"
app:pressedTranslationZ=
"6dp"
app:srcCompat=
"@drawable/ic_service_idle"
/>
...
...
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