From d4ec43e526436f3049b74f984de285dca35f0360 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sat, 7 Nov 2015 12:32:22 +0800 Subject: [PATCH] Add more material design (1) --- build.sbt | 3 +- src/main/AndroidManifest.xml | 2 +- src/main/res/drawable-anydpi-v21/ic_cloud.xml | 9 + .../res/drawable-anydpi-v21/ic_cloud_off.xml | 9 + .../drawable-anydpi-v21/ic_cloud_queue.xml | 9 + src/main/res/drawable-hdpi/ic_cloud.png | Bin 0 -> 297 bytes src/main/res/drawable-hdpi/ic_cloud_off.png | Bin 0 -> 462 bytes src/main/res/drawable-hdpi/ic_cloud_queue.png | Bin 0 -> 425 bytes .../drawable-hdpi/md__list_focused_holo.9.png | Bin 191 -> 0 bytes .../md__list_longpressed_holo.9.png | Bin 154 -> 0 bytes .../md__list_pressed_holo_dark.9.png | Bin 159 -> 0 bytes ...md__list_selector_disabled_holo_dark.9.png | Bin 189 -> 0 bytes src/main/res/drawable-mdpi/ic_cloud.png | Bin 0 -> 209 bytes src/main/res/drawable-mdpi/ic_cloud_off.png | Bin 0 -> 330 bytes src/main/res/drawable-mdpi/ic_cloud_queue.png | Bin 0 -> 276 bytes .../drawable-mdpi/md__list_focused_holo.9.png | Bin 171 -> 0 bytes .../md__list_longpressed_holo.9.png | Bin 151 -> 0 bytes .../md__list_pressed_holo_dark.9.png | Bin 158 -> 0 bytes ...md__list_selector_disabled_holo_dark.9.png | Bin 172 -> 0 bytes src/main/res/drawable-xhdpi/ic_cloud.png | Bin 0 -> 354 bytes src/main/res/drawable-xhdpi/ic_cloud_off.png | Bin 0 -> 593 bytes .../res/drawable-xhdpi/ic_cloud_queue.png | Bin 0 -> 537 bytes .../md__list_focused_holo.9.png | Bin 203 -> 0 bytes .../md__list_longpressed_holo.9.png | Bin 158 -> 0 bytes .../md__list_pressed_holo_dark.9.png | Bin 163 -> 0 bytes ...md__list_selector_disabled_holo_dark.9.png | Bin 190 -> 0 bytes src/main/res/drawable-xxhdpi/ic_cloud.png | Bin 0 -> 517 bytes src/main/res/drawable-xxhdpi/ic_cloud_off.png | Bin 0 -> 859 bytes .../res/drawable-xxhdpi/ic_cloud_queue.png | Bin 0 -> 785 bytes src/main/res/drawable-xxxhdpi/ic_cloud.png | Bin 0 -> 660 bytes .../res/drawable-xxxhdpi/ic_cloud_off.png | Bin 0 -> 1126 bytes .../res/drawable-xxxhdpi/ic_cloud_queue.png | Bin 0 -> 1035 bytes ...lector_background_transition_holo_dark.xml | 20 --- .../drawable/md__list_selector_holo_dark.xml | 27 --- src/main/res/layout/layout_apps.xml | 1 + src/main/res/layout/layout_main.xml | 21 +++ src/main/res/layout/layout_switch.xml | 28 ---- src/main/res/layout/toolbar_light_dark.xml | 7 + src/main/res/values-v21/styles_shadow.xml | 96 ----------- src/main/res/values/colors.xml | 8 + src/main/res/values/styles.xml | 27 ++- src/main/res/values/styles_shadow.xml | 93 ----------- .../com/github/shadowsocks/AppManager.scala | 15 +- .../com/github/shadowsocks/Shadowsocks.scala | 155 +++++++----------- .../shadowsocks/ShadowsocksSettings.scala | 12 ++ 45 files changed, 164 insertions(+), 378 deletions(-) create mode 100644 src/main/res/drawable-anydpi-v21/ic_cloud.xml create mode 100644 src/main/res/drawable-anydpi-v21/ic_cloud_off.xml create mode 100644 src/main/res/drawable-anydpi-v21/ic_cloud_queue.xml create mode 100644 src/main/res/drawable-hdpi/ic_cloud.png create mode 100644 src/main/res/drawable-hdpi/ic_cloud_off.png create mode 100644 src/main/res/drawable-hdpi/ic_cloud_queue.png delete mode 100644 src/main/res/drawable-hdpi/md__list_focused_holo.9.png delete mode 100644 src/main/res/drawable-hdpi/md__list_longpressed_holo.9.png delete mode 100644 src/main/res/drawable-hdpi/md__list_pressed_holo_dark.9.png delete mode 100644 src/main/res/drawable-hdpi/md__list_selector_disabled_holo_dark.9.png create mode 100644 src/main/res/drawable-mdpi/ic_cloud.png create mode 100644 src/main/res/drawable-mdpi/ic_cloud_off.png create mode 100644 src/main/res/drawable-mdpi/ic_cloud_queue.png delete mode 100644 src/main/res/drawable-mdpi/md__list_focused_holo.9.png delete mode 100644 src/main/res/drawable-mdpi/md__list_longpressed_holo.9.png delete mode 100644 src/main/res/drawable-mdpi/md__list_pressed_holo_dark.9.png delete mode 100644 src/main/res/drawable-mdpi/md__list_selector_disabled_holo_dark.9.png create mode 100644 src/main/res/drawable-xhdpi/ic_cloud.png create mode 100644 src/main/res/drawable-xhdpi/ic_cloud_off.png create mode 100644 src/main/res/drawable-xhdpi/ic_cloud_queue.png delete mode 100644 src/main/res/drawable-xhdpi/md__list_focused_holo.9.png delete mode 100644 src/main/res/drawable-xhdpi/md__list_longpressed_holo.9.png delete mode 100644 src/main/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png delete mode 100644 src/main/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png create mode 100644 src/main/res/drawable-xxhdpi/ic_cloud.png create mode 100644 src/main/res/drawable-xxhdpi/ic_cloud_off.png create mode 100644 src/main/res/drawable-xxhdpi/ic_cloud_queue.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_cloud.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_cloud_off.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_cloud_queue.png delete mode 100644 src/main/res/drawable/md__list_selector_background_transition_holo_dark.xml delete mode 100644 src/main/res/drawable/md__list_selector_holo_dark.xml create mode 100644 src/main/res/layout/layout_main.xml delete mode 100644 src/main/res/layout/layout_switch.xml create mode 100644 src/main/res/layout/toolbar_light_dark.xml delete mode 100644 src/main/res/values-v21/styles_shadow.xml delete mode 100644 src/main/res/values/styles_shadow.xml create mode 100644 src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala diff --git a/build.sbt b/build.sbt index a7bbe448..2194c008 100644 --- a/build.sbt +++ b/build.sbt @@ -36,7 +36,7 @@ libraryDependencies ++= Seq( "com.google.android.gms" % "play-services-ads" % "8.1.0", "com.google.android.gms" % "play-services-analytics" % "8.1.0", "com.android.support" % "support-v4" % "23.1.0", - "com.github.mrengineer13" % "snackbar" % "1.2.0", + "com.android.support" % "design" % "23.1.0", "com.nostra13.universalimageloader" % "universal-image-loader" % "1.9.4", "com.j256.ormlite" % "ormlite-core" % "4.48", "com.j256.ormlite" % "ormlite-android" % "4.48" @@ -44,6 +44,7 @@ libraryDependencies ++= Seq( proguardOptions in Android ++= Seq("-keep class android.support.v4.app.** { *; }", "-keep interface android.support.v4.app.** { *; }", + "-keep class android.support.v7.widget.Toolbar { (...); }", "-keep class com.actionbarsherlock.** { *; }", "-keep interface com.actionbarsherlock.** { *; }", "-keep class org.jraf.android.backport.** { *; }", diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index d90311cc..787cd862 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -64,7 +64,7 @@ diff --git a/src/main/res/drawable-anydpi-v21/ic_cloud.xml b/src/main/res/drawable-anydpi-v21/ic_cloud.xml new file mode 100644 index 00000000..c5d6a7d4 --- /dev/null +++ b/src/main/res/drawable-anydpi-v21/ic_cloud.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/main/res/drawable-anydpi-v21/ic_cloud_off.xml b/src/main/res/drawable-anydpi-v21/ic_cloud_off.xml new file mode 100644 index 00000000..575f4ef9 --- /dev/null +++ b/src/main/res/drawable-anydpi-v21/ic_cloud_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/main/res/drawable-anydpi-v21/ic_cloud_queue.xml b/src/main/res/drawable-anydpi-v21/ic_cloud_queue.xml new file mode 100644 index 00000000..f30db90d --- /dev/null +++ b/src/main/res/drawable-anydpi-v21/ic_cloud_queue.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/main/res/drawable-hdpi/ic_cloud.png b/src/main/res/drawable-hdpi/ic_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..77ba43c2002ede9c12eea9ef07662b5c56e0b78e GIT binary patch literal 297 zcmV+^0oMMBP)BQ`1&4+>H((ziDU=PR1R90E zaB$GF^Pcm*OX2fKOaBUK_BiK(As=+OWS_L+BE(svZ;6IWaF*knKwUC!8LRZ|4mxF(|s zO4xeDm&7slLOjvJg{pYNg$wbH3(w*X7e2)aF7(6>E;J=^g}sU-vJ9{j;%R~+eUf{^ v*A!U-k_quOi!wEC7-42ik0up7E&W+v&yhG5+eP5-00000NkvXXu0mjfOelBj literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_cloud_off.png b/src/main/res/drawable-hdpi/ic_cloud_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e30de1c25bae6de8d2f243f65c1eb825596d6382 GIT binary patch literal 462 zcmV;<0WtoGP){h-W=ewg9T8cp6O8eCbYn^ zZF#61wcjT&T?CzW%NuP9sWI?N9JpsVH5h21UkaaP|)O`T(-fj`5!ITgMRPNpAv(qKt z!BhQV5i~_PD%DKX+3*7lh>Fx@Fq0sgL`7;CtcKU%kf=!YgP-9hxF#x6yTED~18eqH zq^^LO5FUZ0byEvE)KM9j2w~J0ux8R>n@dnTw7|St2;rEPa!ZtPnRkXeXJpjFiqr|i z-G}X@8(zsuQmIf>iQgWoQ+!bGK-H;x8lpOs?=OXZ1CWby=5c;LnE(I)07*qoM6N<$ Ef&d!SW&i*H literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-hdpi/ic_cloud_queue.png b/src/main/res/drawable-hdpi/ic_cloud_queue.png new file mode 100644 index 0000000000000000000000000000000000000000..aae45eba5cce6f8298507e5d728b3f3651f2af17 GIT binary patch literal 425 zcmV;a0apHrP)&2?p zbb>IW`N`93fr5#iE{-7*Q>RY2$k|}PUG3I8+hq?M&UySt({#?YOY9F7 zV)|4jusAQAw~U49z^wIm)#n)N-o9e&+IDtd30r~4TeZ_)uKQd*6*KFj^h@OhGw-CF i@bOgmX?1Mk5ox7hDXx8`mUDoXF?hQAxvX2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z diff --git a/src/main/res/drawable-hdpi/md__list_pressed_holo_dark.9.png b/src/main/res/drawable-hdpi/md__list_pressed_holo_dark.9.png deleted file mode 100644 index 5654cd69429fd0a3502a05b5f827bffab89cc7e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh diff --git a/src/main/res/drawable-hdpi/md__list_selector_disabled_holo_dark.9.png b/src/main/res/drawable-hdpi/md__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index f6fd30dcdc9c39c836e509486854f9da03486892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k!3HF){@Qy1DVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?cuyC{kcif|*A4j^95`Gq9-KV8B6o6ra`I!Z80pW;7d5zZGhRBg zm{FnhT6Xzih3ZMUGkfBc^kAT_eS7{3zPQ8d#DAmx_&yF@I**rs{^JpqhzIqGG-gcXnWj{JQmQ1pH8~wXBi1%W$ug|H;(%QRz zwX+!;eF|DulAM`s7rh;?o=viNpe({^ z*W>Xa@u-}9n9qkqmjg3jIeBie3_R;3&(d@ANZ)2XrHYr>mdK II;Vst0P(g{Gynhq literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-mdpi/ic_cloud_off.png b/src/main/res/drawable-mdpi/ic_cloud_off.png new file mode 100644 index 0000000000000000000000000000000000000000..92faccb173eaeafcc5197020a10de3d1e34110ab GIT binary patch literal 330 zcmV-Q0k!^#P)sVfg`y%;7uHMC!%Jqdj^e-_#~;3v9s?> z{vp#2-FebhcVH^N(P!JUPEWSdog=(DHK(Xx)`=JF=VzAjXdxZUd&E+{Qn2aDGgk7A zRotbMNi`oD`tywe4b0?|A-AY0DdtCxaqmni?`)!GG+o*8X*Y>Wl=26o*0fNL7K-VC zbyTB;;q<^5nsI@0dSD#Q*g)M_{-lCx47x$xqLFlETtyq@Bqm(z&0anjRB`S>cTH90 a{1b1(A{#CnJi;6R00004nJ zaCd?*qxs3xYk`8ko-U3d5>tD79C;fY1elknGfSSZkgss!Fq+WV_wb)ql1{DGd2)`S!@o4yre42YU?3urKd Mr>mdKI;Vst081n_F8}}l diff --git a/src/main/res/drawable-mdpi/md__list_longpressed_holo.9.png b/src/main/res/drawable-mdpi/md__list_longpressed_holo.9.png deleted file mode 100644 index 3bf8e03623c94b68d31963ffe7e59c72c3dcc059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD diff --git a/src/main/res/drawable-mdpi/md__list_pressed_holo_dark.9.png b/src/main/res/drawable-mdpi/md__list_pressed_holo_dark.9.png deleted file mode 100644 index 6e77525d2dbbc1673145d60d775602c85264330d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} diff --git a/src/main/res/drawable-mdpi/md__list_selector_disabled_holo_dark.9.png b/src/main/res/drawable-mdpi/md__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 92da2f0dd3711a2ceb843768cafd6b91a2807b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> diff --git a/src/main/res/drawable-xhdpi/ic_cloud.png b/src/main/res/drawable-xhdpi/ic_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..e44caf8d1ef353ad57c413dd953980ff9f844549 GIT binary patch literal 354 zcmV-o0iFJdP)xC?p6PT7tmnVX3Jlx|Y_k7f^4YDGG@KHK$xo zI=wT#6qsd?HiI1KniMU8Y&m)cRB)v9z*Y8@RSZh|O95gY_5h{ag{071O{0V)nz z3z5=E6cjH_)t1)5O7v92*WrP@oIIT7)x2ZAzp3TGC+EDmNV|6J8Y4%E-AKc-9Oo`& zmZ`DIBGVKZCWACz{LdV3fcY5F&2_$EgGH{f`QLyNKm+lVq!c-cKR}*}A+}Iv?WS1o z3kbUsh$U`wm>lcKu#F=WS;F-snGh^7XNXO7n(Ml_Ocl`X_yfXDKE;US?cp7uo$v>Q z9o|GwomgO_575g+o>Ad9c;7`8?P@cim;3y|UU82RQgNW46|^d65I1k4k9cnx#sNG;t8xG_^C7a> zCg@P0pBkEd_5OqnZYnU2HiIB75PBzr+~OA+j3B}bv;xvHq1#IZ?IUU7Gg=-AM(iU( zJ0+~5WsrcxB-&#Ogdz5$y%*-u^zu+dCtBnV`79EU*x-P1v{^a=5<~70xerB0= literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/ic_cloud_queue.png b/src/main/res/drawable-xhdpi/ic_cloud_queue.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef11bb1b4c927e0fd1db2cafd0a321a7f11e8fa GIT binary patch literal 537 zcmV+!0_OdRP)TM_`n(_N56JKA34ml zs-uS#1xnph4Y-3@p;eVJPL}O{(XJZMK?ZY9m2iulo~uSAF$tB&7)A5M>BUnWxPbBb z%qxb8suVqBF*zpG06N+33qvX*g~@S74WW&l9um-xSU}Ilaj<6%m!!W1Oxb(QAu=>#cU8Kq9!rGGG+-+TewEi z0yj88n;JljL1yp?j3~fO+9 bC{*GfFr^hdp^68Y00000NkvXXu0mjf&bH|D literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/md__list_focused_holo.9.png b/src/main/res/drawable-xhdpi/md__list_focused_holo.9.png deleted file mode 100644 index b545f8e57871c0a11cfeddb22bbd9d7f5014959b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLrmKPZ!4!jfs0F-sWsD;BkFFHSeKB-$mOyp5I?c^gWch-rv=K-D=*+w0EX1GeE8VNeS)2#7n8DN4&t;ucLK6V`fk$Nk diff --git a/src/main/res/drawable-xhdpi/md__list_longpressed_holo.9.png b/src/main/res/drawable-xhdpi/md__list_longpressed_holo.9.png deleted file mode 100644 index eda10e6123e1e1383c4617228ec0c96680d60dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX diff --git a/src/main/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png b/src/main/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png deleted file mode 100644 index 88726b69160589c8545759440e8d4e69dc984c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$!3HF6SgS1tQk(@Ik;M!Q+?^oIXnykaTA*No zr;B4qM&sKXhJ1$tcw7#es=J@sd2yMiyW@jyg@u(MI=K|l!O@`#Zi)!0ND(B1h*fZLsYMW% z8n9Z3I5gG4kHKmq6~*bMk)IR^ew64)bAfxj;4>{&_{4Lj zInO>eD_LYXz%)%d37MiqN=YEaD6fg)6-P-aUhLu--KeosaUtLgExOg>6n!#}0q(F~ zx7i@G*u)IIctF3*A;W!ob(f4x;VLFvk{OI(%6|2ZK|W$igS>i01(PPUUTo($lhpW% zNh|D7w@5R>EOEK4?oeQXIDKKGqGEsw@jIkw*vcG9m{b%DQYRU2^>_61gyhtj;w-!A zQzulg;Uy=@YAp)b^M-g@0vpB&)Cqf-CrOKx z^k)PdWQHU(7$c`>*v2T=nd1W?W`!(KrA(2uJkRqy@1OGxB43}RqfCs`00000NkvXX Hu0mjfi{|AH literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_cloud_off.png b/src/main/res/drawable-xxhdpi/ic_cloud_off.png new file mode 100644 index 0000000000000000000000000000000000000000..071088b61885aca0a54ce1d31aab422c503f3d56 GIT binary patch literal 859 zcmV-h1El%btYMG!+_S@|+~B_b<`s5UKw2y$VJM3;(?YEj(l zec>Xs(i9>$THz4srV$s8N{Qtl1b5Rob-%6T`Ok6YG&BFsIZ@~P+n&W|bjny~@lpOq)H( zzjKfV!kPnrV$bd(a?99;9A=qM82S4Pq7`A4o7u$_^wv)exz~ z=Ztd?Hxnbtt=!8Coac~}Ezw~I5}u^&Nt!219I3G+XZZnlUy`r`2~T*Eycc7f64iZZ z3lat_NJ1CORF|~_*^^StVs^k8TafU$6)DafX49>M?&4KuSf|8ws3HwFMM|@YR-w0f zki!@&xUwMi@h93x&4M!gh%0N-G}<*zHx6p&6KZ5lx`W@*&Nd3VjXZ!aq>E^m8w1@= z0l+6xKiXa+pbql5+hURooh0>fvQ%0kbx=mzV4evcAXXprDb*Fp;vhO}Ql66)d7buJ zphv0h0;dr7EJ-ueZkK*HsEtj`a!Bo2k{ug>Er=sUC`rx0IA zZ{yv2$Dkg}o<Dm(bopLLep4D#9yh+c+VRdeD9qx-lC?0w+C>_N^eSpzUxvaMIUk9|*!2 zW*3ovoHT;e-9wo53xdN2X72__x`iUzJ_$h(GE{eow67%PtYY@2{^Wm5b-Rq=_)L0` zZOncqt)O=DxZ5GeBiu>KC(_;QVK#s$NH{|Qzw;tZA;%ykt%gSWj9Bes!*nR5+%ZQ% zx`!zQOiKU#!D^J{;7E<1^j>C$?{FCz(Ik}ii2GD)+$GtM+Wo_Pl9dA+1SAP@)yzFW*;9s9Y$ zzr1Cd54>TRUjAe)KgeH%X{DDbGD&ig7AoZjD%s8`xp>AlDpgvnKhd-Dm zU(@_Xg}g@%=P1-!qVg6o`bhVRV{By^a|sb)9xK?&aVAN3ooac9FxN=+fL6kq1rav# zkW`ll%PSnkZGtvsMFs6l;C4vfU^8wvsaFnINFQ$NRXpbN8rvDd$`Mh{VjHJU#iASA zc`B6$LR`Ssr9!ckUpUPGA2EigRi213jPZd+<%>-=uIGVw2j1g*766_|s1NwpnY^^FeA~euOFR9k)Gk(Q*iX-2! zl0j_$6PLu_7<=U_VqC}eyCfcAG|6Yg7{nMSEG9APHp5e%MG-A9I4cIowceG>lOX3#B zD7Eq#S1~#zu?gEr`HEH8nkC^dgl)fkL!4oZaYFixCfrUDlMje<1KTdm;0SJGY{F4V zv5H}A&xvaWRoo@jC>^X}F;RJnD2=ppl~gUVQO6+VbWo|N;|}HW5027NMHl685J#D? znnC>ZoEBw=!v^~B!#KN$D>p1*J3ZWIf+XHb@{)c!X(psVAP@)yzB!)&{TJ-X;+Ry^ P00000NkvXXu0mjf(%D+n literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_cloud.png b/src/main/res/drawable-xxxhdpi/ic_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..d9534a993fe66107a1b18d770f71eafe2a77e25d GIT binary patch literal 660 zcmV;F0&D$=P)Qg@=Ly z5iE+)i?NP*NIZnBQrZ@q%za{nX!(+E`)~gr{GLa$EX%Si%d#xX$`Q&rM-RgUnIl4y zB^H?D4G-zzEPLf%9OgQ&NwSqBQ(VR;x1ourEVErnp3o?_;0!@B@rqL_G<-ZJ8za=J zaOhx>Z2h23g+Lki$(2D$m0wgcMJ`QHuKb~zPvqJ(2b3RF62b}ZD3|jnV+yBCQY@$O z04EK|S#;pE3vv#JSj1^zYUC8g$%kP%gGTb@gmMWV9SkzT0{QY%xj{A8cuygmRJQOj z#4ieEOxd86n?xz3B(=&E^-NQEUCInC#BhU2WrA)}xI>&>+9|qllhfK6nn~d%Uzy|{ z7dfKspq>bB72+!Uv=vJDfV)Mw#U5>j9!xMxlQx2vC}v2}i%0)r2$MXbSZlGL7-kv4 zqg7nNJh!!qASODmKd8e@^HeB}c1+c;Gy<3^POT(fV6I+C%wVoBc*FuGJ1&+mnO`hn zvN7=;lZC_#Ci^CyW3q%8z+?&0j>*E}ASMe*;w|PHmBb~?<(EViF-+B+ zadvAf9Az5!3Q(l~p@bVmai4iwwOx4WCx&~(8K6QtLlxZwNl|FC^x;*esG*HJJmWKA u668yQFd;_q(||{oWm%SGS(as4>-+}SUVfiti#^r=0000Y9 literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_cloud_off.png b/src/main/res/drawable-xxxhdpi/ic_cloud_off.png new file mode 100644 index 0000000000000000000000000000000000000000..2d78efc84e7a418c3fc6b95a73546a87914624b1 GIT binary patch literal 1126 zcmV-s1eyDZP)b&$Hw9eA`br@6X+?elOTL{LYxf z#l^+N#l^+N#l^*?imkMfKq7B38+d~*j`BN`cwFKiPV)opyv|w{A(@?!ep~T?k0KGO zXy6b@(v{>}UZKhwppQ=k!fL)`il`;|oHe!pef;!RAH5x%C#0w8=i3&J=(G_js#6p|p15|*=(MtT_| zb;l^P00c3O*yeK5{Go!k&nP=vzZS zVYS)-gqDmG3TY>-$87*YbH)im6T!|>ZUYeBHz3p#Y`+yic+Y^agJ5@O7H}h*c!wT- z<_|C+wBzqkrT`16;~SEw3?AnJ{M|cuKnc4zhsunw7JuDy17z{4I=nrh8(or$*#mCj zM|Adtm3Zi0m@QxfBLuT297NYQJHS&U0p@{FgYE(a*A93F4`5yh1&pJ+?^*#5a+&Z( z>7bTsN_}5W3HD`>@D;i<^s$dxZjA<5#wcN(WD5%rH5RI1VEyU?#h!3GGd0Bh;eblU@b?o-5H)K;88hdxlSB}(2Y>y6v)$_g!j-D zz)kquf*{6(=*wa=!vy=2;%UGW=+3bKaf%=m(n+x9X+SHw4g_(IAhh7`0u@N`22zVS zNl4IzznzHiE4pgLQNkilqdP@H7(rKxI7@gEe|HL((B&b{60#XW*Juf_AnZohE&PqH z3~`w70J;;xpvgmQMYtK=UpB8%J3>CXi$W{9PQ+nCF1pLYW^|+6;4q;I-ALGF?pefH z!g_SS2*MF`1LV3%2!D+VFXL|;;v^xPVRTJ`P|5_lNme*Xcp87zsXpolDR+)g%x~z1 zNC<+klyUqWcZ`t57x;S%5vJEjut8QjL&)Y6{GF%rKR_`^2(Mo zMp%Q?vT$ArMGO<{48T$kRV{1FopYs z{bZ#A2#+x8IH5!TaW}ZzIOZ&2g17b0Q{B3^G43RxEc(A1RMO0ZdxV()dZoO`VLX=! z!ptkDh8B7m;4BwiBMA00z2*tmIYGES2yONNOM=Jq_5eGAM?GQ>up)Rohu8zG2p)Ba sJ-~|aF?EPNz3E5Cg3CFS3=@q;0ueEC2ui07*qoM6N<$g8p*>-~a#s literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_cloud_queue.png b/src/main/res/drawable-xxxhdpi/ic_cloud_queue.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0210dcc0db4f8b2e48dc7b4195267ef4fff378 GIT binary patch literal 1035 zcmV+m1oZofP)5LjC4S&pWgAs|K`PF&UfDwvw@KAsG$zN;f{k%Mj0L8K`9tFYQV%n(%Up0xc7TbmHZ8r4QBI#wo@Dtq||yHcq+Hh4VPY zXi*Ai!R?IFgIe5Ll_Cz}_O$#&6-}JrG7~tRk`L&_>3jKuGWPK+@eENQA5h2;PR}S+ zRB@6S64@r7upOs!N(Es)AWCAN%SW8UG|zgi6gBj-lo&Pg5u1r&+M|`Bo@ti$t$fBe zn679g*h`FLyegm3fN7RhS}yjGoGAJ78LNn5dS1)JPGWeQN`ySF;x@xRa+M*xLLyUqNTK4P4YxryDuZ~OrHrsc zUZ^07(^blpQIxW@7>5YSiIX@DQl<v)=T0$OwF - - - - - - diff --git a/src/main/res/drawable/md__list_selector_holo_dark.xml b/src/main/res/drawable/md__list_selector_holo_dark.xml deleted file mode 100644 index bd71aa8b..00000000 --- a/src/main/res/drawable/md__list_selector_holo_dark.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/main/res/layout/layout_apps.xml b/src/main/res/layout/layout_apps.xml index 99256204..0f02c21a 100644 --- a/src/main/res/layout/layout_apps.xml +++ b/src/main/res/layout/layout_apps.xml @@ -5,6 +5,7 @@ android:layout_height="fill_parent" android:orientation="vertical" android:duplicateParentState="false"> + + + + + + diff --git a/src/main/res/layout/layout_switch.xml b/src/main/res/layout/layout_switch.xml deleted file mode 100644 index 11bdecc9..00000000 --- a/src/main/res/layout/layout_switch.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - diff --git a/src/main/res/layout/toolbar_light_dark.xml b/src/main/res/layout/toolbar_light_dark.xml new file mode 100644 index 00000000..ba9b1ec2 --- /dev/null +++ b/src/main/res/layout/toolbar_light_dark.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/main/res/values-v21/styles_shadow.xml b/src/main/res/values-v21/styles_shadow.xml deleted file mode 100644 index 705b7e23..00000000 --- a/src/main/res/values-v21/styles_shadow.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 89f7d8d6..2ce8dac8 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -12,4 +12,12 @@ #00000000 #FF555555 + #2196F3 + #90A4AE + #607D8B + #455A64 + @color/material_blue_grey_300 + @color/material_blue_grey_500 + @color/material_blue_grey_700 + diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index a732e9de..cd6c42af 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -16,11 +16,27 @@ - + + - - @@ -57,7 +72,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/scala/com/github/shadowsocks/AppManager.scala b/src/main/scala/com/github/shadowsocks/AppManager.scala index 35ced549..d6c16be8 100644 --- a/src/main/scala/com/github/shadowsocks/AppManager.scala +++ b/src/main/scala/com/github/shadowsocks/AppManager.scala @@ -49,6 +49,7 @@ import android.graphics.{Bitmap, PixelFormat} import android.os.Bundle import android.os.Handler import android.preference.PreferenceManager +import android.support.v7.widget.Toolbar import android.view.Menu import android.view.MenuItem import android.view.View @@ -260,9 +261,6 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe } Toast.makeText(this, R.string.action_import_err, Toast.LENGTH_SHORT).show() return false - case android.R.id.home => - navigateUpTo(getParentActivityIntent) - return true } super.onOptionsItemSelected(item) } @@ -277,11 +275,14 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe handler = new Handler() - val actionBar = getActionBar - actionBar.setTitle(R.string.proxied_help) - actionBar.setDisplayHomeAsUpEnabled(true) - actionBar.setDisplayShowHomeEnabled(false) this.setContentView(R.layout.layout_apps) + val toolbar = findViewById(R.id.toolbar).asInstanceOf[Toolbar] + toolbar.setTitle(R.string.proxied_help) + toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha) + toolbar.setNavigationOnClickListener((v: View) => { + val intent = getParentActivityIntent + if (intent == null) finish else navigateUpTo(intent) + }) this.overlay = View.inflate(this, R.layout.overlay, null).asInstanceOf[TextView] getWindowManager.addView(overlay, new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index b005e3ce..a10b19d6 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -51,12 +51,13 @@ import android.graphics.{Bitmap, Color, Typeface} import android.net.{Uri, VpnService} import android.os._ import android.preference._ -import android.support.v4.content.ContextCompat +import android.support.design.widget.{FloatingActionButton, Snackbar} +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.Toolbar import android.util.{DisplayMetrics, Log} import android.view._ import android.webkit.{WebView, WebViewClient} import android.widget._ -import com.github.mrengineer13.snackbar._ import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback} import com.github.shadowsocks.database._ import com.github.shadowsocks.preferences.{PasswordEditTextPreference, ProfileEditTextPreference, SummaryEditTextPreference} @@ -173,8 +174,7 @@ object Shadowsocks { } class Shadowsocks - extends PreferenceActivity - with CompoundButton.OnCheckedChangeListener + extends AppCompatActivity with MenuAdapter.MenuListener { // Flags @@ -184,8 +184,9 @@ class Shadowsocks var singlePane: Int = -1 // Variables - var switchButton: Switch = null - var progressDialog: ProgressDialog = null + private var serviceStarted = false + var fab: FloatingActionButton = _ + var progressDialog: ProgressDialog = _ var progressTag = -1 var state = State.INIT var prepared = false @@ -210,7 +211,7 @@ class Shadowsocks case ignored: RemoteException => // Nothing } // Update the UI - if (switchButton != null) switchButton.setEnabled(true) + if (fab != null) fab.setEnabled(true) if (State.isAvailable(bgService.getState)) { setPreferenceEnabled(enabled = true) } else { @@ -218,8 +219,6 @@ class Shadowsocks setPreferenceEnabled(enabled = false) } state = bgService.getState - // set the listener - switchButton.setOnCheckedChangeListener(Shadowsocks.this) if (!status.getBoolean(getVersionName, false)) { status.edit.putBoolean(getVersionName, true).commit() @@ -228,7 +227,7 @@ class Shadowsocks } override def onServiceDisconnected(name: ComponentName) { - if (switchButton != null) switchButton.setEnabled(false) + if (fab != null) fab.setEnabled(false) try { if (bgService != null) bgService.unregisterCallback(callback) } catch { @@ -238,8 +237,10 @@ class Shadowsocks } } - private lazy val settings = PreferenceManager.getDefaultSharedPreferences(this) - private lazy val status = getSharedPreferences(Key.status, Context.MODE_PRIVATE) + private lazy val preferences = + getFragmentManager.findFragmentById(android.R.id.content).asInstanceOf[ShadowsocksSettings] + lazy val settings = PreferenceManager.getDefaultSharedPreferences(this) + lazy val status = getSharedPreferences(Key.status, Context.MODE_PRIVATE) private lazy val preferenceReceiver = new PreferenceBroadcastReceiver private lazy val drawer = MenuDrawer.attach(this) private lazy val menuAdapter = new MenuAdapter(this, getMenuList) @@ -265,13 +266,12 @@ class Shadowsocks } private def changeSwitch(checked: Boolean) { - switchButton.setOnCheckedChangeListener(null) - switchButton.setChecked(checked) - if (switchButton.isEnabled) { - switchButton.setEnabled(false) - handler.postDelayed(() => switchButton.setEnabled(true), 1000) + serviceStarted = checked + fab.setImageResource(if (checked) R.drawable.ic_cloud else R.drawable.ic_cloud_off) + if (fab.isEnabled) { + fab.setEnabled(false) + handler.postDelayed(() => fab.setEnabled(true), 1000) } - switchButton.setOnCheckedChangeListener(this) } private def showProgress(msg: Int): Handler = { @@ -374,16 +374,9 @@ class Shadowsocks } def isTextEmpty(s: String, msg: String): Boolean = { - if (s == null || s.length <= 0) { - new SnackBar.Builder(this) - .withMessage(msg) - .withActionMessageId(R.string.error) - .withStyle(SnackBar.Style.ALERT) - .withDuration(SnackBar.LONG_SNACK) - .show() - return true - } - false + if (s != null && s.length > 0) return false + Snackbar.make(getWindow.getDecorView.findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).show + true } def cancelStart() { @@ -416,24 +409,6 @@ class Shadowsocks } } - def onCheckedChanged(compoundButton: CompoundButton, checked: Boolean) { - if (compoundButton eq switchButton) { - checked match { - case true => - if (isReady) - prepareStartService() - else - changeSwitch(checked = false) - case false => - serviceStop() - } - if (switchButton.isEnabled) { - switchButton.setEnabled(false) - handler.postDelayed(() => switchButton.setEnabled(true), 1000) - } - } - } - def getLayoutView(view: ViewParent): LinearLayout = { view match { case layout: LinearLayout => layout @@ -470,7 +445,7 @@ class Shadowsocks super.onCreate(savedInstanceState) - addPreferencesFromResource(R.xml.pref_all) + setContentView(R.layout.layout_main) // Update the profile if (!status.getBoolean(getVersionName, false)) { @@ -502,24 +477,32 @@ class Shadowsocks } // Initialize action bar - val switchLayout = getLayoutInflater - .inflate(R.layout.layout_switch, null) - .asInstanceOf[RelativeLayout] - val title: TextView = switchLayout.findViewById(R.id.title).asInstanceOf[TextView] + val toolbar = findViewById(R.id.toolbar).asInstanceOf[Toolbar] + toolbar.setTitle(getTitle) + val field = classOf[Toolbar].getDeclaredField("mTitleTextView") + field.setAccessible(true) + val title: TextView = field.get(toolbar).asInstanceOf[TextView] val tf: Typeface = Typefaces.get(this, "fonts/Iceland.ttf") if (tf != null) title.setTypeface(tf) - switchButton = switchLayout.findViewById(R.id.switchButton).asInstanceOf[Switch] - getActionBar.setCustomView(switchLayout) - getActionBar.setDisplayShowTitleEnabled(false) - getActionBar.setDisplayShowCustomEnabled(true) - if (Utils.isLollipopOrAbove) { - getWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - getWindow.setStatusBarColor(ContextCompat.getColor(this, R.color.grey3)) - getActionBar.setDisplayHomeAsUpEnabled(true) - getActionBar.setHomeAsUpIndicator(R.drawable.ic_drawer) - } else { - getActionBar.setIcon(R.drawable.ic_stat_shadowsocks) - } + fab = findViewById(R.id.fab).asInstanceOf[FloatingActionButton] + fab.setOnClickListener((v: View) => { + serviceStarted = !serviceStarted + serviceStarted match { + case true => + if (isReady) + prepareStartService() + else + changeSwitch(checked = false) + case false => + serviceStop() + } + if (fab.isEnabled) { + fab.setEnabled(false) + handler.postDelayed(() => fab.setEnabled(true), 1000) + } + }) + toolbar.setNavigationIcon(R.drawable.ic_drawer) + toolbar.setNavigationOnClickListener((v: View) => drawer.toggleMenu()) title.setOnLongClickListener((v: View) => { if (Utils.isLollipopOrAbove && bgService != null && (bgService.getState == State.INIT || bgService.getState == State.STOPPED)) { @@ -785,18 +768,8 @@ class Shadowsocks buf.toList } - override def onOptionsItemSelected(item: MenuItem): Boolean = { - item.getItemId match { - case android.R.id.home => - drawer.toggleMenu() - return true - } - super.onOptionsItemSelected(item) - } - protected override def onPause() { super.onPause() - switchButton.setOnCheckedChangeListener(null) prepared = false } @@ -812,8 +785,6 @@ class Shadowsocks changeSwitch(checked = false) } state = bgService.getState - // set the listener - switchButton.setOnCheckedChangeListener(Shadowsocks.this) } ConfigUtils.refresh(this) @@ -825,13 +796,13 @@ class Shadowsocks private def setPreferenceEnabled(enabled: Boolean) { for (name <- Shadowsocks.PROXY_PREFS) { - val pref = findPreference(name) + val pref = preferences.findPreference(name) if (pref != null) { pref.setEnabled(enabled) } } for (name <- Shadowsocks.FEATRUE_PREFS) { - val pref = findPreference(name) + val pref = preferences.findPreference(name) if (pref != null) { if (Seq(Key.isGlobalProxy, Key.proxyedApps) .contains(name)) { @@ -846,11 +817,11 @@ class Shadowsocks private def updatePreferenceScreen() { val profile = currentProfile for (name <- Shadowsocks.PROXY_PREFS) { - val pref = findPreference(name) + val pref = preferences.findPreference(name) Shadowsocks.updatePreference(pref, name, profile) } for (name <- Shadowsocks.FEATRUE_PREFS) { - val pref = findPreference(name) + val pref = preferences.findPreference(name) Shadowsocks.updatePreference(pref, name, profile) } } @@ -983,22 +954,14 @@ class Shadowsocks try { val port: Int = Integer.valueOf(text) if (!low && port <= 1024) { - new SnackBar.Builder(this) - .withMessageId(R.string.port_alert) - .withActionMessageId(R.string.error) - .withStyle(SnackBar.Style.ALERT) - .withDuration(SnackBar.LONG_SNACK) - .show() + Snackbar.make(getWindow.getDecorView.findViewById(android.R.id.content), R.string.port_alert, + Snackbar.LENGTH_LONG).show return false } } catch { case ex: Exception => - new SnackBar.Builder(this) - .withMessageId(R.string.port_alert) - .withActionMessageId(R.string.error) - .withStyle(SnackBar.Style.ALERT) - .withDuration(SnackBar.LONG_SNACK) - .show() + Snackbar.make(getWindow.getDecorView.findViewById(android.R.id.content), R.string.port_alert, + Snackbar.LENGTH_LONG).show return false } true @@ -1072,14 +1035,8 @@ class Shadowsocks clearDialog() } changeSwitch(checked = false) - if (m != null) { - new SnackBar.Builder(Shadowsocks.this) - .withMessage(getString(R.string.vpn_error).formatLocal(Locale.ENGLISH, m)) - .withActionMessageId(R.string.error) - .withStyle(SnackBar.Style.ALERT) - .withDuration(SnackBar.LONG_SNACK) - .show() - } + if (m != null) Snackbar.make(getWindow.getDecorView.findViewById(android.R.id.content), + getString(R.string.vpn_error).formatLocal(Locale.ENGLISH, m), Snackbar.LENGTH_LONG).show setPreferenceEnabled(enabled = true) case State.STOPPING => if (progressDialog == null) { diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala new file mode 100644 index 00000000..30ce662e --- /dev/null +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala @@ -0,0 +1,12 @@ +package com.github.shadowsocks + +import android.os.Bundle +import android.preference.PreferenceFragment + +// TODO: Move related logic here +class ShadowsocksSettings extends PreferenceFragment { + override def onCreate(savedInstanceState: Bundle) { + super.onCreate(savedInstanceState) + addPreferencesFromResource(R.xml.pref_all) + } +}