From 9fab2ecded08f03e3f093326954f8f7b433d4313 Mon Sep 17 00:00:00 2001 From: Mohammad Abu-Garbeyyeh Date: Sun, 27 Oct 2013 15:36:32 +0200 Subject: [PATCH 1/3] Implemented NFC Quick Settings tile --- res/drawable-hdpi/ic_qs_nfc_off.png | Bin 0 -> 4117 bytes res/drawable-hdpi/ic_qs_nfc_on.png | Bin 0 -> 4122 bytes res/drawable-mdpi/ic_qs_nfc_off.png | Bin 0 -> 3595 bytes res/drawable-mdpi/ic_qs_nfc_on.png | Bin 0 -> 3630 bytes res/drawable-xhdpi/ic_qs_nfc_off.png | Bin 0 -> 4710 bytes res/drawable-xhdpi/ic_qs_nfc_on.png | Bin 0 -> 4661 bytes res/layout/quick_settings_tile_nfc.xml | 24 +++ res/values/arrays.xml | 4 + res/values/strings.xml | 3 + .../ceco/gm2/gravitybox/ModQuickSettings.java | 10 +- src/com/ceco/gm2/gravitybox/Utils.java | 15 ++ .../gm2/gravitybox/quicksettings/NfcTile.java | 177 ++++++++++++++++++ 12 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 res/drawable-hdpi/ic_qs_nfc_off.png create mode 100644 res/drawable-hdpi/ic_qs_nfc_on.png create mode 100644 res/drawable-mdpi/ic_qs_nfc_off.png create mode 100644 res/drawable-mdpi/ic_qs_nfc_on.png create mode 100644 res/drawable-xhdpi/ic_qs_nfc_off.png create mode 100644 res/drawable-xhdpi/ic_qs_nfc_on.png create mode 100644 res/layout/quick_settings_tile_nfc.xml create mode 100644 src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java diff --git a/res/drawable-hdpi/ic_qs_nfc_off.png b/res/drawable-hdpi/ic_qs_nfc_off.png new file mode 100644 index 0000000000000000000000000000000000000000..9f5ad63fc4ba61c1f74f1d4552c5ccd2a58ce8b5 GIT binary patch literal 4117 zcmV+w5bE!VP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000F*Nkl)BaWLcWoMO^o!sg+ogmugy>71>40 ztRa>qL1rY*)F4HMm=`L+)KFwbTDhsMH|gSPtE{7&o0Pk_^~b)#VVvK&{&vQ|2gY{Z z^Pczje&6@`exJ)(pt-r3j%*opaO>~@GQ(du=eh!ufXjfBKt0f?-wpb^q19Lea7ts1 zKo#(v#$%e9`3C^F5GVk0l31$=Xa;J5)xaE}CapIBWN9O*xMMG1hF(9fn@k%AI_bv` zn+`0{p`;B!W`tWw#hwM`0bSDNLK#t%sRGyzR0BhR;c=`V0A3W~Ul&K(6oA(ad<9H5 zvl6LQHt+)QN*p(qAwt*5rJCB>g<6l*0JBeTUeZ?!ya8-Z;5lWp*)CO+ zO9Id80?Y@VZc6~2JwOHGbir7bB{zB^oichka7*hCI_J6pqmp=LS70IVXj_mt(hYP6 z7CPrn0=vwt$vKw;ybRo?Ih%oh1oldxTa4#s1Mf+lR;L0W5S~su=f(gVJmywOjgA9@ zfGfh@yAjwe@IwXcF8$p(%JYu_Pny|UzW|H_l38p%uod_bIHIv0!0o_fATJ7!{syL* z*(Se8oQ%CH0Na6Oz*xD*2H+v!F@cL@=K;%{bN93tfMdX3pb{7eOa;~hUuyG>z()eL zF$##K&beFLqo7$OUmptGt*CoYyjTN#0t^OzP_41VBSXCiSniw~kqUrsfbs+Z1c7sa z5U>q+QzU*)o4yy=1WZt^@C>lnW3B$cO6T10q)03x=K(9Uv3TuwMeHx+CclKmkk^0* zffKr&#Uk`dV2a0jWxyme`!-;Bk?|%i(0$x&98c;q| zr~_IDc)83$;9)Z>O&EYcOaMMmh2>@Cz!=4d8${YXy|-W4>gRIRSyHPyV7ydogxssA z$NKw#iDveF!X!4cHNZ^Z-zWeYMaXiX2pBCQ?*y&_mP|Z5V5phZX)K!6N{$aCok|GAJm9T3ruS7eM%<`Xc6zncYmeeWZkX=Z zd8~CDc*@L{nOQ?hxlkC0MR80YtpHaBe65=qp!fEMMQarFsv@lM7m#met9(o5%f{7mCCD7%3G%Kj+*K;L->+LxncKF5yTVk2&YM>n8G}Oxvg=FAul__)V4F z#cGf>)6(5;UE&@FrkdHdq*93lK=e|AHqpm!iPOm!r=uRIrllKQr-53Z@g)=-vCaNa)z?cWNepCet)`4%5eJ=n5J|g5!<=X00000NkvXXu0mjfT5hdU literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_qs_nfc_on.png b/res/drawable-hdpi/ic_qs_nfc_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff664f610340907064f93124ecab8b0ddf13d6b GIT binary patch literal 4122 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 Y0KsOC;RP5}+5i9m07*qoM6N<$g5txYL;wH) literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_qs_nfc_off.png b/res/drawable-mdpi/ic_qs_nfc_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2bea8fe13966a01359a7525bccad886599a9fc GIT binary patch literal 3595 zcmV+m4)pPfP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009vNkl9p7Ff5|X$R;zz^u;WR25caN zO7cN42_r}{2sJ@V4APJWqKrzzgb-bnNJ$f<2%$~4y1lI6a60Fnd%H(`=no&?u=m>g z|E;z58hZNs`yEXj<0#|Ue;zXPGCWkTzo8F*G~9p3pLP9&wGpweYXoo+rVc^&=FFTH z5npx71Vc5)t|jj`cM z99Qr2@DA=NayOLfKW&n`3rjO|M-|EY2W~6;d89OZcM<7P4n-@l1?NV34Gas zz%N)95x3yd(!zLb$CQYegGEg;_hC_H_6&x=in`ii9Ny2&kIK#)a7o=)XXb+uu>i}P z6PY2)vEy*oh_Bfr<6!Pn6B4;{F*tA!)PPF@`3f4IX5B})}JrO$#}G~XX8E#GxL#uE!wIe$;=b55;wN+gU_%yBHqZ%#g)P* zRo>Wztr2lYW^TguP4azZlIJ3#zb%0xF}BYCbuEVbFh3%eW#;-it{31=EXBq3zP>cq zjHwZ^Zom{A5eG1{0#P$YU~y(nsDL#VbFik4>tt-hw=HD%V&9-@fQZ9a*9J{H8Fyy*A&` z(Fxo5#93HdXTK4f%g$GqgO0-)__a*ci;pogBK8dG6bwM(Y`lsKhmdjK#jJ?KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000A7NkldJj%}9$jQ%o;1OQH|# zgAhu|3&A9eE+m6c6SNkCbP!6Sj7l35LNrRG#8X`;LTFiAZ8sCVyuI(fyY7k?J#aWP zXXbh4f1dB@>hJG&I%$;COlSN%s8W3+o-Whh(T6`9-hbe)^8A7gIfjEH1_0NhX9&F0 zt5na(F?>H#CK#$YZo>L1)fbEufH5uBw_^*Ax8c7T>#9_rKhgmH#!Hxjskk3U+sL>T zYpYbBJ6r&b{;(gf)P3 zG|~*bUZwi1;rKvfZnynF9SVSP9rhk88aRSE_!_IR z50mjm)BZ=Wyc38<0N-^0@Eca<816+?v@i*~FfGS04@;YP9>>xu)m?)Du(~|$Xd*tY zQvF%6^CsL--s`GVKb2!xgjG#^3-NN5>QMs%$T9qiC-HV003To`_Fy@7V@mn+7mLk% z@I+Z_r04NM$8uakXFfKz*xQ94$^lmvALy-8JwL~=r2P4+5}wbM>e+bCk}B2D{zqu5 zhNMdM*;s?STlm3OSe9dWze@G8Qo_4S-PnsAIfe(SRBu6S;_oXac`e7#-xfdtF`>l& zoh_F8urSB4vPyMt3D>LfAXeb|GVd*#Yo?wY!^QziaE{>!W|u_NOk=RDO7-NDuqI$0 z)|YUdik+xi@E*XyLG=JRhQpXu)Z0wsusFwXpn#lF9QhO6fuBl_Xrz6(FURo3pqr2! z!;eL^J6bGHs#1L!HX~H2z7XG(RDD%bn%-3o-`&v(+xWyK*id4>k+v2)-&P!SA}%UL zY)q-5pJR58VgI0_U;q%8;vHNwgo?Wjb8-xahTWFu7``pZXx|`NHe*)1!%ym7kYm_W zKj4n{X*YRc)R}hx8r{X0Ivof6qrbSRR91007*qoM6N<$f@HqS Ad;kCd literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_qs_nfc_off.png b/res/drawable-xhdpi/ic_qs_nfc_off.png new file mode 100644 index 0000000000000000000000000000000000000000..d660b8780e988b6170594772d94bd28cf5294fbf GIT binary patch literal 4710 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 literal 0 HcmV?d00001 diff --git a/res/layout/quick_settings_tile_nfc.xml b/res/layout/quick_settings_tile_nfc.xml new file mode 100644 index 0000000000..d10d58bbb9 --- /dev/null +++ b/res/layout/quick_settings_tile_nfc.xml @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/res/values/arrays.xml b/res/values/arrays.xml index b2b341719e..d3bcef12cf 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -83,6 +83,7 @@ @string/qs_tile_bluetooth @string/qs_tile_gps @string/qs_tile_gps_alt + @string/qs_tile_nfc @string/qs_tile_mobile_data @string/qs_tile_network_mode @string/qs_tile_data_usage @@ -113,6 +114,7 @@ bluetooth_textview gps_textview gps_tileview + nfc_tileview data_conn_textview network_mode_tileview rssi_textview @@ -145,6 +147,7 @@ @string/qs_tile_airplane_mode @string/qs_tile_bluetooth @string/qs_tile_gps + @string/qs_tile_nfc @string/qs_tile_ringer_mode @string/qs_tile_volume @string/qs_tile_network_mode @@ -171,6 +174,7 @@ airplane_mode_textview bluetooth_textview gps_tileview + nfc_tileview ringer_mode_tileview volume_tileview network_mode_tileview diff --git a/res/values/strings.xml b/res/values/strings.xml index 3c2abedda6..1ac7ea34bf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -99,6 +99,8 @@ Wi-Fi off Not connected Turning on… + NFC + NFC off Statusbar QuickSettings tiles @@ -129,6 +131,7 @@ Expanded desktop Stay awake Screenshot + NFC Color Picker diff --git a/src/com/ceco/gm2/gravitybox/ModQuickSettings.java b/src/com/ceco/gm2/gravitybox/ModQuickSettings.java index a60648192b..1d5ed7f201 100644 --- a/src/com/ceco/gm2/gravitybox/ModQuickSettings.java +++ b/src/com/ceco/gm2/gravitybox/ModQuickSettings.java @@ -31,6 +31,7 @@ import com.ceco.gm2.gravitybox.quicksettings.ExpandedDesktopTile; import com.ceco.gm2.gravitybox.quicksettings.GpsTile; import com.ceco.gm2.gravitybox.quicksettings.NetworkModeTile; +import com.ceco.gm2.gravitybox.quicksettings.NfcTile; import com.ceco.gm2.gravitybox.quicksettings.QuickAppTile; import com.ceco.gm2.gravitybox.quicksettings.QuickRecordTile; import com.ceco.gm2.gravitybox.quicksettings.RingerModeTile; @@ -152,7 +153,8 @@ public class ModQuickSettings { R.id.stay_awake_tileview, R.id.screenshot_tileview, R.id.gps_tileview, - R.id.ringer_mode_tileview + R.id.ringer_mode_tileview, + R.id.nfc_tileview )); if (Utils.isMtkDevice()) { mCustomGbTileKeys.add(R.id.wifi_tileview); @@ -594,6 +596,12 @@ protected void afterHookedMethod(final MethodHookParam param) throws Throwable { gpsTile.setupQuickSettingsTile(mContainerView, inflater, mPrefs); mTiles.add(gpsTile); } + + if (Utils.hasNFC(mContext)) { + NfcTile nfcTile = new NfcTile(mContext, mGbContext, mStatusBar, mPanelBar); + nfcTile.setupQuickSettingsTile(mContainerView, inflater); + mTiles.add(nfcTile); + } RingerModeTile rmTile = new RingerModeTile(mContext, mGbContext, mStatusBar, mPanelBar); rmTile.setupQuickSettingsTile(mContainerView, inflater, mPrefs); diff --git a/src/com/ceco/gm2/gravitybox/Utils.java b/src/com/ceco/gm2/gravitybox/Utils.java index e1ba819b88..84da6a5edd 100644 --- a/src/com/ceco/gm2/gravitybox/Utils.java +++ b/src/com/ceco/gm2/gravitybox/Utils.java @@ -52,6 +52,7 @@ public class Utils { private static Boolean mHasVibrator = null; private static Boolean mHasFlash = null; private static Boolean mHasGPS = null; + private static Boolean mHasNFC = null; // Supported MTK devices private static final Set MTK_DEVICES = new HashSet(Arrays.asList( @@ -214,6 +215,20 @@ public static boolean hasGPS(Context con) { } } + public static boolean hasNFC(Context con) { + if (mHasNFC != null) return mHasNFC; + PackageManager pm = con.getPackageManager(); + if (pm == null) { + if (DEBUG) log("Cannot get package manager, assuming no NFC feature"); + mHasNFC = null; + return false; + } + + mHasNFC = pm.hasSystemFeature(PackageManager.FEATURE_NFC); + + return mHasNFC; + } + public static String getDeviceCharacteristics() { if (mDeviceCharacteristics != null) return mDeviceCharacteristics; diff --git a/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java new file mode 100644 index 0000000000..c8ed657fa9 --- /dev/null +++ b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java @@ -0,0 +1,177 @@ +package com.ceco.gm2.gravitybox.quicksettings; + +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.nfc.NfcAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.ceco.gm2.gravitybox.R; + +public class NfcTile extends AQuickSettingsTile { + + private static final boolean DEBUG = true; + + private static final String INTENT_ADAPTER_STATE_CHANGED = "android.nfc.action.ADAPTER_STATE_CHANGED"; + private static final String INTENT_NFC_SETTINGS = "android.settings.NFC_SETTINGS"; + + private static final int STATE_TURNING_ON = XposedHelpers.getStaticIntField(NfcAdapter.class, "STATE_TURNING_ON"); + private static final int STATE_ON = XposedHelpers.getStaticIntField(NfcAdapter.class, "STATE_ON"); + @SuppressWarnings("unused") + private static final int STATE_TURNING_OFF = XposedHelpers.getStaticIntField(NfcAdapter.class, "STATE_TURNING_OFF"); + private static final int STATE_OFF = XposedHelpers.getStaticIntField(NfcAdapter.class, "STATE_OFF"); + private static final int NFC_ADAPTER_UNKNOWN = -100; + + private static final String TAG = "GB:NfcTile"; + + private static NfcAdapter mNfcAdapter = null; + + /* TODO: Remove log lines, the way we build the Strings uses operators and such */ + private void log(String message) { + if (!DEBUG) return; + XposedBridge.log(TAG + ": " + message); + } + + private BroadcastReceiver mNfcStateChangedReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + if (INTENT_ADAPTER_STATE_CHANGED.equals(intent.getAction())) { + if (mNfcAdapter == null) + tryToGetNfcAdapter(true); + updateTile(getNfcState()); + } + } + }; + + private TextView mTextView; + + public NfcTile(Context context, Context gbContext, Object statusBar, Object panelBar) { + super(context, gbContext, statusBar, panelBar); + log("Initializing NFC tile"); + + mOnClick = new View.OnClickListener() { + + @Override + public void onClick(View v) { + toggleState(); + } + }; + + mOnLongClick = new View.OnLongClickListener() { + + @Override + public boolean onLongClick(View v) { + Intent intent = new Intent(INTENT_NFC_SETTINGS); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } + }; + } + + private void toggleState() { + log("toggleState()"); + int state = getNfcState(); + /* For some reason, a switch-case way of handling this didn't work */ + + if (mNfcAdapter == null) + tryToGetNfcAdapter(true); + + if (mNfcAdapter == null) { + log("toggleState(): mNfcAdapter is null, returning"); + return; + } + + if (state == STATE_TURNING_ON || state == STATE_ON) + XposedHelpers.callMethod(mNfcAdapter, "disable"); + else + XposedHelpers.callMethod(mNfcAdapter, "enable"); + + updateTile(); + } + + @Override + protected void onTileCreate() { + LayoutInflater inflater = LayoutInflater.from(mGbContext); + inflater.inflate(R.layout.quick_settings_tile_nfc, mTile); + mTextView = (TextView) mTile.findViewById(R.id.nfc_tileview); + + mTextView.setText(mLabel); + mTextView.setCompoundDrawablesWithIntrinsicBounds(0, mDrawableId, 0, 0); + } + + @Override + protected void updateTile() { + updateTile(getNfcState()); + } + + private void updateTile(int state) { + if (state == STATE_TURNING_ON || state == STATE_ON) { + mDrawableId = R.drawable.ic_qs_nfc_on; + mLabel = mGbContext.getString(R.string.quick_settings_nfc); + } else { + mDrawableId = R.drawable.ic_qs_nfc_off; + mLabel = mGbContext.getString(R.string.quick_settings_nfc_off); + } + + if (mTextView != null) { + mTextView.setText(mLabel); + mTextView.setCompoundDrawablesWithIntrinsicBounds(0, mDrawableId, 0, 0); + } + } + + @Override + public void updateResources() { + updateTile(getNfcState()); + } + + private int getNfcState() { + log("getNfcState()"); + int state = STATE_OFF; + try { + tryToGetNfcAdapter(false); + } catch (UnsupportedOperationException e) { + state = NFC_ADAPTER_UNKNOWN; + } + + if (mNfcAdapter != null) + state = (Integer) XposedHelpers.callMethod(mNfcAdapter, "getAdapterState"); + else + log("getNfcState(): mNfcAdapter is null"); + + log("getNfcAdapter(): state is " + String.valueOf(state)); + + return state; + } + + @Override + protected void onTilePostCreate() { + mContext.registerReceiver(mNfcStateChangedReceiver, + new IntentFilter(INTENT_ADAPTER_STATE_CHANGED)); + + super.onTilePostCreate(); + } + + private void tryToGetNfcAdapter(boolean suppressThrow) throws UnsupportedOperationException { + log("tryToGetNfcAdapter()"); + if (mNfcAdapter == null) { + log("tryToGetNfcAdapter: adapter was indeed null"); + try { + mNfcAdapter = (NfcAdapter) XposedHelpers.callStaticMethod(NfcAdapter.class, "getNfcAdapter", mContext); + log("tryToGetNfcAdapter: we got an adapter! Is it null? " + String.valueOf(mNfcAdapter == null)); + } catch (UnsupportedOperationException e) { + if (!suppressThrow) + throw e; + } + } else { + log("tryToGetNfcAdapter(): We already have an NFC adapter, returning"); + } + } +} From 9a6b090264ac821cf13f1ff09c138c4e032a4e77 Mon Sep 17 00:00:00 2001 From: Mohammad Abu-Garbeyyeh Date: Mon, 2 Dec 2013 14:42:23 +0200 Subject: [PATCH 2/3] Fixed NFC tile, removed logging code --- .../gm2/gravitybox/quicksettings/NfcTile.java | 48 +++++++------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java index c8ed657fa9..00d7765dcb 100644 --- a/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java +++ b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java @@ -1,7 +1,5 @@ package com.ceco.gm2.gravitybox.quicksettings; -import de.robv.android.xposed.XposedBridge; -import de.robv.android.xposed.XposedHelpers; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -13,9 +11,9 @@ import com.ceco.gm2.gravitybox.R; -public class NfcTile extends AQuickSettingsTile { +import de.robv.android.xposed.XposedHelpers; - private static final boolean DEBUG = true; +public class NfcTile extends AQuickSettingsTile { private static final String INTENT_ADAPTER_STATE_CHANGED = "android.nfc.action.ADAPTER_STATE_CHANGED"; private static final String INTENT_NFC_SETTINGS = "android.settings.NFC_SETTINGS"; @@ -27,23 +25,18 @@ public class NfcTile extends AQuickSettingsTile { private static final int STATE_OFF = XposedHelpers.getStaticIntField(NfcAdapter.class, "STATE_OFF"); private static final int NFC_ADAPTER_UNKNOWN = -100; - private static final String TAG = "GB:NfcTile"; + @SuppressWarnings("unused") + private static final String TAG = "GB:NfcTile"; private static NfcAdapter mNfcAdapter = null; - /* TODO: Remove log lines, the way we build the Strings uses operators and such */ - private void log(String message) { - if (!DEBUG) return; - XposedBridge.log(TAG + ": " + message); - } - private BroadcastReceiver mNfcStateChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (INTENT_ADAPTER_STATE_CHANGED.equals(intent.getAction())) { if (mNfcAdapter == null) - tryToGetNfcAdapter(true); + getNfcAdapter(true); updateTile(getNfcState()); } } @@ -53,7 +46,6 @@ public void onReceive(Context context, Intent intent) { public NfcTile(Context context, Context gbContext, Object statusBar, Object panelBar) { super(context, gbContext, statusBar, panelBar); - log("Initializing NFC tile"); mOnClick = new View.OnClickListener() { @@ -77,15 +69,13 @@ public boolean onLongClick(View v) { } private void toggleState() { - log("toggleState()"); int state = getNfcState(); /* For some reason, a switch-case way of handling this didn't work */ if (mNfcAdapter == null) - tryToGetNfcAdapter(true); + getNfcAdapter(true); if (mNfcAdapter == null) { - log("toggleState(): mNfcAdapter is null, returning"); return; } @@ -133,20 +123,15 @@ public void updateResources() { } private int getNfcState() { - log("getNfcState()"); int state = STATE_OFF; try { - tryToGetNfcAdapter(false); + getNfcAdapter(false); } catch (UnsupportedOperationException e) { state = NFC_ADAPTER_UNKNOWN; } if (mNfcAdapter != null) state = (Integer) XposedHelpers.callMethod(mNfcAdapter, "getAdapterState"); - else - log("getNfcState(): mNfcAdapter is null"); - - log("getNfcAdapter(): state is " + String.valueOf(state)); return state; } @@ -159,19 +144,22 @@ protected void onTilePostCreate() { super.onTilePostCreate(); } - private void tryToGetNfcAdapter(boolean suppressThrow) throws UnsupportedOperationException { - log("tryToGetNfcAdapter()"); - if (mNfcAdapter == null) { - log("tryToGetNfcAdapter: adapter was indeed null"); + private void getNfcAdapter(boolean suppressThrow) throws UnsupportedOperationException { + Class ServiceManager; + try { + ServiceManager = Class.forName("android.os.ServiceManager"); + } catch (ClassNotFoundException e1) { + e1.printStackTrace(); + return; + } + + if (mNfcAdapter == null && XposedHelpers.callStaticMethod(ServiceManager, "getService", "nfc") != null) { try { - mNfcAdapter = (NfcAdapter) XposedHelpers.callStaticMethod(NfcAdapter.class, "getNfcAdapter", mContext); - log("tryToGetNfcAdapter: we got an adapter! Is it null? " + String.valueOf(mNfcAdapter == null)); + mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext); } catch (UnsupportedOperationException e) { if (!suppressThrow) throw e; } - } else { - log("tryToGetNfcAdapter(): We already have an NFC adapter, returning"); } } } From 11d651bd1cb816a990d90c452c0ad793580b8b1e Mon Sep 17 00:00:00 2001 From: Mohammad Abu-Garbeyyeh Date: Mon, 2 Dec 2013 14:58:50 +0200 Subject: [PATCH 3/3] Removed unneeded override --- src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java index 00d7765dcb..257f2e4f02 100644 --- a/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java +++ b/src/com/ceco/gm2/gravitybox/quicksettings/NfcTile.java @@ -26,7 +26,7 @@ public class NfcTile extends AQuickSettingsTile { private static final int NFC_ADAPTER_UNKNOWN = -100; @SuppressWarnings("unused") - private static final String TAG = "GB:NfcTile"; + private static final String TAG = "GB:NfcTile"; private static NfcAdapter mNfcAdapter = null; @@ -117,11 +117,6 @@ private void updateTile(int state) { } } - @Override - public void updateResources() { - updateTile(getNfcState()); - } - private int getNfcState() { int state = STATE_OFF; try {