From fd2b6293358bda6f6beaab088e8913a13c0e2e31 Mon Sep 17 00:00:00 2001 From: Andres Morales Date: Mon, 25 Nov 2013 17:26:13 -0800 Subject: [PATCH] Settings for NFC Unlock Change-Id: Ifaa2717da6c364daa7af073e42fc8f6a097c14bb --- AndroidManifest.xml | 10 ++ res/drawable-hdpi/no_ring_detected.png | Bin 0 -> 2984 bytes res/drawable-hdpi/ring_detected.png | Bin 0 -> 3401 bytes res/drawable-hdpi/ring_paired.png | Bin 0 -> 3973 bytes res/drawable-mdpi/no_ring_detected.png | Bin 0 -> 1740 bytes res/drawable-mdpi/ring_detected.png | Bin 0 -> 1838 bytes res/drawable-mdpi/ring_paired.png | Bin 0 -> 2161 bytes res/drawable-xhdpi/no_ring_detected.png | Bin 0 -> 4055 bytes res/drawable-xhdpi/ring_detected.png | Bin 0 -> 4644 bytes res/drawable-xhdpi/ring_paired.png | Bin 0 -> 5424 bytes res/drawable-xxhdpi/no_ring_detected.png | Bin 0 -> 6420 bytes res/drawable-xxhdpi/ring_detected.png | Bin 0 -> 7441 bytes res/drawable-xxhdpi/ring_paired.png | Bin 0 -> 8600 bytes res/layout/activity_nfc_pairing.xml | 44 +++++ res/values/strings.xml | 21 +++ res/xml/security_settings_biometric_weak.xml | 5 + res/xml/security_settings_chooser.xml | 5 + res/xml/security_settings_nfc_unlock.xml | 42 +++++ res/xml/security_settings_password.xml | 5 + res/xml/security_settings_pattern.xml | 5 + res/xml/security_settings_pin.xml | 5 + src/com/android/settings/NfcLockFragment.java | 125 ++++++++++++++ src/com/android/settings/PairNfcDevice.java | 161 ++++++++++++++++++ .../android/settings/SecuritySettings.java | 17 ++ 24 files changed, 445 insertions(+) create mode 100644 res/drawable-hdpi/no_ring_detected.png create mode 100644 res/drawable-hdpi/ring_detected.png create mode 100644 res/drawable-hdpi/ring_paired.png create mode 100644 res/drawable-mdpi/no_ring_detected.png create mode 100644 res/drawable-mdpi/ring_detected.png create mode 100644 res/drawable-mdpi/ring_paired.png create mode 100644 res/drawable-xhdpi/no_ring_detected.png create mode 100644 res/drawable-xhdpi/ring_detected.png create mode 100644 res/drawable-xhdpi/ring_paired.png create mode 100644 res/drawable-xxhdpi/no_ring_detected.png create mode 100644 res/drawable-xxhdpi/ring_detected.png create mode 100644 res/drawable-xxhdpi/ring_paired.png create mode 100644 res/layout/activity_nfc_pairing.xml create mode 100644 res/xml/security_settings_nfc_unlock.xml create mode 100644 src/com/android/settings/NfcLockFragment.java create mode 100644 src/com/android/settings/PairNfcDevice.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 567400bdf9e..b68fca09fb4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1716,6 +1716,16 @@ + + + + + + + }sP)u2f|? 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ring_paired.png b/res/drawable-hdpi/ring_paired.png new file mode 100644 index 0000000000000000000000000000000000000000..065e7524e44b064ac8dcc2960e91ef48d68a4ab5 GIT binary patch literal 3973 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/no_ring_detected.png b/res/drawable-mdpi/no_ring_detected.png new file mode 100644 index 0000000000000000000000000000000000000000..6d53477e7ecac1d531cf09ec8b7eb70163e1a2c8 GIT binary patch literal 1740 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ring_paired.png b/res/drawable-mdpi/ring_paired.png new file mode 100644 index 0000000000000000000000000000000000000000..70c8541ca8b71994e1b5ce5cfa2bf4863506cdb2 GIT binary patch literal 2161 zcmV-%2#)uOP)&xx7>Z+-IIK2cRTmanXj{FXU?2ClM#={g%2bHPzV?S z7*4+z0P+C2fS!Q#E zbtX^MDr%Fb#1;T{8Ys92aIcRDp4X` zTBwb#5<402k3yOKfROJ^WFbsCc@_grok>WPz-iCwBN=<`EBs*d@J_Ag77*y)P@*t!srs$-qv ziJflt88h!z9xZpsp8W%WGQeLVTyi~NJ76eVsTfXfO{JU7NR~2E&jDtIkW@i!o<$t! zg4`_YuG?^|!UWWW&;)Qir!Wa)t(t-ia{P{#?rj6yL(3as7F<@U1B{XGZKvyaGE*>} zk%}Lf7m<2p-E1Bsv5YuNYGYqz*B{V-B@#`3CQi&a>tYIUjeoOr-ARjdv53zE!Ntpc ztYc23SO#T}eTH3s8j-4$7;$6Bo!nywQb2>es(B}1XT+mYMlo(KP(Vs6@3D_EQtKj8 zO=TBxq)Rq&*u@l7vk$%-ahFuyVb`;{DHtLWgU31mHvrlr?o0)va#{erqCYyo@?2lgsjMQuzTcSDpR%p?TZVBh=LETq?=HLXI z0~ZBo{@w$yQ89;q*`@jmS=}d*Q~bja#d>;>NZnu(m$lNR_y!(dQJ6`y2*I2RL2-z@ zNA5f$nG5)m{Haa~=WG}fJCxmQ3;?O9_bR~S7RpWnEOc0(MisHe?B+p_$Qo#|9J)1E z0-mr~{xg-6#Ae}~6{(1A@_^JOG|MZtKKd%jktBG1@!W0WDrxm(fYec>PrejjL2Qy4N|uNu63~;{diyp-aNx@x}{8w z2{Fgmle4rNr2gPCsXAmiBNU5}I|Tir_NxQ$mZjNk#S&si!>dp?U1O4T=4e-MrC7oAhD| zv!WQeJ5TuF(I3RFTQU{Xu>zNsdQE8CF1xe$^dR{?TYX|vZ{hl>h%NR&u@&TrvJ!1` zm`H8*kyEHxMeG4~v(zKyaAEGTB=h)psA+)C0o5GF36Ni~=@Nls+`%GYr_k zyj60XRxf&qL}D(LjMSaPWkT%MYWATy5pPL_b99A69>)1QAWJHEhtQ(xBIzoY!#MFq zE&K4oh(AN&+|cfmzH{*i)A*w=3CBLzHYMAx*0-$#%k; z9_nF(^iYG{N@!MiJu79Hs()Di)Qo4Q_`4$eCsHa08a$O*E0M)hC!T}Su9(dv8kti!fVn#JC`jIG@ zQVEYl*(>Zh66JQG#d(zzvXeyHVD=%~k3@0$5T6R6MQmF+#0Nb^cn;S-TD)um{2{b} zy>=FTk|Poi@xjGC{Sco#3w7a9REq(hi+~;C!zDU)%3--#Xz4{}(Ie}Ipozh_TRbT3 zm|G3?!_j`Y>t!5ZfKA_vJ7|8QrToww?Pq3>i)hgjZ6$7&7%a44XaokH^`)|CZ!sFO njc}B(k8I~5;e*2{{}*5Yhe2-sRRd==00000NkvXXu0mjf@59;H literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/no_ring_detected.png b/res/drawable-xhdpi/no_ring_detected.png new file mode 100644 index 0000000000000000000000000000000000000000..a657afa9fae862ae9629fdac5260ba34fa48533a GIT binary patch literal 4055 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 JPDHLkV1nid!0!M6 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ring_detected.png b/res/drawable-xhdpi/ring_detected.png new file mode 100644 index 0000000000000000000000000000000000000000..a6180b2dedbc1161293d8000a61486b46fc1bd0d GIT binary patch literal 4644 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 OKzcgH+OIIqxc>vidyn7% literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ring_detected.png b/res/drawable-xxhdpi/ring_detected.png new file mode 100644 index 0000000000000000000000000000000000000000..b225740ac90f187a47e834f3aa4dbc22ade0c4cd GIT binary patch literal 7441 zcmXYWcT^L;_jU`V6s%Hq5wI;=MD_*?EvxLk1Z7hh%2pJRQp#Qx8S-HZf+)x+OGHL3 zpt2mu2AKk~!~vE0;`jaik#ll#Z|?IXxw*MXk}S*&&a$3o1pokN4RN|w000p5uRy@3 zEkh8ae*(TxJ%>>10PoN{ZoysvjAwwm7t-*i8{W&x%gys{&^s?p06>6ZsEe@)pWG;9 zZnXW<6fe$OE<9)i0P1-FpE$sxzB$6yDF*fYQM;95z9SCq5x)L+Ejdjem-MFJ*icgL zB66qd>sf?8Wii!xaK?GdsnhTJOX_9(i)%x(2Zvwb3U_crlPd+b$CUR4Ax%$fYPhW+ zZ5r!OnsX+<57~u`esSb&8XZ#Ccpf}DWGL)ls&^zIdcX>V-rrbYaf_JHk zs!+~1B}ZSifCcOEs2-D)jD}vQw(^7M*g$iBFe>~bV^Hs>Bt0gDUz(eTFFpXb3B8q{G;cYH-tn&W!Ap> zY%p+apbVv!(Gj4t;J*2raTnm_q{t*IS-(YLo)0Ti#F$8qR7934a zXxkZ7JlfbekH3?&*C4`0qIFr$*AE@{IkKG!{!%Bl3uZ)SH~+JMxtC>7tP73?94k}r z>kE8AHP2b^)HA7$o#Y-DUg}?D|EA{j^s_%rO6uyoTH?(cmHoxL`%&u)NEjzDI!Va} z7NPEB5IL>epE`P`WBUevO#Og#EsqFe3Z;h>3Rd-#qzFE;3ygJd&fRehKSbSjy~kJi z_Gx~{!lLAy8;goxL8E^`{k>RO=Y@@s+c#N>Oot1FHT|){x44AP0amsa3tv~PFS7mq z`U@aXs|@QLZiu7Yq#bx=eMUXMn#-QMmYQqE|fu1 zK#%2B?1Kn5pBq1H><(T7-B74O zOW?|^Z7!b=gIsIZ1R_N7*JGpzM1A2)+pcNs)xzU9XZJAI4jwMM%DBtyY|T1&H{vWG zMVC@dFi*AXfboSZGuHPy$9i5(&x%iPN@t@N1Uu#!(27s?B25mHKH0Ehy$IK~DPJ;Y zWeesv?C>qNzRW3(U2Gw@TPd?FoxI8yWUQS`FcQ+^UHcE|h1=x>t*$pix3~~vov9vb zc4S3w@tv)O2wcN4o9ah3{X?(}Q>k{SMU$3gWqC-7U#c=K~ZtXUCOO7j9$oo%E)D9Love?gnP zQlF2Q1uTbF!mA|I)nD1P$67mUk;m;-XD2vVu|MZHY(Ok&iEDRN^+^%mFA4B-pEY|j zH+o@AZrOSvwjsFbB&$V~QJKvp*$^swsnz*Vkd=$^XYy`bzi1KtA^W6##7Y&%PemQL z6#9llx_=)IoBZ_Uit0HWqrdp<%xin-Fm@MD8edts|NfbP(uWYaBw!AIz7-V5*A|Q}a8fWqBW!AU3cL~x_YC5tE;u)_zV2lIO@uwi5*-`ZGaN5co zM?t;%uM#A@%l7;DNK)omX6xdV(0ASWF@`qZZn(7J9y2vJjXDO1>7i1LIUK97g|#f512%} z+SX(ae?W!_5eo7|^HL;z;HAv^SBs*LUR3O^xfNLU`O$OTUkch4TW(h0QfHRYUaQsC zFC^RvVbfb&j8^(QzKGNXmk-u`*cBsgkiS6s=Vh!!D}w!<;`0e{!@R1|j&O6@lV7Sy zD*4v8K)|(k%^4Q=Q|aZE#^bz(`VNnyf=x(xSCeTAA7Wq|eSJ&^ll-Twr+AqoQ`EOH zVD`d1pTRoZurSzPQixf|$}~>>0*c`#R}aBc;P`|1FLiM9b|&&8xxK z<>Eh+dNu+?m|bP&F!)!X9D@Zrn#F*`W8~Z{X=k5FC){?-UegqLm%$)2I;7dl^{z7{ z)|s`+zo7DELZA*vj&9NJq|ifHN{gGk^Yx6BmW|c4r-@%YA=Jx*q5ppA_xG1Z4U1xm zfj^axCF%~@7Z{%f%Ru;78!J6Z+HTeMGhu%Y<+MdYlExfMC~?tCci$0AvtKdv0F1&U zdI(&J_D$vqhpcyC(Y_zWhKYm-c4nrWp6vC-@dR8qyfR9Igi)^ue(9beYS*L!|4ySc@TYc@{!-iaOCb5rB)q@a&Ayw(A`+pXPvV zwd54hH$5@#1XJ44MQ}NTHsY%}HT~0pSW_s@J-+TG{Sb^YW?Je(40d28Axo#OZ$|qB z{L3lk

MBq>v70250GsP3nwm;h2c7uVWeCoAN|+@j1}~rj6r2GxoUtN8uco!Nn1u zFIIxH-Z*F|JXatcKXbUrSb?7UE+0!aVjBCH!RFvAW93Gd@KYf9G0*_cW^%|Sjh1iy zjPIMi)aO?5Q6W2O=c-LUD#705vFsGR9*;d^c&U{_scb+(YG_}hTI%bktqR3nci-23 zy9fO^fxYCRrfYrc+2XTm6!Q;Vi@NKa8&u@|fo3H|Ou0Rskws8HT*$MG45TmPA* zJo-u?XZzIluiftrru0Ohhor}#^VI-3fVdSD;*%Apu8+N6GAua;b-Rp5q+Ds{k1>v* z46^v-Fw-so;_`>bxTDvCo+*$*PRYN&bABq1oT)16DmF7TG2tV_M?NRHbUp4;oQeXc zm83%GfJ68AMs@|V;L`5ED|!S6VPW=I4fEhjwSBnv*ejmUm115{bMw$5LOtTqrXkKVka0w( zSALwlAuI}pUG;`AgA;+?%o%lpEJ<+&p(c)9kFH20iR!$K`eP5VuHxk2ZBnnOJ`~y# zWqeU`uZNDBvjOtHf8uX|b!T+@h-+z1uNSa7s~BO}NLLG-#u$iT7nnWR`%bPwy<~YJRP%Ym;seR!8Rr8Y!(o|lxRVMv z@$FMpZ%FGc-;l+uiegDPN`z0Au~@9x#;;aIB_}^01(i((hG)5J;}%>~9W#C>7%8wg z=W~)Qfr#H?&D^LenEa@IoHSpcm(s1gCV>F$rhQeX-ew_@pl6|}yUJOAZ6dimYr^7X zO*Zg_EvL(Fcs8|ZD%DH2qUD^U{08q2Am4%su8oxXGOC71SSBj5OPUE+G(Gjdo2ySCr~B}2ybhJVTD zyRD3dzbZgbu0Sqcg2y8G`cozJV7Fz_zvY^lP3@i+7j;uGgco<#A~ z+LH&>fy;-P&_O#-Gz*G#`VOGEUzaj83phPsAg!(*EfEW?c23Sbe+)(cL@&= zMmc&_rCa`LC_RRDQ@KXfPx$Nks)#JXEunK7`;Yt#$8V)dFG7{@g#5l4h$QB-Q)kdYMcy2ULuUWT*nqKJR)S8Ow@oA&b5d_&>?31S!664Mi;Pm|XZ>PG%|=p0RYYpvpBJ zqT4kRAXJrVJT|ynb8%e*1DoVKV@vs`snk2x5{GP5=2^*l;Xzz=UoJK`nRhFJ9p!%1${vzFsPSLkG({MJ?ry z={SIy|bj18KtIAm8X-$eC$)l}T#7vRYNA&iQ~O za&i6ilJHJsJ>~KP%fVy?QUK#FyRygYQ#J5;my;OZF1Al~ogR^IVWS$TJkMX`Woq)N zcN&Z*|DPX&ndVIwb-*b{-)>-W4UMDqKJ$a|pm|$-Ka|afUsef466v?7f8x^jDEbKs zqy4RXFD;K`LbpfJ$vk}giU%i++l zfGCTKW7CEh#*-1NVoX5G3>P>;HFHxNCpO+gznA*Q$CQO3TzQ@i12F`zXZ$kqc#Xn@ zzo&mV9vby>f?3(gf@^m4%(I0c!>Z4f(BW*&%qXwZNaGh)t#S$Cq88Cl{}DBQft1C) z4v#eMyGJ1cE-0cSTPaQBVy6MEDHM7&ytOpi-vo9+2`w-@QM`%8IgZyR)lb9O96`X( zN#s>k`a~0?DBhy1mg+Rnlhh|PxRiLwWo>*U~wQ;<x1rsl7U+?8GiG7Ip0kiCCJ!4!jIiRQ8Bg-jG6Cg5hn&_MNezdusW^ zw}nM+tAB^Kr<6i_-P!QJ9uL8O5F*kLaKvw1Ge0URu-p==+xMgW^t5s{uFB18(hY2{ zFWR~Y!!7{(LDLPReGa!AE_$@uoZ!oEv|L|eIAPMqaB#>RfD*g2tfD_$2C~~TN75B~ zG*sEKk3VDkvaUVg9{G<>VMFhMEYoZbsV{>Hy3f>?op*M50iKEtLTvlVl8CC_)izX)E^;aEsjwc;=BnhsDf6*{HT{4~PszgLD!8~HhZ4AJsvu`2Tm%IHs9ZUcu9Ir7R`y1q zxEc2M5e)s;#nFF*s%fuJ$;F!C_rY0lE5a}G|LZ%(vO=Y`?+s35FuoV6=Bs2svv6!- z%Mvxgq<+NasO~@KpDN2Hd{KIJs_Zn6&r7diGK{Qy2I~Bs;*L9MXMhmYbC2S=xPEVb zNc`#->MvSm!*ZGLJ7I-;T9%n9tLBT5N3flh$Sy}Q1JV!8E`m;hK72;j zjN$9%9BMu*b<&n|Evq-7#;D%Cj-6;q&5K#Ky!ckGFVH8G_k;a*8WOA!HXvoR&S?L{ z8KY1jDCKs{;%dJWW6{o(>{-}W@_L4$e{9tu@4>f(7m_-9S2j1QAb>l227+}cTCFjPFfrDSSXqG`{xxn0w9SmMWFT8hUD1Pm0gJpKidtIgt z9!u_zFx>CSw5W&WCia^VmNYtwanyL^;>M(j%%x<^MW1=W(U*y5a++sUbOl#7{C2}Wfm*Mhy(2~o${$ye1TRvKpZpSnxYkh& zXvIRhUh$GzGLJ;h#-!NSM}N_X$480I?raTeM(${Cc9mft1nthii{j$-Veh=Cq)VP^ zt7lH0M+u*k({`DWmvJYz@L>fZiPWIMbh#^RKv789{p`ik$K73e<39&|69PpU!f6Fc9G^QZ*f#wvz|Z>~7lSRnH%mvw5`K{a0N$F+_o{>eIZ8 zg77xC4VPB5B1nF4T3}J(qnp{C-BL4P-iT6XFVFlJpt%hfnQc}S!UveZN*Y(^5v@A`sZR< z;)<@?5|D&*&o;!x=_%>1Rrv+iWcYA7jwqzH$_qm+yGU6p4k_zyEpy4a#wsgNY5L`Y zBgchbI6wcZf62*jK2Mh7+WV&qZ9uyw;qSnePs+lEON5>(VgR`2pT_vk;8ErIJ*p+w zt)G}Bfx?2vK)jId(+ko&pbJV&W@n|tZpYb-*SKa&K*FlGH%@4;YAb*R_T&_xp$mGM zF3nP|)+dINHWmEuQv`Z`!v>GAagVcaK#s)l7rz*BDN%g-<)Q=)XpmbRIDJAuFJwT2 zt{~FWoXUT9JnHWDS?e}>5y?tqF7g`>)U?l>D)5EUl{6)fcM%(|_LG9yt(-xAcwriz zds1Y1ug_anxuEu;{IxnG%v)&)S-o#!=i-KpBIxJV>vAfg^I^ed2?xPN8a`y_zL0F| zQM1gOl`eF5TARIW%C%zR2d?o(EDWk#cQtz_M2frk;=Oih1+n$X+dgLB*~405C@~A> z;YdKfSBY8u$A|}9BF6+G`9fe!uMe%%Ym4@$yOAe|+j?Y{b6ZK}b*lAssh9h{QS-hO zpfA7iZL1LshY~;2%ly2?Bd^6v zjfxr_T}jz(t6;wNM+O`J>goLLO{Kz`C!@xPh5%xG!*^=hc5))k&sLFz38gHHBvX$( z1z{quw4t@1qljwN=UB0sbN0WHg-TG*Fi%#gGP3Z_xvF+fepW2FOP|k7bhk!jMr@53 zld-DrTrFSp1%r9}KA1u7r-3Rz^*fG0c^V@OJAIb?SxIb74C)$M$hl zE#;1bAQ!1!&LIvsn)`*F7Rn76&;JK$sZAJ?_6;0yYkm^n%`PcWf5ASY&=!k%O1i>K z`y)IVj89Sl-nbCM*7I}>J3A^=nAr>&a0_>p<6U1b@uKFR=U_c|3p%#388bDugbPHUp>$?5};@^*Z(sjMX=b z@!4;Yo@I#UtzVOXh+KoUrInW@j#Q^8Ib1t=ZG6SACi+3R=NGWIz@wqXQTI?N4K0q`88+}pKJ literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ring_paired.png b/res/drawable-xxhdpi/ring_paired.png new file mode 100644 index 0000000000000000000000000000000000000000..c90233b1b83e4179155050466131da58bfe6f7c3 GIT binary patch literal 8600 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 + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 6ab0009f4b9..6965935e34b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -700,6 +700,10 @@ Enable widgets Disabled by administrator + + NFC unlock + + @@ -4946,4 +4950,21 @@ + + + NFC Screen Lock Settings + Paired Tags + Enabled + Pair with a tag + + + NfcPairingActivity + Pair now + Set the tag flat on a table and place the phone on top + Tag and phone successfully paired, you are done! + The tag provided cannot be used to unlock your phone + The pairing with your tag failed, please try again + NFC is not enabled and is required for NFC Unlock. Please turn on NFC. + NFC Settings + diff --git a/res/xml/security_settings_biometric_weak.xml b/res/xml/security_settings_biometric_weak.xml index 7236673c178..c2e8ab7cb8d 100644 --- a/res/xml/security_settings_biometric_weak.xml +++ b/res/xml/security_settings_biometric_weak.xml @@ -61,6 +61,11 @@ android:title="@string/owner_info_settings_title" android:summary="@string/owner_info_settings_summary"/> + + diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml index d29d221f65c..1a5431593cb 100644 --- a/res/xml/security_settings_chooser.xml +++ b/res/xml/security_settings_chooser.xml @@ -36,6 +36,11 @@ android:title="@string/owner_info_settings_title" android:summary="@string/owner_info_settings_summary"/> + + diff --git a/res/xml/security_settings_nfc_unlock.xml b/res/xml/security_settings_nfc_unlock.xml new file mode 100644 index 00000000000..c3442c604da --- /dev/null +++ b/res/xml/security_settings_nfc_unlock.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml index 7cde2f5d428..a102efa9cb6 100644 --- a/res/xml/security_settings_password.xml +++ b/res/xml/security_settings_password.xml @@ -48,6 +48,11 @@ android:title="@string/owner_info_settings_title" android:summary="@string/owner_info_settings_summary"/> + + diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml index d8e06b3566a..0584e4ae247 100644 --- a/res/xml/security_settings_pattern.xml +++ b/res/xml/security_settings_pattern.xml @@ -52,6 +52,11 @@ android:title="@string/owner_info_settings_title" android:summary="@string/owner_info_settings_summary"/> + + diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml index 1e8fbbeaba0..1417e217853 100644 --- a/res/xml/security_settings_pin.xml +++ b/res/xml/security_settings_pin.xml @@ -48,6 +48,11 @@ android:title="@string/owner_info_settings_title" android:summary="@string/owner_info_settings_summary"/> + + diff --git a/src/com/android/settings/NfcLockFragment.java b/src/com/android/settings/NfcLockFragment.java new file mode 100644 index 00000000000..b7bf6f768c6 --- /dev/null +++ b/src/com/android/settings/NfcLockFragment.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.nfc.NfcAdapter; +import android.nfc.NfcUnlock; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; + +import android.preference.PreferenceCategory; +import android.util.Log; +import com.android.internal.widget.LockPatternUtils; + +import java.text.DateFormat; +import java.util.Date; + +import static android.preference.Preference.OnPreferenceClickListener; + +public class NfcLockFragment extends SettingsPreferenceFragment { + + private static final String NFC_PAIRING = "nfc_pairing"; + private static final String NFC_UNLOCK_ENABLED = "nfc_unlock_enabled"; + private static final String TAGS_CATEGORY = "nfc_unlock_tags_category"; + private static final String TAG_FORMAT = "Tag # %d"; + + private NfcUnlock mNfcUnlock; + private LockPatternUtils mLockPatternUtils; + private NfcAdapter mNfcAdapter; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mNfcUnlock = NfcUnlock.getInstance(NfcAdapter.getDefaultAdapter(getActivity())); + mLockPatternUtils = new LockPatternUtils(getActivity()); + mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); + addPreferencesFromResource(R.xml.security_settings_nfc_unlock); + } + + @Override + public void onResume() { + super.onResume(); + + boolean prefsEnabled = (mLockPatternUtils.isLockPasswordEnabled() || + mLockPatternUtils.isLockPatternEnabled()) && mNfcAdapter.isEnabled(); + CheckBoxPreference unlockPref = (CheckBoxPreference) findPreference(NFC_UNLOCK_ENABLED); + unlockPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + mNfcUnlock.setNfcUnlockEnabled((Boolean) newValue); + return true; + } + }); + Preference pairingPref = findPreference(NFC_PAIRING); + unlockPref.setEnabled(prefsEnabled); + pairingPref.setEnabled(prefsEnabled); + + long[] tagRegistryTimes = mNfcUnlock.getTagRegistryTimes(); + unlockPref.setChecked(mNfcUnlock.getNfcUnlockEnabled()); + + final PreferenceCategory pairedTags = (PreferenceCategory) findPreference(TAGS_CATEGORY); + pairedTags.setEnabled(prefsEnabled); + + loadTagList(tagRegistryTimes, pairedTags); + } + + private void loadTagList(long[] tagRegistryTimes, final PreferenceCategory pairedTags) { + pairedTags.removeAll(); + + for (int i = 0; i < tagRegistryTimes.length; i++) { + + final Preference thisPreference = new Preference(getActivity()); + final long timestamp = tagRegistryTimes[i]; + + thisPreference.setTitle(String.format(TAG_FORMAT, i)); + thisPreference.setSummary( + DateFormat.getDateTimeInstance().format(new Date(tagRegistryTimes[i]))); + thisPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + + AlertDialog.Builder deleteDialogBuilder = new AlertDialog.Builder(getActivity()); + + deleteDialogBuilder.setTitle(thisPreference.getTitle()); + deleteDialogBuilder.setItems(new String[] {"Delete"}, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == 0) { + if (mNfcUnlock.deregisterTag(timestamp)) { + loadTagList(mNfcUnlock.getTagRegistryTimes(), + pairedTags); + } + } + } + }); + + + deleteDialogBuilder.show(); + + return true; + } + }); + + + pairedTags.addPreference(thisPreference); + } + } +} diff --git a/src/com/android/settings/PairNfcDevice.java b/src/com/android/settings/PairNfcDevice.java new file mode 100644 index 00000000000..638f0d78ea2 --- /dev/null +++ b/src/com/android/settings/PairNfcDevice.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.content.DialogInterface; +import android.content.Intent; +import android.nfc.NfcAdapter; +import android.nfc.NfcUnlock; +import android.nfc.Tag; +import android.os.Bundle; +import android.os.Handler; +import android.os.PowerManager; +import android.provider.Settings; +import android.view.Menu; +import android.widget.ImageView; +import android.widget.TextView; + +public class PairNfcDevice extends Activity { + private static String TAG = PairNfcDevice.class.getName(); + + private TextView mStatusText; + private ImageView mStatusImage; + + private PendingIntent mPendingIntent; + private NfcAdapter mAdapter; + + private Handler mHandler = new Handler(); + private PowerManager.WakeLock mWakeLock; + + private NfcUnlock mNfcUnlock; + + // If pairing fails, we immediately get a new intent that would not leave time for the user to + // read the error message. So we'll just drop it and the user has to try again. + // TEST + private boolean mWaitingForDeviceDelayed; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_nfc_pairing); + + mStatusText = (TextView) findViewById(R.id.status_text); + mStatusImage = (ImageView) findViewById(R.id.status_image); + + mAdapter = NfcAdapter.getDefaultAdapter(this); + mPendingIntent = PendingIntent.getActivity( + this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); + + mNfcUnlock = NfcUnlock.getInstance(mAdapter); + + setWaitingForDeviceMode(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + return false; + } + + public void onPause() { + super.onPause(); + mAdapter.disableForegroundDispatch(this); + if (mWakeLock != null) { + mWakeLock.release(); + } + } + + public void onResume() { + super.onResume(); + + if (!mAdapter.isEnabled()) { + // We need the user to start NFC. + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + dialogBuilder.setMessage(R.string.enable_nfc); + dialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); + } + }); + dialogBuilder.show(); + } + + mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); + + if (mWakeLock == null) { + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); + mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG); + } + mWakeLock.acquire(); + } + + @Override + public void onNewIntent(Intent intent) { + Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + if (!mWaitingForDeviceDelayed) { + processTag(tag); + } + } + + private void processTag(Tag tag) { + if (mNfcUnlock.registerTag(tag)) { + setPairingSucceededMode(); + } else { + setPairingFailedMode(); + } + } + + private void setWaitingForDeviceModeDelayed(int delayInMs) { + mWaitingForDeviceDelayed = true; + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mWaitingForDeviceDelayed = false; + setWaitingForDeviceMode(); + } + }, delayInMs); + } + + private void setWaitingForDeviceMode() { + mStatusImage.setImageResource(R.drawable.no_ring_detected); + mStatusText.setText(R.string.status_no_ring_detected); + } + + private void setPairingFailedMode() { + setErrorMode(R.string.status_error_pairing_failed); + } + + private void setPairingSucceededMode() { + mStatusImage.setImageResource(R.drawable.ring_paired); + mStatusText.setText(R.string.status_device_paired); + + // Automatically quit. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + finish(); + } + }, 4000); + } + + private void setErrorMode(int errorMsgResourceId) { + mStatusText.setText(errorMsgResourceId); + setWaitingForDeviceModeDelayed(2500); + } +} diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index e4dcea1db7c..45c36ac295e 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -29,7 +29,9 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; +import android.nfc.NfcUnlock; import android.os.Bundle; +import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.preference.CheckBoxPreference; @@ -57,6 +59,7 @@ public class SecuritySettings extends RestrictedSettingsFragment // Lock Settings private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; + private static final String KEY_NFC_UNLOCK_SET_OR_CHANGE = "nfc_unlock_set_or_change"; private static final String KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING = "biometric_weak_improve_matching"; private static final String KEY_BIOMETRIC_WEAK_LIVELINESS = "biometric_weak_liveliness"; @@ -225,6 +228,17 @@ public class SecuritySettings extends RestrictedSettingsFragment } } + // don't display NFC unlock settings if the prop is not enabled + if (!NfcUnlock.getPropertyEnabled()) { + PreferenceGroup securityCategory = + (PreferenceGroup) root.findPreference(KEY_SECURITY_CATEGORY); + + if (securityCategory != null) { + securityCategory.removePreference( + root.findPreference(KEY_NFC_UNLOCK_SET_OR_CHANGE)); + } + } + // Append the rest of the settings addPreferencesFromResource(R.xml.security_settings_misc); @@ -520,6 +534,9 @@ public class SecuritySettings extends RestrictedSettingsFragment if (KEY_UNLOCK_SET_OR_CHANGE.equals(key)) { startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment", SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); + } else if (KEY_NFC_UNLOCK_SET_OR_CHANGE.equals(key)) { + startFragment(this, "com.android.settings.NfcLockFragment", + SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) { ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this.getActivity(), this);