From 50d1aa4d96ab0013a44af4ba7e9a393d9abd500c Mon Sep 17 00:00:00 2001 From: David James Date: Sun, 12 Jan 2014 13:21:49 -0600 Subject: [PATCH 01/71] PrivacyGuard/Blacklist Change-Id: I95f4b3ce43967421ee906c31b515b10399fc59c4 --- AndroidManifest.xml | 2 + proguard.flags | 1 + res/drawable-hdpi/ic_blacklist_calls_off.png | Bin 0 -> 3311 bytes res/drawable-hdpi/ic_blacklist_calls_on.png | Bin 0 -> 3236 bytes .../ic_blacklist_messages_off.png | Bin 0 -> 3169 bytes .../ic_blacklist_messages_on.png | Bin 0 -> 3129 bytes res/drawable-hdpi/ic_privacy_guard.png | Bin 0 -> 1523 bytes res/drawable-hdpi/ic_privacy_guard_off.png | Bin 0 -> 1810 bytes .../ic_see_contacts_holo_dark.png | Bin 0 -> 1482 bytes res/drawable-mdpi/ic_blacklist_calls_off.png | Bin 0 -> 3134 bytes res/drawable-mdpi/ic_blacklist_calls_on.png | Bin 0 -> 3081 bytes .../ic_blacklist_messages_off.png | Bin 0 -> 3063 bytes .../ic_blacklist_messages_on.png | Bin 0 -> 3030 bytes res/drawable-mdpi/ic_privacy_guard.png | Bin 0 -> 1250 bytes res/drawable-mdpi/ic_privacy_guard_off.png | Bin 0 -> 1507 bytes .../ic_see_contacts_holo_dark.png | Bin 0 -> 1053 bytes res/drawable-xhdpi/ic_blacklist_calls_off.png | Bin 0 -> 3459 bytes res/drawable-xhdpi/ic_blacklist_calls_on.png | Bin 0 -> 3358 bytes .../ic_blacklist_messages_off.png | Bin 0 -> 3274 bytes .../ic_blacklist_messages_on.png | Bin 0 -> 3219 bytes res/drawable-xhdpi/ic_privacy_guard.png | Bin 0 -> 1579 bytes res/drawable-xhdpi/ic_privacy_guard_off.png | Bin 0 -> 1642 bytes .../ic_see_contacts_holo_dark.png | Bin 0 -> 2058 bytes .../ic_blacklist_calls_off.png | Bin 0 -> 3769 bytes res/drawable-xxhdpi/ic_blacklist_calls_on.png | Bin 0 -> 3606 bytes .../ic_blacklist_messages_off.png | Bin 0 -> 3470 bytes .../ic_blacklist_messages_on.png | Bin 0 -> 3361 bytes res/drawable-xxhdpi/ic_privacy_guard.png | Bin 0 -> 1694 bytes res/drawable-xxhdpi/ic_privacy_guard_off.png | Bin 0 -> 1743 bytes res/drawable/ic_blacklist_calls.xml | 21 + res/drawable/ic_blacklist_messages.xml | 21 + res/layout/blacklist_entry_row.xml | 64 +++ res/layout/dialog_blacklist_edit_entry.xml | 71 ++++ res/layout/installed_app_details.xml | 8 + res/layout/privacy_guard_manager.xml | 46 ++ res/layout/privacy_guard_manager_list_row.xml | 49 +++ res/menu/blacklist.xml | 28 ++ res/menu/privacy_guard_manager.xml | 29 ++ res/values/cm_arrays.xml | 53 +++ res/values/cm_strings.xml | 111 +++++ res/xml/blacklist_prefs.xml | 50 +++ res/xml/privacy_guard_prefs.xml | 26 ++ res/xml/security_settings_app_cyanogenmod.xml | 38 ++ .../android/settings/SecuritySettings.java | 36 ++ src/com/android/settings/Settings.java | 7 +- .../settings/SettingsPreferenceFragment.java | 16 + src/com/android/settings/SubSettings.java | 15 +- .../applications/InstalledAppDetails.java | 75 +++- .../settings/blacklist/BlacklistSettings.java | 385 +++++++++++++++++ .../blacklist/EntryEditDialogFragment.java | 301 +++++++++++++ .../blacklist/PreferenceFragment.java | 144 +++++++ .../settings/blacklist/ToggleImageView.java | 92 ++++ .../SystemSettingCheckBoxPreference.java | 67 +++ .../PrivacyGuardAppListAdapter.java | 184 ++++++++ .../privacyguard/PrivacyGuardManager.java | 396 ++++++++++++++++++ .../privacyguard/PrivacyGuardPrefs.java | 86 ++++ 56 files changed, 2418 insertions(+), 4 deletions(-) create mode 100644 res/drawable-hdpi/ic_blacklist_calls_off.png create mode 100644 res/drawable-hdpi/ic_blacklist_calls_on.png create mode 100644 res/drawable-hdpi/ic_blacklist_messages_off.png create mode 100644 res/drawable-hdpi/ic_blacklist_messages_on.png create mode 100644 res/drawable-hdpi/ic_privacy_guard.png create mode 100644 res/drawable-hdpi/ic_privacy_guard_off.png create mode 100644 res/drawable-hdpi/ic_see_contacts_holo_dark.png create mode 100644 res/drawable-mdpi/ic_blacklist_calls_off.png create mode 100644 res/drawable-mdpi/ic_blacklist_calls_on.png create mode 100644 res/drawable-mdpi/ic_blacklist_messages_off.png create mode 100644 res/drawable-mdpi/ic_blacklist_messages_on.png create mode 100644 res/drawable-mdpi/ic_privacy_guard.png create mode 100644 res/drawable-mdpi/ic_privacy_guard_off.png create mode 100644 res/drawable-mdpi/ic_see_contacts_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_blacklist_calls_off.png create mode 100644 res/drawable-xhdpi/ic_blacklist_calls_on.png create mode 100644 res/drawable-xhdpi/ic_blacklist_messages_off.png create mode 100644 res/drawable-xhdpi/ic_blacklist_messages_on.png create mode 100644 res/drawable-xhdpi/ic_privacy_guard.png create mode 100644 res/drawable-xhdpi/ic_privacy_guard_off.png create mode 100644 res/drawable-xhdpi/ic_see_contacts_holo_dark.png create mode 100644 res/drawable-xxhdpi/ic_blacklist_calls_off.png create mode 100644 res/drawable-xxhdpi/ic_blacklist_calls_on.png create mode 100644 res/drawable-xxhdpi/ic_blacklist_messages_off.png create mode 100644 res/drawable-xxhdpi/ic_blacklist_messages_on.png create mode 100644 res/drawable-xxhdpi/ic_privacy_guard.png create mode 100644 res/drawable-xxhdpi/ic_privacy_guard_off.png create mode 100644 res/drawable/ic_blacklist_calls.xml create mode 100644 res/drawable/ic_blacklist_messages.xml create mode 100644 res/layout/blacklist_entry_row.xml create mode 100644 res/layout/dialog_blacklist_edit_entry.xml create mode 100644 res/layout/privacy_guard_manager.xml create mode 100644 res/layout/privacy_guard_manager_list_row.xml create mode 100644 res/menu/blacklist.xml create mode 100644 res/menu/privacy_guard_manager.xml create mode 100644 res/values/cm_arrays.xml create mode 100644 res/values/cm_strings.xml create mode 100644 res/xml/blacklist_prefs.xml create mode 100644 res/xml/privacy_guard_prefs.xml create mode 100644 res/xml/security_settings_app_cyanogenmod.xml create mode 100644 src/com/android/settings/blacklist/BlacklistSettings.java create mode 100644 src/com/android/settings/blacklist/EntryEditDialogFragment.java create mode 100644 src/com/android/settings/blacklist/PreferenceFragment.java create mode 100644 src/com/android/settings/blacklist/ToggleImageView.java create mode 100644 src/com/android/settings/cyanogenmod/SystemSettingCheckBoxPreference.java create mode 100644 src/com/android/settings/privacyguard/PrivacyGuardAppListAdapter.java create mode 100644 src/com/android/settings/privacyguard/PrivacyGuardManager.java create mode 100644 src/com/android/settings/privacyguard/PrivacyGuardPrefs.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4058c4530f6..e1ae2dd2076 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -69,6 +69,8 @@ + + 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_blacklist_messages_on.png b/res/drawable-hdpi/ic_blacklist_messages_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7c8093979f3a7bfcf1385adcdedae57e6d9bde GIT binary patch literal 3129 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 XVff#bATbm400000NkvXXu0mjf%tN@F literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_blacklist_messages_off.png b/res/drawable-mdpi/ic_blacklist_messages_off.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e53e3b5de4757bae3a24e6cb21f455698efefa GIT binary patch literal 3063 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 M07*qoM6N<$f~j;PdjJ3c literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_privacy_guard_off.png b/res/drawable-mdpi/ic_privacy_guard_off.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9db2e9c5f368c01180d5734b28fe29b30e3d7f GIT binary patch literal 1507 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_blacklist_messages_off.png b/res/drawable-xhdpi/ic_blacklist_messages_off.png new file mode 100644 index 0000000000000000000000000000000000000000..f32eab68944440a0bbfa949eadb9aae8cb4e13d3 GIT binary patch literal 3274 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 IM6N<$f`Hu&5&!@I literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_blacklist_messages_on.png b/res/drawable-xhdpi/ic_blacklist_messages_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c12e04ccaf81a2d2df6f4dce3fa86e54256ef30f GIT binary patch literal 3219 zcmV;E3~cj>P)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} z0005LNklHv&DH^>I06Tk*dH(`US69gszCJ0OrHb9+#ZgBl$ zOKudCOCX6Od=f%2`FI}reCG&?2&Nn_n0Q2iC=dmrKop1qQ6LK35wD){F96BNY~LjJ z_Q1F4^a&&Y(h=b|F8tI|XhZUIs%xMXd}so#;X@MW1b=H0yKw|?>In7$VBU06S9q4VV z0Pm)R+dWmQDs+CJz`=a4D#thBNuEVy3n06>E2zz@9>V5=B5jho>sqaWp#+-XgA}j} zSP7qmB(QU8eG;H5i5!3b2=MBxF?l)Gl{JMm;9{yz`}qQJ!CZva&UJ9PofPEh~=002ovPDHLk FV1iFo^RoZ| literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_privacy_guard.png b/res/drawable-xhdpi/ic_privacy_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b4a4ca069f2a33db0303b19387c673e4715797 GIT binary patch literal 1579 zcmV+`2Gse9P)fgvwHFO>lmFfuTFyT-uCz`($8S=Z6U$(4aLz?xi8RKmc( zaDahL4HwUNoooM z0|V3!1_lNOUYGn51^2|vJOv{IRR$`9h{z}f2n!KD2r&dmE-fm92PFf80D}U90fPfW z07D`}J;MTqqYQ5t#Ti`~OBq)%-eVGD3SyeTbb(ozIg)uH^BWdRmJXI%ta_}itoPU~ z*`~35V-IKF&7s86#qotRk@EtVBi9ygP3{FeQan?6g?K0N3G+?km*HP5pd+wD&{gn? zP^!=m;a(9Hk-ehfqF=-&i5rPuk*JWAlRPGsFD)&7LZ(bsUG|n-pS+9wABC-og-Uu# zZwxwoom5>bJwd%!`bP{F7}gra7~7i2n=+feG`nEF z(_)F`1gkphT$?!CKs#4^YX@UT9VazsB^L!(c{c@jWe;^vT`v=F8y|PyV7~z2$~& zn@l!u*=n+F`wpv}`**wUIlC`x|AT`$hkhPuKPG;B#YyW^=guUb{dIoQMeR#RuOwdm zcYV%Hn_GA9)ZbISf8t@@W3eaupJl!fd3o@4{#*HX7d|w7GX4DO>w@p$KLviB`qTQ) z@&A7S4FC@``j+us00002VoOIv0063uBQgL0010qNS#tmY3labT3lag+-G2N4000Mc zNliru-3A#GGA(xMUC96d0+>leK~z}7?U>JN6G0TmKeI+HVx|77O{pS?E%hK44+=Sm z=&46V|AAh_Yw^DjLG<836ue2rlT`4aB8Y-eEZ81YdPuQNv1+iTjWOM?2iHw@vpc(+ zrg-UF!e%mW-gn--AM;*}*jRGd1V|zUo&?@~x}+mAnIxtK(4g+CB&niz8d3WI)TMr1 z)s!U3^*)lTdn)Lla!CLtD73D<`Z&p13UrfaE13$xK)TO4%w01<~F&w%{(jW{}P z1K1K9c%o*;7Ke>7W^vezQHzDxVRNbjDk+LwN%;V0kMFQyx*2p+C#5N$Fb_BkF@yt@ zco<_RrxgvRy!ly4(yTZ75XpP16%AGZhgo_7=w*QpV6~0e)KER)_Iccn+g&|oQc4UC z*I0{NS80e)QHhU}Pd0#MmeYi+H4eXHNflLoHzkR;TIUV?EXhrut`p#80)T;uELVWZtO48& zi!*_DqgWF*)jY*yfEWB~-m{7L#Wb@`nXid;k+uhuSYi#-n9?t#DqA!f$n~*tpl}>4 zrmTyE%E3UhK6Sbr1(1vK5{>Z4AHIp=@u}vkGZ*9HQI(x`X+~LTG*juQbFp`BG(FE; zo9aet2vCU?P0}W^?))tZCvo|1p zD#k)wX-f+w^w{5VoxbQ)8+$Yr^exarUDuv=H-YH379>?Pp)(uMWddlwhIKSs8*4WI dtN8B#e*g}FItffrnl}Id002ovPDHLkV1iJwx{3e* literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_privacy_guard_off.png b/res/drawable-xhdpi/ic_privacy_guard_off.png new file mode 100644 index 0000000000000000000000000000000000000000..64255495f944d6569b374f7ab87ba036ed2c54c9 GIT binary patch literal 1642 zcmV-w29^1VP)fgvwHFO>lmFfuTFyT-uCz`($8S=Z6U$(4aLz?xi8RKmc( zaDahL4HwUNoooM z0|V3!1_lNOUYGn51^2|vJOv{IRR$`9h{z}f2n!KD2r&dmE-fm92PFf80D}U90fPfW z07D`}J;MTqqYQ5t#Ti`~OBq)%-eVGD3SyeTbb(ozIg)uH^BWdRmJXI%ta_}itoPU~ z*`~35V-IKF&7s86#qotRk@EtVBi9ygP3{FeQan?6g?K0N3G+?km*HP5pd+wD&{gn? zP^!=m;a(9Hk-ehfqF=-&i5rPuk*JWAlRPGsFD)&7LZ(bsUG|n-pS+9wABC-og-Uu# zZwxwoom5>bJwd%!`bP{F7}gra7~7i2n=+feG`nEF z(_)F`1gkphT$?!CKs#4^YX@UT9VazsB^L!(c{c@jWe;^vT`v=F8y|PyV7~z2$~& zn@l!u*=n+F`wpv}`**wUIlC`x|AT`$hkhPuKPG;B#YyW^=guUb{dIoQMeR#RuOwdm zcYV%Hn_GA9)ZbISf8t@@W3eaupJl!fd3o@4{#*HX7d|w7GX4DO>w@p$KLviB`qTQ) z@&A7S4FC@``j+us00002VoOIv0RM-N%)bBt010qNS#tmY3labT3lag+-G2N4000Mc zNliru-3I~|CpqUfRAm4F0@q1IK~z}7?U&C>R8bViKTjitxWNb``WNff>}@i z*+?N}+@b_9co;mu@Q?-uh-o4O!GBng9USExrzj-CnmO>KCC5J);xjG0*3Nl9PmLu4 zc|;kbM4h*IA?*MY>{D;yG9kz3u!{&0pQGyz>;#Y^9kgXpzWd<^*k((bO71*Cy3N2O z2gzYNJ7lYa?7+G(BuryLg?j20RG3B*ffVaf|K|8MC_nHhi=W2eI#AzAt860{a83to z1i?r7Ok)CBzYc?R@|PhVbJe9cxV4IIE(!|$bkIS+qHv8a7gx6k;tEuLB?3TE<*+H% zNtswVg8kA?9@~>qXBFm@(BalTQwe66N$ZqH=|V@3+~7LtvGK);2V_x}F($Prf^5VV z!8CssCEuIbcNR|0O*>s%jt0$-inR`2 zE%USe+)wQ%Xk8}3OKa8&N??9FM_?gPfchna8)6J(mMv{eEs?;ZOTT3%=<{c?^ZMbQ zgYeQR9@tAYaQ)x4*-6=HEkBp^O}^Uf_kZHUenV^XVUC2Q;$2=mt(YQW)Z#jmAHO6ThtGJ$oI+<7I6Mc|TBen&XT+ z!PjV$guj3Y`hz3HtrcPLsN;?VHg5}o0{V$k#skaF;8Ca5Sl~10B0)bAo5S8>*?v o7LL(FubLHG`|>a1tCrFJ0aq2`4faWoX8-^I07*qoM6N<$f{DG@X#fBK literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_see_contacts_holo_dark.png b/res/drawable-xhdpi/ic_see_contacts_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..279fff964b4dff36fe9f9c1ddd6af8b59bbb53d1 GIT binary patch literal 2058 zcmV+l2=(`gP)ht(u000LPNkl1zQ6hFg3e~n+#{oMv z+B!~s6{lmxj+Xjhv|@dvjx8;890nUOCJ>UKX<&pAA3P#~Jok0)uYV*kwArv5HvOYB z`JUOCox8ttzMu0u=bro93&R@Lu>QZ~>-&HpT8xMxhG89`Vqm3Hcc#?W}lrciYJmTmH4BRdu1BjTL)& zglJBARFyh_#eLR;CV`zL(@H}#%{&ZDG(sHLJKNcC=)K#k_q8o|tD@U^lI=qYFo_mm zwey_0rRe&V!TAIT<060n3WdhO3)eSnoxLXzs|sHwlW7^+49xNG(KX*L{)sV~PCRtK zo*ob&a{T4_FZFc2)-%`3q;qHhF6S^Sd~Z32Z!B1=Od<))&&kCg&{j2Jlh@te=_8T? zfKDE;kMG)VnaxWJ?^KE?#zmkFgwD{4LqD*bn;gxAp#Ye}S^b9b>hwwLh~p-WS13Aj zZ`fV7&A8S)G86zyS!2z~EUQoCs0DG9(YSY-sVW~@lr{M@L~?9#^y9$^`7dH^eFS5Hsy6%kD-{TJlG z$iL>w2!1^)Jpf0;g6a7129*I&$k=IQma3X`03P5|t#s&eoJ#i~FA%nCBg=ghXw3T`|9RTBgcex}&nB~8&cRu^X4e@)kZB&W3Yy}rQPE45N1 zA0E4#z>hLS4bY5*87uR{f0PDk{CGXSw~e0-@*$Ey)vUA`(fW`y%U-FKy5`#mE((Z( z%)Skz(2N0^4FZfh^Mo|Wfyir%#^?DUkgok$W+UYKD<{X^mPXktby9!q4ubfvvqVYX z$_t{$I5^)Q+xECLcy(UQI}7nYpZ4U>YojLP&kNjL(&+7#S~>9L!%tpG5DT-y+-??_ znAqgjUK4&r8l_eaG_NGM)P8}yp|LMuB6nG2?7GVRha8mmrAC_E_fBlwK5xl*MiL-* zL(%TCu4lY`vS0Q~-AAj)TI#^$ltxeSXt|D{^`i5;qKY5;N{C6fvIxkT=qK@ZFKPs= zY->Ck4?F%z%~PejXGUsMDToIHFpUQ8GB??wk@d?)msy1fVH6G;jfabeHg^R+Uok-T5w;Fmb<7i@7^J7~xIrO|bsYxQ zO?^B04;B^{IRr6x*kZ0XF|n|)v9K^F8e)otg`ZLQFxT0lAdj5%?3V*@uZbW3BVTLy z-q}r`Z`d}IAPzR>RAaTd)2uY-_rmxHJX&=4_V%X^uiZ9_AihO5EMe-UFToV5Ii<>+ zL%Ooyhbuy*=2vksyyIPsU(~(R@KS4iL|oz+7=_lgBPymA&dR*Pnt+Gpo#?39UA1&S z@#mw@d1q+46o5JGpF-_=)z# zSooy9wQA!lzdyM#))YHR<6r?ooaVRcj=;Q7)%xt^#E78!j()*IqcJd0C5~anrFYx}|Bd(@>fcF9aSp_AMCSv53Ozf%I(eqjS zWlj$elt3M^rpfo6~r&SBtMVP zF{GI8ZaOT3Dm+3t3MDh&m0|S2gO`R)IJlyn~#FaVyTN0SBD--bb+h9@3%riN= zf8)%hBmIi<{4_fry7lMH;g~P^5?Jg|cV>4Tj-C=Xjs1V21f|sEkTRSEn>vAoqa%SK z*#G@!7M6H_yM9;Ju^BjG>LHqbuStYLSBVVan8O;@u!c2c`ZpPazH7UtC2#-$03~!q zSaf7zbY(hYa%Ew3WdJfTF)=MLIV~_ZR539+H8wgkH!UzXIxsMDomiLv001R)MObuX zVRU6WZEs|0W_bWIFflPLFgYzSH&ih(IyE&qF)=MLH##sd$pUF$0000PbVXQnQ*UN; ocVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy07*qoM6N<$g88k~rT_o{ literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_blacklist_calls_off.png b/res/drawable-xxhdpi/ic_blacklist_calls_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0841442d2b7ce6b8cfcf21c7538e69d4d5c704ad GIT binary patch literal 3769 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_blacklist_calls_on.png b/res/drawable-xxhdpi/ic_blacklist_calls_on.png new file mode 100644 index 0000000000000000000000000000000000000000..7f252d33fc0e2687c8cefff2ca1fc977ed9d4cc6 GIT binary patch literal 3606 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%0A>|` z-t-x$bh0P+7UX$DoWfnt01S!fv9Cb3qC{*=SykYS1>J2hANmUP?rqV>cxi!C2Cfmc z4xMcjW$V0FJWAy|iq9S3th}Bo`liFp1Ic)?4#7p1)y^xeZJjgin=i35)47$&-yX3fV~i}w z{`0r)31v))^#(}Z{K{Fh>&6$HSfE~Y(sB|wj_qNberMw2Bv)dAYC#O^)x%L@vmKnkQl3Zy^^bg%I_0F{G7;#66;AOHXW07*qoM6N<$g8z_p=Kufz literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_blacklist_messages_on.png b/res/drawable-xxhdpi/ic_blacklist_messages_on.png new file mode 100644 index 0000000000000000000000000000000000000000..50dd562b16dec5bc408b18b6448f7cd018864997 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_privacy_guard_off.png b/res/drawable-xxhdpi/ic_privacy_guard_off.png new file mode 100644 index 0000000000000000000000000000000000000000..c1964f4a202b0b74a6d1da23e5336bb96cd28867 GIT binary patch literal 1743 zcmV;=1~B=FP)fgvwHFO>lmFfuTFyT-uCz`($8S=Z6U$(4aLz?xi8RKmc( zaDahL4HwUNoooM z0|V3!1_lNOUYGn51^2|vJOv{IRR$`9h{z}f2n!KD2r&dmE-fm92PFf80D}U90fPfW z07D`}J;MTqqYQ5t#Ti`~OBq)%-eVGD3SyeTbb(ozIg)uH^BWdRmJXI%ta_}itoPU~ z*`~35V-IKF&7s86#qotRk@EtVBi9ygP3{FeQan?6g?K0N3G+?km*HP5pd+wD&{gn? zP^!=m;a(9Hk-ehfqF=-&i5rPuk*JWAlRPGsFD)&7LZ(bsUG|n-pS+9wABC-og-Uu# zZwxwoom5>bJwd%!`bP{F7}gra7~7i2n=+feG`nEF z(_)F`1gkphT$?!CKs#4^YX@UT9VazsB^L!(c{c@jWe;^vT`v=F8y|PyV7~z2$~& zn@l!u*=n+F`wpv}`**wUIlC`x|AT`$hkhPuKPG;B#YyW^=guUb{dIoQMeR#RuOwdm zcYV%Hn_GA9)ZbISf8t@@W3eaupJl!fd3o@4{#*HX7d|w7GX4DO>w@p$KLviB`qTQ) z@&A7S4FC@``j+us00002VoOIv0RM-N%)bBt010qNS#tmY3labT3lag+-G2N4000Mc zNliru-3I~|Cn5A&%rgK013XDYK~!ko?V8VO6G0fje-kU74DsYaEX~zRH(mr!+Xtxa zJVBc$s73H>PdyZAbMb2O0#1StknN>lp%70VyCMj^$fDrIy6YjWP0VgGGrN=2lCKbG z!p!{k`!nA+->gWuUQ%KXGzYq2KqM)D<|4gfR!$IU%L_A@O*Zfe*`ci>6QDH71tdK- zSZC?)7ZGh*DwqL~^zhjr-B2NII+L*q0g_92tlNHlqm0Ul6SiFDAP9CnK%MUd;?0fUcyuE>t*L<2O27iBLL!o&m+oW zRwfHtl!m70|M&ea?`KhANWFou$$lU-t9 z0rhC=Kvm8GI39B0<3ujPIo0W#Ea@9-G|W{gGn3ngy@u4{8VE76^qt4?j7}XQT@AN& z$A>0Bf$qcP=nQgjxS}@b=L9|;35KTOqS}@swXq&*%Dv4#RuN-3#jp8$ZUew z{T#=lc*1WU(n!pJvTEwnta3gUodNa6sY<{4c8yXNQ1xAC;zMC}a82@;SnEKgLNlj6 zbX=YVru$In7^r6o6gUR@Xb7Z2$2u}LnOhx&*(d&NppHYJwoP(%siBqykc!4VM^1zF z?8=YU^bIx^NVOeBTEo6TbD^U#J+;X|2YCvS4B5$1!m4Ogy=O+NpN;BgLiA4PG0F<3 zg*Nq8u7DDo5;jdox%_A1?xxX&%`VmqC89Ry&{i4(pk7qCD~)YLuTQL3Luq9a0;QQ;^9nQ?6PWTh}zH zDa)-i$E~zn;%&+$L`YrlUfRJmImmVPhpx#R>Xq(TCqMvllPx?#8Z`62NKn+P78Vtg l!K)Utl= + + + + + + + diff --git a/res/drawable/ic_blacklist_messages.xml b/res/drawable/ic_blacklist_messages.xml new file mode 100644 index 00000000000..f0fafa188c0 --- /dev/null +++ b/res/drawable/ic_blacklist_messages.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/res/layout/blacklist_entry_row.xml b/res/layout/blacklist_entry_row.xml new file mode 100644 index 00000000000..16dc1d2fe18 --- /dev/null +++ b/res/layout/blacklist_entry_row.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/layout/dialog_blacklist_edit_entry.xml b/res/layout/dialog_blacklist_edit_entry.xml new file mode 100644 index 00000000000..30b7c2434fd --- /dev/null +++ b/res/layout/dialog_blacklist_edit_entry.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml index 347c12b838f..39cdb7f3b28 100644 --- a/res/layout/installed_app_details.xml +++ b/res/layout/installed_app_details.xml @@ -62,6 +62,14 @@ android:layout_marginTop="4dip" android:text="@string/app_notifications_switch_label" /> + + + + + + + + + + + diff --git a/res/layout/privacy_guard_manager_list_row.xml b/res/layout/privacy_guard_manager_list_row.xml new file mode 100644 index 00000000000..eb6a327b030 --- /dev/null +++ b/res/layout/privacy_guard_manager_list_row.xml @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/res/menu/blacklist.xml b/res/menu/blacklist.xml new file mode 100644 index 00000000000..a3d294ede61 --- /dev/null +++ b/res/menu/blacklist.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/res/menu/privacy_guard_manager.xml b/res/menu/privacy_guard_manager.xml new file mode 100644 index 00000000000..5e41e46e6bd --- /dev/null +++ b/res/menu/privacy_guard_manager.xml @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/res/values/cm_arrays.xml b/res/values/cm_arrays.xml new file mode 100644 index 00000000000..6d1697ff20b --- /dev/null +++ b/res/values/cm_arrays.xml @@ -0,0 +1,53 @@ + + + + + + + @string/root_access_none + @string/root_access_apps + @string/root_access_adb + @string/root_access_all + + + + 0 + 1 + 2 + 3 + + + + + @string/blacklist_policy_block_calls + @string/blacklist_policy_block_messages + + + + 1 + 16 + + + + @string/blacklist_policy_block_calls + + + + 1 + + + diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml new file mode 100644 index 00000000000..5cac4afcafe --- /dev/null +++ b/res/values/cm_strings.xml @@ -0,0 +1,111 @@ + + + + Lock screen + + Ascending ringtone + + Enable + + Ringing start volume + Notice:\nAs the start volume is set higher than the ringer volume, the ring tone will be played using the ringer volume. + Increase interval + On each ring + 0.5 seconds + 1 second + 2 seconds + 3 seconds + 5 seconds + 10 seconds + + + Widgets + Maximize widgets + Show widgets maximized and the unlock minimized when the screen is turned on + Widget pager + Allow multiple widget pages to be added and selected + + + Safe headset volume + + App security + + + Root access + Allow root access? + Allowing applications to request root access is very dangerous and could compromise the security of your system! + Disabled + Apps only + ADB only + Apps and ADB + + OK + + + Launch Tools + + + App security + + Enable Privacy Guard + Enable Privacy Guard? + When Privacy Guard is enabled, the app will not be able to access personal data such as contacts, messages or call logs. + When enabling Privacy Guard for a built-in app, the app will not be able to access or provide personal data. This may cause other apps to misbehave. + Enabled by default + Enable by default for newly-installed apps + Privacy Guard + Manage which apps have access to your personal data + No apps are installed + No apps with relevant permissions are installed + Help + Reset + In this screen you can choose for which apps Privacy Guard should be active by simply tapping on them. Selected apps will not be able to access your personal data, such as contacts, messages or call logs. Long pressing on an entry opens the app details screen for that app.\n\nBy default built-in apps are not shown. If you want to show them, select the respective option in the menu. + Show built-in apps + Permission filter + Advanced + + + Blacklist + Edit blacklist entry + Settings + Delete + You don\'t have any blacklisted numbers. Add an entry by touching the Add (+) button. + To blacklist calls and/or messages from certain numbers, enable the blacklist. + Disabled + Incoming calls and messages from phone numbers in the blacklist will be blocked + Show notification + Private numbers + Don\'t block calls from private numbers + Block incoming %s from private numbers + Unknown numbers + Don\'t block calls or messages from numbers not in the contact list + Block incoming %s from numbers not in the contact list + calls + messages + calls and messages + Use wildcards + Use . as a wildcard and * for repetition. E.g. 123.* blocks numbers starting with 123 and .*123.* blocks numbers containing 123 + Block incoming calls + Block incoming messages + + + Add number + Remove number + Do you want to remove this blacklist entry? + Select contact + + diff --git a/res/xml/blacklist_prefs.xml b/res/xml/blacklist_prefs.xml new file mode 100644 index 00000000000..54f982f724d --- /dev/null +++ b/res/xml/blacklist_prefs.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/privacy_guard_prefs.xml b/res/xml/privacy_guard_prefs.xml new file mode 100644 index 00000000000..2cc82c15820 --- /dev/null +++ b/res/xml/privacy_guard_prefs.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/res/xml/security_settings_app_cyanogenmod.xml b/res/xml/security_settings_app_cyanogenmod.xml new file mode 100644 index 00000000000..3e08a10f35e --- /dev/null +++ b/res/xml/security_settings_app_cyanogenmod.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 39db5747ed1..66e2c9d2d39 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -43,7 +43,9 @@ import android.telephony.TelephonyManager; import android.util.Log; +import com.android.internal.telephony.util.BlacklistUtils; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.R; import java.util.ArrayList; import java.util.List; @@ -92,6 +94,10 @@ public class SecuritySettings extends RestrictedSettingsFragment private static final String LOCK_NUMPAD_RANDOM = "lock_numpad_random"; private static final String MENU_UNLOCK_PREF = "menu_unlock"; + // CyanogenMod Additions + private static final String KEY_APP_SECURITY_CATEGORY = "app_security"; + private static final String KEY_BLACKLIST = "blacklist"; + private PackageManager mPM; private DevicePolicyManager mDPM; @@ -117,6 +123,9 @@ public class SecuritySettings extends RestrictedSettingsFragment private boolean mIsPrimary; + // CyanogenMod Additions + private PreferenceScreen mBlacklist; + public SecuritySettings() { super(null /* Don't ask for restrictions pin on creation. */); } @@ -148,6 +157,9 @@ private PreferenceScreen createPreferenceHierarchy() { addPreferencesFromResource(R.xml.security_settings); root = getPreferenceScreen(); + // Add package manager to check if features are available + PackageManager pm = getPackageManager(); + // Add options for lock/unlock screen int resid = 0; if (!mLockPatternUtils.isSecure()) { @@ -368,6 +380,18 @@ private PreferenceScreen createPreferenceHierarchy() { } } + // App security settings + addPreferencesFromResource(R.xml.security_settings_app_cyanogenmod); + mBlacklist = (PreferenceScreen) root.findPreference(KEY_BLACKLIST); + // Determine options based on device telephony support + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { + } else { + // No telephony, remove dependent options + PreferenceGroup appCategory = (PreferenceGroup) + root.findPreference(KEY_APP_SECURITY_CATEGORY); + appCategory.removePreference(mBlacklist); + } + mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS); if (mNotificationAccess != null) { final int total = NotificationAccessSettings.getListenersCount(mPM); @@ -562,6 +586,8 @@ public void onResume() { if (mEnableKeyguardWidgets != null) { mEnableKeyguardWidgets.setChecked(lockPatternUtils.getWidgetsEnabled()); } + + updateBlacklistSummary(); } @Override @@ -704,4 +730,14 @@ public void startBiometricWeakImprove(){ intent.setClassName("com.android.facelock", "com.android.facelock.AddToSetup"); startActivity(intent); } + + private void updateBlacklistSummary() { + if (mBlacklist != null) { + if (BlacklistUtils.isBlacklistEnabled(getActivity())) { + mBlacklist.setSummary(R.string.blacklist_summary); + } else { + mBlacklist.setSummary(R.string.blacklist_summary_disabled); + } + } + } } diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 2e49fc201e6..69b679145af 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -34,6 +34,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.nfc.NfcAdapter; import android.os.Bundle; @@ -69,6 +70,7 @@ import com.android.settings.applications.AppOpsSummary; import com.android.settings.applications.ManageApplications; import com.android.settings.applications.ProcessStatsUi; +import com.android.settings.blacklist.BlacklistSettings; import com.android.settings.bluetooth.BluetoothEnabler; import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.deviceinfo.Memory; @@ -352,7 +354,8 @@ public boolean onIsMultiPane() { TrustedCredentialsSettings.class.getName(), PaymentSettings.class.getName(), KeyboardLayoutPickerFragment.class.getName(), - QuietHours.class.getName() + QuietHours.class.getName(), + BlacklistSettings.class.getName() }; @Override @@ -507,6 +510,7 @@ public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args, // uiOptions for fragments also defined as activities in manifest. if (WifiSettings.class.getName().equals(fragmentName) || WifiP2pSettings.class.getName().equals(fragmentName) || + BlacklistSettings.class.getName().equals(fragmentName) || BluetoothSettings.class.getName().equals(fragmentName) || DreamSettings.class.getName().equals(fragmentName) || LocationSettings.class.getName().equals(fragmentName) || @@ -1137,5 +1141,6 @@ public static class TrustedCredentialsSettingsActivity extends Settings { /* emp public static class PaymentSettingsActivity extends Settings { /* empty */ } public static class PrintSettingsActivity extends Settings { /* empty */ } public static class PrintJobSettingsActivity extends Settings { /* empty */ } + public static class BlacklistSettingsActivity extends Settings { /* empty */ } public static class PerformanceSettingsActivity extends Settings { /* empty */ } } diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 0a382b57892..3e5c7098d99 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -23,7 +23,9 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; import android.preference.Preference; @@ -318,4 +320,18 @@ public boolean startFragment( } } + public boolean isPackageInstalled(String packageName) { + if (packageName != null) { + try { + PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0); + if (!pi.applicationInfo.enabled) { + return false; + } + } catch (NameNotFoundException e) { + return false; + } + } + + return true; + } } diff --git a/src/com/android/settings/SubSettings.java b/src/com/android/settings/SubSettings.java index 34e9ba3a707..edc2c0cd7b2 100644 --- a/src/com/android/settings/SubSettings.java +++ b/src/com/android/settings/SubSettings.java @@ -17,7 +17,9 @@ package com.android.settings; import android.app.Fragment; +import android.app.FragmentManager; import android.util.Log; +import android.view.MenuItem; import com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment; @@ -29,7 +31,9 @@ public class SubSettings extends Settings { @Override public boolean onNavigateUp() { - finish(); + if (!popFragment()) { + finish(); + } return true; } @@ -38,4 +42,13 @@ protected boolean isValidFragment(String fragmentName) { Log.d("SubSettings", "Launching fragment " + fragmentName); return true; } + + private boolean popFragment() { + FragmentManager fm = getFragmentManager(); + if (fm.getBackStackEntryCount() > 0) { + fm.popBackStack(); + return true; + } + return false; + } } diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 1127c792795..b646be696b9 100644 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -25,6 +25,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; +import android.app.AppOpsManager; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; @@ -141,8 +142,10 @@ public class InstalledAppDetails extends Fragment private Button mClearDataButton; private Button mMoveAppButton; private CompoundButton mNotificationSwitch; + private CompoundButton mPrivacyGuardSwitch; private PackageMoveObserver mPackageMoveObserver; + private AppOpsManager mAppOps; private final HashSet mHomePackages = new HashSet(); @@ -182,6 +185,7 @@ public class InstalledAppDetails extends Fragment private static final int DLG_DISABLE = DLG_BASE + 7; private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8; private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 9; + private static final int DLG_PRIVACY_GUARD = DLG_BASE + 10; // Menu identifiers public static final int UNINSTALL_ALL_USERS_MENU = 1; @@ -397,6 +401,17 @@ private void initNotificationButton() { } } + private void initPrivacyGuardButton() { + if (mPrivacyGuardSwitch == null) { + return; + } + mAppOps = (AppOpsManager) getActivity().getSystemService(Context.APP_OPS_SERVICE); + boolean isEnabled = mAppOps.getPrivacyGuardSettingForPackage( + mAppEntry.info.uid, mAppEntry.info.packageName); + mPrivacyGuardSwitch.setChecked(isEnabled); + mPrivacyGuardSwitch.setOnCheckedChangeListener(this); + } + /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { @@ -473,6 +488,7 @@ public View onCreateView( mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb); mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch); + mPrivacyGuardSwitch = (CompoundButton) view.findViewById(R.id.privacy_guard_switch); return view; } @@ -874,6 +890,11 @@ private boolean refreshUi() { } } + // only setup the privacy guard setting if we didn't get uninstalled + if (!mMoveInProgress) { + initPrivacyGuardButton(); + } + return true; } @@ -1197,8 +1218,7 @@ public void onClick(DialogInterface dialog, int which) { .setNegativeButton(R.string.dlg_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - // Re-enable the checkbox - getOwner().mNotificationSwitch.setChecked(true); + dialog.cancel(); } }) .create(); @@ -1217,9 +1237,49 @@ public void onClick(DialogInterface dialog, int which) { }) .setNegativeButton(R.string.dlg_cancel, null) .create(); + case DLG_PRIVACY_GUARD: + final int messageResId; + if ((getOwner().mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + messageResId = R.string.privacy_guard_dlg_system_app_text; + } else { + messageResId = R.string.privacy_guard_dlg_text; + } + + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.privacy_guard_dlg_title) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setMessage(messageResId) + .setPositiveButton(R.string.dlg_ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + getOwner().setPrivacyGuard(true); + } + }) + .setNegativeButton(R.string.dlg_cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }) + .create(); } throw new IllegalArgumentException("unknown id " + id); } + + @Override + public void onCancel(DialogInterface dialog) { + int id = getArguments().getInt("id"); + switch (id) { + case DLG_DISABLE_NOTIFICATIONS: + // Re-enable the checkbox + getOwner().mNotificationSwitch.setChecked(true); + break; + case DLG_PRIVACY_GUARD: + // Re-enable the checkbox + getOwner().mPrivacyGuardSwitch.setChecked(false); + break; + } + } } private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { @@ -1306,6 +1366,11 @@ private void setNotificationsEnabled(boolean enabled) { } } + private void setPrivacyGuard(boolean enabled) { + mAppOps.setPrivacyGuardSettingForPackage( + mAppEntry.info.uid, mAppEntry.info.packageName, enabled); + } + private int getPremiumSmsPermission(String packageName) { try { if (mSmsManager != null) { @@ -1403,6 +1468,12 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { } else { setNotificationsEnabled(true); } + } else if (buttonView == mPrivacyGuardSwitch) { + if (isChecked) { + showDialogInner(DLG_PRIVACY_GUARD, 0); + } else { + setPrivacyGuard(false); + } } } } diff --git a/src/com/android/settings/blacklist/BlacklistSettings.java b/src/com/android/settings/blacklist/BlacklistSettings.java new file mode 100644 index 00000000000..c30d410e1aa --- /dev/null +++ b/src/com/android/settings/blacklist/BlacklistSettings.java @@ -0,0 +1,385 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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.blacklist; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.FragmentTransaction; +import android.app.ListFragment; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.location.CountryDetector; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Process; +import android.provider.ContactsContract.PhoneLookup; +import android.provider.Settings; +import android.provider.Telephony.Blacklist; +import android.telephony.PhoneNumberUtils; +import android.text.TextUtils; +import android.util.SparseArray; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.ResourceCursorAdapter; +import android.widget.Switch; +import android.widget.TextView; + +import com.android.internal.telephony.util.BlacklistUtils; +import com.android.settings.R; + +import java.util.HashMap; + +/** + * Blacklist settings UI for the Phone app. + */ +public class BlacklistSettings extends ListFragment + implements CompoundButton.OnCheckedChangeListener { + + private static final String[] BLACKLIST_PROJECTION = { + Blacklist._ID, + Blacklist.NUMBER, + Blacklist.PHONE_MODE, + Blacklist.MESSAGE_MODE + }; + private static final int COLUMN_ID = 0; + private static final int COLUMN_NUMBER = 1; + private static final int COLUMN_PHONE = 2; + private static final int COLUMN_MESSAGE = 3; + + private Switch mEnabledSwitch; + private boolean mLastEnabledState; + + private BlacklistAdapter mAdapter; + private Cursor mCursor; + private TextView mEmptyView; + + @Override + public View onCreateView(LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(com.android.internal.R.layout.preference_list_fragment, + container, false); + } + + @Override + public void onActivityCreated(Bundle icicle) { + super.onActivityCreated(icicle); + + setHasOptionsMenu(true); + + final Activity activity = getActivity(); + mEnabledSwitch = new Switch(activity); + + final int padding = activity.getResources().getDimensionPixelSize( + R.dimen.action_bar_switch_padding); + mEnabledSwitch.setPaddingRelative(0, 0, padding, 0); + mEnabledSwitch.setOnCheckedChangeListener(this); + + mCursor = getActivity().managedQuery(Blacklist.CONTENT_URI, + BLACKLIST_PROJECTION, null, null, null); + mAdapter = new BlacklistAdapter(getActivity(), null); + + mEmptyView = (TextView) getView().findViewById(android.R.id.empty); + + final ListView listView = getListView(); + listView.setAdapter(mAdapter); + listView.setEmptyView(mEmptyView); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.blacklist, menu); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + menu.findItem(R.id.blacklist_add).setEnabled(mLastEnabledState); + menu.findItem(R.id.blacklist_prefs).setEnabled(mLastEnabledState); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.blacklist_add: + showEntryEditDialog(-1); + return true; + case R.id.blacklist_prefs: + PreferenceFragment prefs = new PreferenceFragment(); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + ft.replace(android.R.id.content, prefs); + ft.hide(this); + ft.addToBackStack(null); + ft.commitAllowingStateLoss(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onStart() { + super.onStart(); + final Activity activity = getActivity(); + activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, + ActionBar.DISPLAY_SHOW_CUSTOM); + activity.getActionBar().setCustomView(mEnabledSwitch, new ActionBar.LayoutParams( + ActionBar.LayoutParams.WRAP_CONTENT, + ActionBar.LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL | Gravity.END)); + } + + @Override + public void onStop() { + super.onStop(); + final Activity activity = getActivity(); + activity.getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM); + activity.getActionBar().setCustomView(null); + } + + @Override + public void onResume() { + super.onResume(); + + final Context context = getActivity(); + mLastEnabledState = BlacklistUtils.isBlacklistEnabled(context); + mEnabledSwitch.setChecked(mLastEnabledState); + updateEnabledState(); + } + + @Override + public void onListItemClick(ListView l, View v, int position, long id) { + showEntryEditDialog(id); + } + + private void showEntryEditDialog(long id) { + EntryEditDialogFragment fragment = EntryEditDialogFragment.newInstance(id); + fragment.show(getFragmentManager(), "blacklist_edit"); + } + + private void updateEnabledState() { + getListView().setEnabled(mLastEnabledState); + getActivity().invalidateOptionsMenu(); + + mEmptyView.setText(mLastEnabledState + ? R.string.blacklist_empty_text + : R.string.blacklist_disabled_empty_text); + mAdapter.swapCursor(mLastEnabledState ? mCursor : null); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (buttonView == mEnabledSwitch && isChecked != mLastEnabledState) { + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.PHONE_BLACKLIST_ENABLED, isChecked ? 1 : 0); + mLastEnabledState = isChecked; + updateEnabledState(); + } + } + + private static class BlacklistAdapter extends ResourceCursorAdapter + implements ToggleImageView.OnCheckedChangeListener { + private Object mLock = new Object(); + private ContentResolver mResolver; + private String mCurrentCountryIso; + private SparseArray mRequestedLookups = new SparseArray(); + private HashMap mContactNameCache = new HashMap(); + + private Handler mMainHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + int lookupIndex = msg.arg1; + String name = (String) msg.obj; + mContactNameCache.put(mRequestedLookups.get(lookupIndex), + name == null ? "" : name); + mRequestedLookups.delete(lookupIndex); + notifyDataSetChanged(); + } + }; + private Handler mQueryHandler; + + private class QueryHandler extends Handler { + public static final int MSG_LOOKUP = 1; + private static final int MSG_FINISH = 2; + + public QueryHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_LOOKUP: + String name = lookupNameForNumber((String) msg.obj); + mMainHandler.obtainMessage(0, msg.arg1, 0, name).sendToTarget(); + synchronized (mLock) { + if (mQueryHandler != null) { + Message finishMessage = mQueryHandler.obtainMessage(MSG_FINISH); + mQueryHandler.sendMessageDelayed(finishMessage, 3000); + } + } + break; + case MSG_FINISH: + synchronized (mLock) { + if (mQueryHandler != null) { + mQueryHandler.getLooper().quit(); + mQueryHandler = null; + } + } + break; + } + } + + private String lookupNameForNumber(String number) { + if (!TextUtils.isEmpty(mCurrentCountryIso)) { + // Normalise the number: this is needed because the PhoneLookup query + // below does not accept a country code as an input. + String numberE164 = PhoneNumberUtils.formatNumberToE164(number, + mCurrentCountryIso); + if (!TextUtils.isEmpty(numberE164)) { + // Only use it if the number could be formatted to E164. + number = numberE164; + } + } + + String result = null; + final String[] projection = new String[] { PhoneLookup.DISPLAY_NAME }; + Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); + Cursor cursor = mResolver.query(uri, projection, null, null, null); + if (cursor != null) { + if (cursor.moveToFirst()) { + result = cursor.getString(0); + } + cursor.close(); + } + + return result; + } + } + + public BlacklistAdapter(Context context, Cursor cursor) { + super(context, R.layout.blacklist_entry_row, cursor); + + final CountryDetector detector = + (CountryDetector) context.getSystemService(Context.COUNTRY_DETECTOR); + mCurrentCountryIso = detector.detectCountry().getCountryIso(); + mResolver = context.getContentResolver(); + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + View view = super.newView(context, cursor, parent); + + ViewHolder holder = new ViewHolder(); + holder.mainText = (TextView) view.findViewById(R.id.number); + holder.subText = (TextView) view.findViewById(R.id.name); + holder.callStatus = (ToggleImageView) view.findViewById(R.id.block_calls); + holder.messageStatus = (ToggleImageView) view.findViewById(R.id.block_messages); + + holder.callStatus.setTag(Blacklist.PHONE_MODE); + holder.callStatus.setOnCheckedChangeListener(this); + + holder.messageStatus.setTag(Blacklist.MESSAGE_MODE); + holder.messageStatus.setOnCheckedChangeListener(this); + + view.setTag(holder); + + return view; + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + ViewHolder holder = (ViewHolder) view.getTag(); + String number = cursor.getString(COLUMN_NUMBER); + String name = mContactNameCache.get(number); + String formattedNumber = PhoneNumberUtils.formatNumber(number, + null, mCurrentCountryIso); + + if (TextUtils.isEmpty(name)) { + holder.mainText.setText(formattedNumber); + holder.subText.setVisibility(View.GONE); + } else { + holder.mainText.setText(name); + holder.subText.setText(formattedNumber); + holder.subText.setVisibility(View.VISIBLE); + } + + if (name == null) { + int id = cursor.getInt(COLUMN_ID); + scheduleNameLookup(id, number); + } + + holder.callStatus.setCheckedInternal(cursor.getInt(COLUMN_PHONE) != 0, false); + holder.messageStatus.setCheckedInternal(cursor.getInt(COLUMN_MESSAGE) != 0, false); + holder.position = cursor.getPosition(); + } + + @Override + public void onCheckedChanged(ToggleImageView view, boolean isChecked) { + View parent = (View) view.getParent(); + ViewHolder holder = (ViewHolder) parent.getTag(); + String column = (String) view.getTag(); + long id = getItemId(holder.position); + Uri uri = ContentUris.withAppendedId(Blacklist.CONTENT_URI, id); + ContentValues cv = new ContentValues(); + + cv.put(column, view.isChecked() ? 1 : 0); + if (mResolver.update(uri, cv, null, null) <= 0) { + // something went wrong, force an update to the correct state + notifyDataSetChanged(); + } + } + + private void scheduleNameLookup(int id, String number) { + synchronized (mLock) { + if (mQueryHandler == null) { + HandlerThread thread = new HandlerThread("blacklist_contact_query", + Process.THREAD_PRIORITY_BACKGROUND); + thread.start(); + mQueryHandler = new QueryHandler(thread.getLooper()); + } + } + + mRequestedLookups.put(id, number); + Message msg = mQueryHandler.obtainMessage(QueryHandler.MSG_LOOKUP, id, 0, number); + msg.sendToTarget(); + } + + private static class ViewHolder { + TextView mainText; + TextView subText; + ToggleImageView callStatus; + ToggleImageView messageStatus; + int position; + } + } +} diff --git a/src/com/android/settings/blacklist/EntryEditDialogFragment.java b/src/com/android/settings/blacklist/EntryEditDialogFragment.java new file mode 100644 index 00000000000..95d2dd5227b --- /dev/null +++ b/src/com/android/settings/blacklist/EntryEditDialogFragment.java @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2008 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.blacklist; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.provider.ContactsContract.CommonDataKinds; +import android.provider.Telephony.Blacklist; +import android.text.Editable; +import android.text.TextWatcher; +import android.text.method.ArrowKeyMovementMethod; +import android.text.method.DialerKeyListener; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageButton; + +import com.android.internal.telephony.util.BlacklistUtils; +import com.android.settings.R; + +public class EntryEditDialogFragment extends DialogFragment + implements TextWatcher, DialogInterface.OnClickListener { + + private EditText mEditText; + private ImageButton mContactPickButton; + private CheckBox mBlockCalls; + private CheckBox mBlockMessages; + private Button mOkButton; + + private static final String[] BLACKLIST_PROJECTION = { + Blacklist.NUMBER, Blacklist.PHONE_MODE, Blacklist.MESSAGE_MODE + }; + private static final String[] NUMBER_PROJECTION = { + CommonDataKinds.Phone.NUMBER + }; + private static final int COLUMN_NUMBER = 0; + private static final int COLUMN_PHONE = 1; + private static final int COLUMN_MESSAGE = 2; + + private static final int REQUEST_CODE_PICKER = 1; + + private static final String DIALOG_STATE = "blacklist_edit_state"; + private static final String STATE_NUMBER = "number"; + private static final String STATE_PHONE = "phone"; + private static final String STATE_MESSAGE = "message"; + + public static EntryEditDialogFragment newInstance(long id) { + Bundle args = new Bundle(); + args.putLong("id", id); + + EntryEditDialogFragment fragment = new EntryEditDialogFragment(); + fragment.setArguments(args); + return fragment; + } + + public EntryEditDialogFragment() { + super(); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + long id = getEntryId(); + Bundle dialogState = savedInstanceState != null + ? savedInstanceState.getBundle(DIALOG_STATE) : null; + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.blacklist_edit_dialog_title) + .setPositiveButton(android.R.string.ok, this) + .setNegativeButton(android.R.string.cancel, null) + .setView(createDialogView(id, dialogState)); + + if (id >= 0) { + builder.setNeutralButton(R.string.blacklist_button_delete, this); + } + + return builder.create(); + } + + @Override + public void onStart() { + super.onStart(); + + AlertDialog dialog = (AlertDialog) getDialog(); + Button neutralButton = dialog.getButton(DialogInterface.BUTTON_NEUTRAL); + neutralButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EntryEditDialogFragment parent = EntryEditDialogFragment.this; + DialogFragment confirm = DeleteConfirmationFragment.newInstance(parent); + confirm.show(getFragmentManager(), "delete_confirm"); + } + }); + + updateOkButtonState(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + updateBlacklistEntry(); + } + } + + private void onDeleteConfirmResult(boolean confirmed) { + if (confirmed) { + Uri uri = ContentUris.withAppendedId(Blacklist.CONTENT_URI, getEntryId()); + getActivity().getContentResolver().delete(uri, null, null); + dismiss(); + } + } + + private long getEntryId() { + return getArguments().getLong("id", -1); + } + + private View createDialogView(long id, Bundle savedState) { + final Activity activity = getActivity(); + final LayoutInflater inflater = (LayoutInflater) + activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View view = inflater.inflate(R.layout.dialog_blacklist_edit_entry, null); + + mEditText = (EditText) view.findViewById(R.id.number_edit); + mEditText.setMovementMethod(ArrowKeyMovementMethod.getInstance()); + mEditText.setKeyListener(DialerKeyListener.getInstance()); + mEditText.addTextChangedListener(this); + + mContactPickButton = (ImageButton) view.findViewById(R.id.select_contact); + mContactPickButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent contactListIntent = new Intent(Intent.ACTION_GET_CONTENT); + contactListIntent.setType(CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + + startActivityForResult(contactListIntent, REQUEST_CODE_PICKER, null); + } + }); + + mBlockCalls = (CheckBox) view.findViewById(R.id.incoming_calls); + mBlockMessages = (CheckBox) view.findViewById(R.id.incoming_messages); + + if (savedState != null) { + mEditText.setText(savedState.getCharSequence(STATE_NUMBER)); + mBlockCalls.setChecked(savedState.getBoolean(STATE_PHONE)); + mBlockMessages.setChecked(savedState.getBoolean(STATE_MESSAGE)); + } else if (id >= 0) { + Uri uri = ContentUris.withAppendedId(Blacklist.CONTENT_URI, id); + Cursor cursor = activity.getContentResolver().query(uri, + BLACKLIST_PROJECTION, null, null, null); + if (cursor != null && cursor.moveToFirst()) { + mEditText.setText(cursor.getString(COLUMN_NUMBER)); + mBlockCalls.setChecked(cursor.getInt(COLUMN_PHONE) != 0); + mBlockMessages.setChecked(cursor.getInt(COLUMN_MESSAGE) != 0); + } else { + id = -1; + } + if (cursor != null) { + cursor.close(); + } + } + + if (id < 0) { + // defaults + mEditText.setText(""); + mBlockCalls.setChecked(true); + mBlockMessages.setChecked(true); + } + + return view; + } + + private void updateBlacklistEntry() { + ContentValues cv = new ContentValues(); + String number = mEditText.getText().toString(); + + cv.put(Blacklist.NUMBER, number); + cv.put(Blacklist.PHONE_MODE, mBlockCalls.isChecked() ? 1 : 0); + cv.put(Blacklist.MESSAGE_MODE, mBlockMessages.isChecked() ? 1 : 0); + + long id = getEntryId(); + Uri uri; + + if (id < 0) { + uri = Blacklist.CONTENT_FILTER_BYNUMBER_URI.buildUpon() + .appendPath(number) + .build(); + } else { + uri = ContentUris.withAppendedId(Blacklist.CONTENT_URI, id); + } + getActivity().getContentResolver().update(uri, cv, null, null); + } + + private void updateOkButtonState() { + if (mOkButton == null) { + AlertDialog dialog = (AlertDialog) getDialog(); + if (dialog != null) { + mOkButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + } + } + + if (mOkButton != null) { + mOkButton.setEnabled(mEditText.getText().length() != 0); + } + } + + @Override + public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); + + Bundle dialogState = new Bundle(); + dialogState.putCharSequence(STATE_NUMBER, mEditText.getText()); + dialogState.putBoolean(STATE_PHONE, mBlockCalls.isChecked()); + dialogState.putBoolean(STATE_MESSAGE, mBlockMessages.isChecked()); + state.putBundle(DIALOG_STATE, dialogState); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + updateOkButtonState(); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode != REQUEST_CODE_PICKER) { + super.onActivityResult(requestCode, resultCode, data); + return; + } + + if (resultCode == Activity.RESULT_OK) { + Cursor cursor = getActivity().getContentResolver().query(data.getData(), + NUMBER_PROJECTION, null, null, null); + if (cursor != null) { + if (cursor.moveToFirst()) { + mEditText.setText(cursor.getString(COLUMN_NUMBER)); + } + cursor.close(); + } + } + } + + private static class DeleteConfirmationFragment extends DialogFragment + implements DialogInterface.OnClickListener { + public static DialogFragment newInstance(EntryEditDialogFragment parent) { + DialogFragment fragment = new DeleteConfirmationFragment(); + fragment.setTargetFragment(parent, 0); + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog dialog = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.remove_blacklist_number_title) + .setMessage(R.string.remove_blacklist_entry) + .setPositiveButton(R.string.yes, this) + .setNegativeButton(R.string.no, this) + .create(); + + return dialog; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + EntryEditDialogFragment parent = (EntryEditDialogFragment) getTargetFragment(); + parent.onDeleteConfirmResult(which == DialogInterface.BUTTON_POSITIVE); + } + } +} diff --git a/src/com/android/settings/blacklist/PreferenceFragment.java b/src/com/android/settings/blacklist/PreferenceFragment.java new file mode 100644 index 00000000000..b8ecddd1810 --- /dev/null +++ b/src/com/android/settings/blacklist/PreferenceFragment.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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.blacklist; + +import android.content.Context; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.provider.Settings; + +import com.android.internal.telephony.util.BlacklistUtils; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import java.util.HashSet; +import java.util.Set; + +public class PreferenceFragment extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener { + + private static final String BUTTON_BLACKLIST_PRIVATE = "button_blacklist_private_numbers"; + private static final String BUTTON_BLACKLIST_UNKNOWN = "button_blacklist_unknown_numbers"; + + private MultiSelectListPreference mBlacklistPrivate; + private MultiSelectListPreference mBlacklistUnknown; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + addPreferencesFromResource(R.xml.blacklist_prefs); + + PreferenceScreen prefSet = getPreferenceScreen(); + mBlacklistPrivate = + (MultiSelectListPreference) prefSet.findPreference(BUTTON_BLACKLIST_PRIVATE); + mBlacklistPrivate.setOnPreferenceChangeListener(this); + mBlacklistUnknown = + (MultiSelectListPreference) prefSet.findPreference(BUTTON_BLACKLIST_UNKNOWN); + mBlacklistUnknown.setOnPreferenceChangeListener(this); + } + + @Override + public void onResume() { + super.onResume(); + + final Context context = getActivity(); + updateSelectListFromPolicy(mBlacklistPrivate, + Settings.System.PHONE_BLACKLIST_PRIVATE_NUMBER_MODE); + updateSelectListSummary(mBlacklistPrivate, mBlacklistPrivate.getValues(), + R.string.blacklist_private_numbers_summary, + R.string.blacklist_private_numbers_summary_disabled); + updateSelectListFromPolicy(mBlacklistUnknown, + Settings.System.PHONE_BLACKLIST_UNKNOWN_NUMBER_MODE); + updateSelectListSummary(mBlacklistUnknown, mBlacklistUnknown.getValues(), + R.string.blacklist_unknown_numbers_summary, + R.string.blacklist_unknown_numbers_summary_disabled); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object objValue) { + if (preference == mBlacklistUnknown) { + Set newValues = (Set) objValue; + updatePolicyFromSelectList(newValues, + Settings.System.PHONE_BLACKLIST_UNKNOWN_NUMBER_MODE); + updateSelectListSummary(mBlacklistUnknown, newValues, + R.string.blacklist_unknown_numbers_summary, + R.string.blacklist_unknown_numbers_summary_disabled); + } else if (preference == mBlacklistPrivate) { + Set newValues = (Set) objValue; + updatePolicyFromSelectList(newValues, + Settings.System.PHONE_BLACKLIST_PRIVATE_NUMBER_MODE); + updateSelectListSummary(mBlacklistPrivate, newValues, + R.string.blacklist_private_numbers_summary, + R.string.blacklist_private_numbers_summary_disabled); + } + + return true; + } + + private void updateSelectListFromPolicy(MultiSelectListPreference pref, String setting) { + int mode = Settings.System.getInt(getContentResolver(), setting, 0); + Set values = new HashSet(); + + if ((mode & BlacklistUtils.BLOCK_CALLS) != 0) { + values.add(Integer.toString(BlacklistUtils.BLOCK_CALLS)); + } + if ((mode & BlacklistUtils.BLOCK_MESSAGES) != 0) { + values.add(Integer.toString(BlacklistUtils.BLOCK_MESSAGES)); + } + pref.setValues(values); + } + + private int getPolicyFromSelectList(Set values) { + int mode = 0; + + for (String value : values) { + mode |= Integer.parseInt(value); + } + + return mode; + } + + private void updatePolicyFromSelectList(Set values, String setting) { + int mode = getPolicyFromSelectList(values); + Settings.System.putInt(getContentResolver(), setting, mode); + } + + private void updateSelectListSummary(MultiSelectListPreference pref, + Set values, int summaryResId, int disabledSummaryResId) { + int mode = getPolicyFromSelectList(values); + int typeResId; + + if (mode == 0) { + pref.setSummary(getString(disabledSummaryResId)); + return; + } + + if (mode == BlacklistUtils.BLOCK_CALLS) { + typeResId = R.string.blacklist_summary_type_calls_only; + } else if (mode == BlacklistUtils.BLOCK_MESSAGES) { + typeResId = R.string.blacklist_summary_type_messages_only; + } else { + typeResId = R.string.blacklist_summary_type_calls_and_messages; + } + + pref.setSummary(getString(summaryResId, getString(typeResId))); + } +} diff --git a/src/com/android/settings/blacklist/ToggleImageView.java b/src/com/android/settings/blacklist/ToggleImageView.java new file mode 100644 index 00000000000..3091c521ca3 --- /dev/null +++ b/src/com/android/settings/blacklist/ToggleImageView.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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.blacklist; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.Checkable; +import android.widget.CompoundButton; +import android.widget.ImageView; + +public class ToggleImageView extends ImageView implements Checkable { + public static interface OnCheckedChangeListener { + void onCheckedChanged(ToggleImageView view, boolean isChecked); + } + + private static final int[] CHECKED_STATE_SET = { + com.android.internal.R.attr.state_checked + }; + + private boolean mIsChecked = false; + private OnCheckedChangeListener mOnCheckedChangeListener; + + public ToggleImageView(Context context) { + super(context); + } + + public ToggleImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ToggleImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.CompoundButton, defStyle, 0); + boolean checked = a.getBoolean( + com.android.internal.R.styleable.CompoundButton_checked, false); + setChecked(checked); + a.recycle(); + } + + @Override + public boolean performClick() { + /* When clicked, toggle the state */ + toggle(); + return super.performClick(); + } + + @Override + public void setChecked(boolean checked) { + setCheckedInternal(checked, true); + } + + @Override + public boolean isChecked() { + return mIsChecked; + } + + @Override + public void toggle() { + setChecked(!mIsChecked); + } + + public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { + mOnCheckedChangeListener = listener; + } + + /* package */ void setCheckedInternal(boolean checked, boolean callListener) { + if (mIsChecked != checked) { + mIsChecked = checked; + setImageState(checked ? CHECKED_STATE_SET : null, true); + if (callListener && mOnCheckedChangeListener != null) { + mOnCheckedChangeListener.onCheckedChanged(this, mIsChecked); + } + } + } +} diff --git a/src/com/android/settings/cyanogenmod/SystemSettingCheckBoxPreference.java b/src/com/android/settings/cyanogenmod/SystemSettingCheckBoxPreference.java new file mode 100644 index 00000000000..ab0790abe57 --- /dev/null +++ b/src/com/android/settings/cyanogenmod/SystemSettingCheckBoxPreference.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2013 The CyanogenMod 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.cyanogenmod; + +import android.content.Context; +import android.preference.CheckBoxPreference; +import android.provider.Settings; +import android.util.AttributeSet; + +public class SystemSettingCheckBoxPreference extends CheckBoxPreference { + public SystemSettingCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public SystemSettingCheckBoxPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SystemSettingCheckBoxPreference(Context context) { + super(context, null); + } + + @Override + protected boolean persistBoolean(boolean value) { + if (shouldPersist()) { + if (value == getPersistedBoolean(!value)) { + // It's already there, so the same as persisting + return true; + } + + Settings.System.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0); + return true; + } + return false; + } + + @Override + protected boolean getPersistedBoolean(boolean defaultReturnValue) { + if (!shouldPersist()) { + return defaultReturnValue; + } + + return Settings.System.getInt(getContext().getContentResolver(), + getKey(), defaultReturnValue ? 1 : 0) != 0; + } + + + protected boolean isPersisted() { + // Using getString instead of getInt so we can simply check for null + // instead of catching an exception. (All values are stored as strings.) + return Settings.System.getString(getContext().getContentResolver(), getKey()) != null; + } +} diff --git a/src/com/android/settings/privacyguard/PrivacyGuardAppListAdapter.java b/src/com/android/settings/privacyguard/PrivacyGuardAppListAdapter.java new file mode 100644 index 00000000000..1f84952db5d --- /dev/null +++ b/src/com/android/settings/privacyguard/PrivacyGuardAppListAdapter.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2013 SlimRoms 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.privacyguard; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.SectionIndexer; +import android.widget.TextView; + +import com.android.settings.R; +import com.android.settings.privacyguard.PrivacyGuardManager.AppInfo; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +public class PrivacyGuardAppListAdapter extends BaseAdapter implements SectionIndexer { + + private LayoutInflater mInflater; + private PackageManager mPm; + + private List mApps; + private String[] mSections; + private int[] mPositions; + private ConcurrentHashMap mIcons; + private Drawable mDefaultImg; + + private Context mContext; + + //constructor + public PrivacyGuardAppListAdapter(Context context, List apps, + List sections, List positions) { + mContext = context; + mInflater = LayoutInflater.from(mContext); + mPm = context.getPackageManager(); + + mApps = apps; + mSections = sections.toArray(new String[sections.size()]); + mPositions = new int[positions.size()]; + for (int i = 0; i < positions.size(); i++) { + mPositions[i] = positions.get(i); + } + + // set the default icon till the actual app icon is loaded in async task + mDefaultImg = mContext.getResources().getDrawable(android.R.mipmap.sym_def_app_icon); + mIcons = new ConcurrentHashMap(); + + new LoadIconsTask().execute(apps.toArray(new PrivacyGuardManager.AppInfo[]{})); + } + + @Override + public int getCount() { + return mApps.size(); + } + + @Override + public Object getItem(int position) { + return mApps.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + PrivacyGuardAppViewHolder appHolder; + + if (convertView == null) { + convertView = mInflater.inflate(R.layout.privacy_guard_manager_list_row, null); + + // creates a ViewHolder and children references + appHolder = new PrivacyGuardAppViewHolder(); + appHolder.title = (TextView) convertView.findViewById(R.id.app_title); + appHolder.icon = (ImageView) convertView.findViewById(R.id.app_icon); + appHolder.privacyGuardIcon = (ImageView) convertView.findViewById(R.id.app_privacy_guard_icon); + convertView.setTag(appHolder); + } else { + appHolder = (PrivacyGuardAppViewHolder) convertView.getTag(); + } + + PrivacyGuardManager.AppInfo app = mApps.get(position); + + appHolder.title.setText(app.title); + + Drawable icon = mIcons.get(app.packageName); + appHolder.icon.setImageDrawable(icon != null ? icon : mDefaultImg); + + int privacyGuardDrawableResId = app.privacyGuardEnabled + ? R.drawable.ic_privacy_guard : R.drawable.ic_privacy_guard_off; + appHolder.privacyGuardIcon.setImageResource(privacyGuardDrawableResId); + + return convertView; + } + + @Override + public int getPositionForSection(int section) { + if (section < 0 || section >= mSections.length) { + return -1; + } + + return mPositions[section]; + } + + @Override + public int getSectionForPosition(int position) { + if (position < 0 || position >= getCount()) { + return -1; + } + + int index = Arrays.binarySearch(mPositions, position); + + /* + * Consider this example: section positions are 0, 3, 5; the supplied + * position is 4. The section corresponding to position 4 starts at + * position 3, so the expected return value is 1. Binary search will not + * find 4 in the array and thus will return -insertPosition-1, i.e. -3. + * To get from that number to the expected value of 1 we need to negate + * and subtract 2. + */ + return index >= 0 ? index : -index - 2; + } + + @Override + public Object[] getSections() { + return mSections; + } + + /** + * An asynchronous task to load the icons of the installed applications. + */ + private class LoadIconsTask extends AsyncTask { + @Override + protected Void doInBackground(PrivacyGuardManager.AppInfo... apps) { + for (PrivacyGuardManager.AppInfo app : apps) { + try { + Drawable icon = mPm.getApplicationIcon(app.packageName); + mIcons.put(app.packageName, icon); + publishProgress(); + } catch (PackageManager.NameNotFoundException e) { + // ignored; app will show up with default image + } + } + + return null; + } + + @Override + protected void onProgressUpdate(Void... progress) { + notifyDataSetChanged(); + } + } + + /** + * App view holder used to reuse the views inside the list. + */ + public static class PrivacyGuardAppViewHolder { + TextView title; + ImageView icon; + ImageView privacyGuardIcon; + } +} diff --git a/src/com/android/settings/privacyguard/PrivacyGuardManager.java b/src/com/android/settings/privacyguard/PrivacyGuardManager.java new file mode 100644 index 00000000000..08fbbacadaa --- /dev/null +++ b/src/com/android/settings/privacyguard/PrivacyGuardManager.java @@ -0,0 +1,396 @@ +/* + * Copyright (C) 2013 SlimRoms 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.privacyguard; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AppOpsManager; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; +import android.app.FragmentManager; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.ListView; +import android.widget.TextView; + +import com.android.settings.R; +import com.android.settings.Settings.AppOpsSummaryActivity; +import com.android.settings.applications.AppOpsDetails; +import com.android.settings.applications.AppOpsState; +import com.android.settings.applications.AppOpsState.OpsTemplate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class PrivacyGuardManager extends Fragment + implements OnItemClickListener, OnItemLongClickListener { + + private static final String TAG = "PrivacyGuardManager"; + + private TextView mNoUserAppsInstalled; + private ListView mAppsList; + private PrivacyGuardAppListAdapter mAdapter; + private List mApps; + + private PackageManager mPm; + private Activity mActivity; + + private SharedPreferences mPreferences; + private AppOpsManager mAppOps; + + private int mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION; + private int mSavedFirstItemOffset; + + // keys for extras and icicles + private final static String LAST_LIST_POS = "last_list_pos"; + private final static String LAST_LIST_OFFSET = "last_list_offset"; + + // holder for package data passed into the adapter + public static final class AppInfo { + String title; + String packageName; + boolean enabled; + boolean privacyGuardEnabled; + int uid; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + mActivity = getActivity(); + mPm = mActivity.getPackageManager(); + mAppOps = (AppOpsManager)getActivity().getSystemService(Context.APP_OPS_SERVICE); + + return inflater.inflate(R.layout.privacy_guard_manager, container, false); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + FragmentManager fm = getFragmentManager(); + Fragment f = fm.findFragmentById(R.id.privacy_guard_prefs); + if (f != null && !fm.isDestroyed()) { + fm.beginTransaction().remove(f).commit(); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + mNoUserAppsInstalled = (TextView) mActivity.findViewById(R.id.error); + + mAppsList = (ListView) mActivity.findViewById(R.id.apps_list); + mAppsList.setOnItemClickListener(this); + mAppsList.setOnItemLongClickListener(this); + + // get shared preference + mPreferences = mActivity.getSharedPreferences("privacy_guard_manager", Activity.MODE_PRIVATE); + if (!mPreferences.getBoolean("first_help_shown", false)) { + showHelp(); + } + + if (savedInstanceState != null) { + mSavedFirstVisiblePosition = savedInstanceState.getInt(LAST_LIST_POS, + AdapterView.INVALID_POSITION); + mSavedFirstItemOffset = savedInstanceState.getInt(LAST_LIST_OFFSET, 0); + } else { + mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION; + mSavedFirstItemOffset = 0; + } + + // load apps and construct the list + loadApps(); + + setHasOptionsMenu(true); + } + + @Override + public void onViewStateRestored(Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putInt(LAST_LIST_POS, mSavedFirstVisiblePosition); + outState.putInt(LAST_LIST_OFFSET, mSavedFirstItemOffset); + } + + @Override + public void onPause() { + super.onPause(); + + // Remember where the list is scrolled to so we can restore the scroll position + // when we come back to this activity and *after* we complete querying for the + // conversations. + mSavedFirstVisiblePosition = mAppsList.getFirstVisiblePosition(); + View firstChild = mAppsList.getChildAt(0); + mSavedFirstItemOffset = (firstChild == null) ? 0 : firstChild.getTop(); + } + + @Override + public void onResume() { + super.onResume(); + + // rebuild the list; the user might have changed settings inbetween + loadApps(); + + if (mSavedFirstVisiblePosition != AdapterView.INVALID_POSITION) { + mAppsList.setSelectionFromTop(mSavedFirstVisiblePosition, mSavedFirstItemOffset); + mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION; + } + } + + private void loadApps() { + mApps = loadInstalledApps(); + + // if app list is empty inform the user + // else go ahead and construct the list + if (mApps == null || mApps.isEmpty()) { + mNoUserAppsInstalled.setText(R.string.privacy_guard_no_user_apps); + mNoUserAppsInstalled.setVisibility(View.VISIBLE); + mAppsList.setVisibility(View.GONE); + mAppsList.setAdapter(null); + } else { + mNoUserAppsInstalled.setVisibility(View.GONE); + mAppsList.setVisibility(View.VISIBLE); + mAdapter = createAdapter(); + mAppsList.setAdapter(mAdapter); + mAppsList.setFastScrollEnabled(true); + } + } + + private PrivacyGuardAppListAdapter createAdapter() { + String lastSectionIndex = null; + ArrayList sections = new ArrayList(); + ArrayList positions = new ArrayList(); + int count = mApps.size(), offset = 0; + + for (int i = 0; i < count; i++) { + AppInfo app = mApps.get(i); + String sectionIndex; + + if (!app.enabled) { + sectionIndex = "--"; //XXX + } else if (app.title.isEmpty()) { + sectionIndex = ""; + } else { + sectionIndex = app.title.substring(0, 1).toUpperCase(); + } + if (lastSectionIndex == null) { + lastSectionIndex = sectionIndex; + } + + if (!TextUtils.equals(sectionIndex, lastSectionIndex)) { + sections.add(sectionIndex); + positions.add(offset); + lastSectionIndex = sectionIndex; + } + offset++; + } + + return new PrivacyGuardAppListAdapter(mActivity, mApps, sections, positions); + } + + private void resetPrivacyGuard() { + if (mApps == null || mApps.isEmpty()) { + return; + } + // turn off privacy guard for all apps shown in the current list + for (AppInfo app : mApps) { + app.privacyGuardEnabled = false; + } + mAppOps.resetAllModes(); + mAdapter.notifyDataSetChanged(); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // on click change the privacy guard status for this item + final AppInfo app = (AppInfo) parent.getItemAtPosition(position); + + app.privacyGuardEnabled = !app.privacyGuardEnabled; + mAppOps.setPrivacyGuardSettingForPackage(app.uid, app.packageName, app.privacyGuardEnabled); + + mAdapter.notifyDataSetChanged(); + } + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + // on long click open app details window + final AppInfo app = (AppInfo) parent.getItemAtPosition(position); + + Bundle args = new Bundle(); + args.putString(AppOpsDetails.ARG_PACKAGE_NAME, app.packageName); + + PreferenceActivity pa = (PreferenceActivity)getActivity(); + pa.startPreferencePanel(AppOpsDetails.class.getName(), args, + R.string.app_ops_settings, null, this, 2); + return true; + } + + /** + * Uses the package manager to query for all currently installed apps + * for the list. + * + * @return the complete List off installed applications (@code PrivacyGuardAppInfo) + */ + private List loadInstalledApps() { + List apps = new ArrayList(); + List packages = mPm.getInstalledPackages( + PackageManager.GET_PERMISSIONS | PackageManager.GET_SIGNATURES); + boolean showSystemApps = shouldShowSystemApps(); + Signature platformCert; + + try { + PackageInfo sysInfo = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES); + platformCert = sysInfo.signatures[0]; + } catch (PackageManager.NameNotFoundException e) { + platformCert = null; + } + + for (PackageInfo info : packages) { + final ApplicationInfo appInfo = info.applicationInfo; + + // hide apps signed with the platform certificate to avoid the user + // shooting himself in the foot + if (platformCert != null && info.signatures != null + && platformCert.equals(info.signatures[0])) { + continue; + } + + // skip all system apps if they shall not be included + if (!showSystemApps && (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + continue; + } + + AppInfo app = new AppInfo(); + app.title = appInfo.loadLabel(mPm).toString(); + app.packageName = info.packageName; + app.enabled = appInfo.enabled; + app.uid = info.applicationInfo.uid; + app.privacyGuardEnabled = mAppOps.getPrivacyGuardSettingForPackage( + app.uid, app.packageName); + apps.add(app); + } + + // sort the apps by their enabled state, then by title + Collections.sort(apps, new Comparator() { + @Override + public int compare(AppInfo lhs, AppInfo rhs) { + if (lhs.enabled != rhs.enabled) { + return lhs.enabled ? -1 : 1; + } + return lhs.title.compareToIgnoreCase(rhs.title); + } + }); + + return apps; + } + + private boolean shouldShowSystemApps() { + return mPreferences.getBoolean("show_system_apps", false); + } + + private class HelpDialogFragment extends DialogFragment { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.privacy_guard_help_title) + .setMessage(R.string.privacy_guard_help_text) + .setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }) + .create(); + } + + @Override + public void onCancel(DialogInterface dialog) { + mPreferences.edit().putBoolean("first_help_shown", true).commit(); + } + } + + private void showHelp() { + HelpDialogFragment fragment = new HelpDialogFragment(); + fragment.show(getFragmentManager(), "help_dialog"); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.privacy_guard_manager, menu); + menu.findItem(R.id.show_system_apps).setChecked(shouldShowSystemApps()); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.help: + showHelp(); + return true; + case R.id.reset: + resetPrivacyGuard(); + return true; + case R.id.show_system_apps: + final String prefName = "show_system_apps"; + // set the menu checkbox and save it in + // shared preference and rebuild the list + item.setChecked(!item.isChecked()); + mPreferences.edit().putBoolean(prefName, item.isChecked()).commit(); + loadApps(); + return true; + case R.id.advanced: + Intent i = new Intent(Intent.ACTION_MAIN); + i.setClass(mActivity, AppOpsSummaryActivity.class); + mActivity.startActivity(i); + return true; + default: + return super.onContextItemSelected(item); + } + } +} diff --git a/src/com/android/settings/privacyguard/PrivacyGuardPrefs.java b/src/com/android/settings/privacyguard/PrivacyGuardPrefs.java new file mode 100644 index 00000000000..8711c179288 --- /dev/null +++ b/src/com/android/settings/privacyguard/PrivacyGuardPrefs.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2013 Slimroms + * + * 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.privacyguard; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceScreen; +import android.provider.Settings; +import android.provider.Settings.SettingNotFoundException; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; + +public class PrivacyGuardPrefs extends SettingsPreferenceFragment implements + OnPreferenceChangeListener { + + private static final String TAG = "PrivacyGuardPrefs"; + + private static final String KEY_PRIVACY_GUARD_DEFAULT = "privacy_guard_default"; + + private CheckBoxPreference mPrivacyGuardDefault; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.privacy_guard_prefs); + PreferenceScreen prefSet = getPreferenceScreen(); + + mPrivacyGuardDefault = (CheckBoxPreference) findPreference(KEY_PRIVACY_GUARD_DEFAULT); + mPrivacyGuardDefault.setOnPreferenceChangeListener(this); + + try { + mPrivacyGuardDefault.setChecked(Settings.Secure.getInt(getContentResolver(), + Settings.Secure.PRIVACY_GUARD_DEFAULT) == 1); + } catch (SettingNotFoundException e) { + mPrivacyGuardDefault.setChecked(false); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + final View view = super.onCreateView(inflater, container, savedInstanceState); + final ListView list = (ListView) view.findViewById(android.R.id.list); + // our container already takes care of the padding + int paddingTop = list.getPaddingTop(); + int paddingBottom = list.getPaddingBottom(); + list.setPadding(0, paddingTop, 0, paddingBottom); + return view; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mPrivacyGuardDefault) { + boolean value = (Boolean) newValue; + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.PRIVACY_GUARD_DEFAULT, value ? 1 : 0); + return true; + } + return false; + } +} From dc20c78a741cdf976134595e18569246af9f9428 Mon Sep 17 00:00:00 2001 From: David James Date: Sun, 12 Jan 2014 19:33:04 -0600 Subject: [PATCH 02/71] Profiles Change-Id: I25e8656f93aa517cd5b4e4fae58409d0571a9c6f --- AndroidManifest.xml | 112 +++- res/drawable-hdpi/ic_location.png | Bin 0 -> 1183 bytes res/drawable-hdpi/ic_menu_nfc_writer_dark.png | Bin 0 -> 1385 bytes res/drawable-hdpi/ic_menu_trash_holo_dark.png | Bin 0 -> 972 bytes res/drawable-hdpi/ic_settings_profiles.png | Bin 0 -> 2836 bytes res/drawable-hdpi/nfc_writer.png | Bin 0 -> 6902 bytes res/drawable-mdpi/ic_menu_trash_holo_dark.png | Bin 0 -> 727 bytes res/drawable-mdpi/ic_settings_profiles.png | Bin 0 -> 1714 bytes res/drawable-xhdpi/ic_location.png | Bin 0 -> 1604 bytes .../ic_menu_nfc_writer_dark.png | Bin 0 -> 1684 bytes .../ic_menu_trash_holo_dark.png | Bin 0 -> 1219 bytes res/drawable-xhdpi/ic_settings_profiles.png | Bin 0 -> 4566 bytes res/drawable-xhdpi/nfc_writer.png | Bin 0 -> 6877 bytes res/drawable-xxhdpi/ic_settings_profiles.png | Bin 0 -> 8101 bytes res/layout/nfc_select.xml | 49 ++ res/layout/nfc_writer.xml | 57 +++ res/layout/preference_name.xml | 58 +++ res/layout/preference_profiles.xml | 96 ++++ res/layout/preference_profiles_widget.xml | 23 + res/layout/preference_streamvolume.xml | 86 ++++ res/layout/profile_name_dialog.xml | 38 ++ res/layout/profile_tabs.xml | 45 ++ res/values/cm_arrays.xml | 84 ++- res/values/cm_dimens.xml | 35 ++ res/values/cm_plurals.xml | 22 + res/values/cm_strings.xml | 188 ++++++- res/values/styles.xml | 9 +- res/xml/appgroup_list.xml | 22 + res/xml/application_list.xml | 30 ++ res/xml/profile_config.xml | 42 ++ res/xml/profile_settings.xml | 71 +++ res/xml/profiles_settings.xml | 20 + res/xml/settings_headers.xml | 7 + src/com/android/settings/Settings.java | 23 +- .../profiles/AbstractTriggerPreference.java | 38 ++ .../settings/profiles/AppGroupConfig.java | 438 ++++++++++++++++ .../settings/profiles/AppGroupList.java | 94 ++++ .../profiles/ApplicationItemPreference.java | 67 +++ .../profiles/BluetoothTriggerPreference.java | 45 ++ .../android/settings/profiles/NFCProfile.java | 155 ++++++ .../settings/profiles/NFCProfileSelect.java | 121 +++++ .../settings/profiles/NFCProfileUtils.java | 129 +++++ .../settings/profiles/NFCProfileWriter.java | 131 +++++ .../settings/profiles/NamePreference.java | 126 +++++ .../ProfileAirplaneModePreference.java | 171 +++++++ .../settings/profiles/ProfileConfig.java | 479 ++++++++++++++++++ .../profiles/ProfileConnectionPreference.java | 167 ++++++ .../settings/profiles/ProfileEnabler.java | 81 +++ .../settings/profiles/ProfileGroupConfig.java | 149 ++++++ .../profiles/ProfileRingModePreference.java | 182 +++++++ .../profiles/ProfileRingtonePreference.java | 58 +++ .../settings/profiles/ProfilesList.java | 118 +++++ .../settings/profiles/ProfilesPreference.java | 150 ++++++ .../settings/profiles/ProfilesSettings.java | 337 ++++++++++++ .../profiles/StreamVolumePreference.java | 158 ++++++ .../settings/profiles/TriggersFragment.java | 229 +++++++++ .../profiles/WifiTriggerAPPreference.java | 57 +++ 57 files changed, 4773 insertions(+), 24 deletions(-) create mode 100644 res/drawable-hdpi/ic_location.png create mode 100644 res/drawable-hdpi/ic_menu_nfc_writer_dark.png create mode 100644 res/drawable-hdpi/ic_menu_trash_holo_dark.png create mode 100644 res/drawable-hdpi/ic_settings_profiles.png create mode 100644 res/drawable-hdpi/nfc_writer.png create mode 100644 res/drawable-mdpi/ic_menu_trash_holo_dark.png create mode 100644 res/drawable-mdpi/ic_settings_profiles.png create mode 100644 res/drawable-xhdpi/ic_location.png create mode 100644 res/drawable-xhdpi/ic_menu_nfc_writer_dark.png create mode 100644 res/drawable-xhdpi/ic_menu_trash_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_settings_profiles.png create mode 100644 res/drawable-xhdpi/nfc_writer.png create mode 100644 res/drawable-xxhdpi/ic_settings_profiles.png create mode 100644 res/layout/nfc_select.xml create mode 100644 res/layout/nfc_writer.xml create mode 100644 res/layout/preference_name.xml create mode 100644 res/layout/preference_profiles.xml create mode 100644 res/layout/preference_profiles_widget.xml create mode 100644 res/layout/preference_streamvolume.xml create mode 100644 res/layout/profile_name_dialog.xml create mode 100644 res/layout/profile_tabs.xml create mode 100644 res/values/cm_dimens.xml create mode 100644 res/values/cm_plurals.xml create mode 100644 res/xml/appgroup_list.xml create mode 100644 res/xml/application_list.xml create mode 100644 res/xml/profile_config.xml create mode 100644 res/xml/profile_settings.xml create mode 100644 res/xml/profiles_settings.xml create mode 100644 src/com/android/settings/profiles/AbstractTriggerPreference.java create mode 100644 src/com/android/settings/profiles/AppGroupConfig.java create mode 100644 src/com/android/settings/profiles/AppGroupList.java create mode 100644 src/com/android/settings/profiles/ApplicationItemPreference.java create mode 100644 src/com/android/settings/profiles/BluetoothTriggerPreference.java create mode 100644 src/com/android/settings/profiles/NFCProfile.java create mode 100644 src/com/android/settings/profiles/NFCProfileSelect.java create mode 100644 src/com/android/settings/profiles/NFCProfileUtils.java create mode 100644 src/com/android/settings/profiles/NFCProfileWriter.java create mode 100644 src/com/android/settings/profiles/NamePreference.java create mode 100644 src/com/android/settings/profiles/ProfileAirplaneModePreference.java create mode 100644 src/com/android/settings/profiles/ProfileConfig.java create mode 100644 src/com/android/settings/profiles/ProfileConnectionPreference.java create mode 100644 src/com/android/settings/profiles/ProfileEnabler.java create mode 100644 src/com/android/settings/profiles/ProfileGroupConfig.java create mode 100644 src/com/android/settings/profiles/ProfileRingModePreference.java create mode 100644 src/com/android/settings/profiles/ProfileRingtonePreference.java create mode 100644 src/com/android/settings/profiles/ProfilesList.java create mode 100644 src/com/android/settings/profiles/ProfilesPreference.java create mode 100644 src/com/android/settings/profiles/ProfilesSettings.java create mode 100644 src/com/android/settings/profiles/StreamVolumePreference.java create mode 100644 src/com/android/settings/profiles/TriggersFragment.java create mode 100644 src/com/android/settings/profiles/WifiTriggerAPPreference.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e1ae2dd2076..15844cedb9d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -732,7 +732,7 @@ @@ -750,7 +750,7 @@ @@ -760,7 +760,7 @@ + android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert"> @@ -1023,7 +1023,7 @@ @@ -1075,7 +1075,7 @@ @@ -1085,7 +1085,7 @@ @@ -1202,7 +1202,7 @@ + android:theme="@android:style/Theme.Holo.Light.DialogWhenLarge"/> @@ -1303,7 +1303,7 @@ + android:theme="@android:style/Theme.Holo.Light.Dialog" /> + android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert"> @@ -1378,7 +1378,7 @@ android:label="@string/bluetooth_permission_request" android:excludeFromRecents="true" android:permission="android.permission.BLUETOOTH" - android:theme="@*android:style/Theme.Holo.Dialog.Alert"> + android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert"> @@ -1399,7 +1399,7 @@ android:label="@string/bluetooth_pairing_request" android:excludeFromRecents="true" android:permission="android.permission.BLUETOOTH" - android:theme="@*android:style/Theme.Holo.Dialog.Alert"> + android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert"> @@ -1421,7 +1421,7 @@ android:label="@string/bluetooth_connection_permission_request" android:excludeFromRecents="true" android:permission="android.permission.BLUETOOTH_ADMIN" - android:theme="@*android:style/Theme.Holo.Dialog.Alert"> + android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert"> @@ -1431,7 +1431,7 @@ @@ -1550,7 +1550,7 @@ @@ -1559,7 +1559,7 @@ @@ -1633,7 +1633,7 @@ + android:theme="@android:style/Theme.Holo.Light.Dialog"> @@ -1657,7 +1657,7 @@ + android:theme="@android:style/Theme.Holo.Light.DialogWhenLarge"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable-hdpi/ic_location.png b/res/drawable-hdpi/ic_location.png new file mode 100644 index 0000000000000000000000000000000000000000..be38c05e1aa51753acf67eaced1aa53dcfaea332 GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=7)X17vD?XPI|c^kd`}n0kc@k8BhO}uI12o$GFN1=>5|g7 z?A#%)%Hm|8=u&j8`3HmCCl6l`b}fpLG1hIFK2k6*07FM zruurmL2ab;2R;Yq11o!&XH5B~&yf3h9jC%YhhLnFHY{bo$GISzVID&T!vnsC*^552 z9!O`%XMDr(LyK{9j{;ZY^wo;rJtv*_m}fM#WxDJ9xn1v;JWoz|u-s#xa6#-O*-5#X z>P4kbBi(O_%w8GQ%+WAktx~DspG1M-%Pzg6WxKX1EMZpvZaAr(tw!v^ngds!1=P&_ zz0Rs(*`4bw4%Pv$6%RxOg<>W?=4ZBec);9 z8AaW8aSw50_5`s5t5^gt{pWok*C5Qm`#fgSl94k^&!|}*Se+MM6LP*zg*%#c z(}G>mTQ|+0*t&C0Vr$O*ak$Z+lDNEG=f&>1 zjUd&n442PTY%>V>rW|>rH^p)OTRv8x=@DlV?ralpZ~E&XR!C8<`)MX5lF!N|bSNY}tp*T^!& z(8$Wb(8|gFi?Xe$cEtjw370~qErUQl>DSr e1<%~X^wgl##FWaylc}JBg2B_(&t;ucLK6T?Wccv_ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_nfc_writer_dark.png b/res/drawable-hdpi/ic_menu_nfc_writer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..88fe43798ef0cb0bb45024722670b22e04aa39b7 GIT binary patch literal 1385 zcmV-v1(y1WP)$G>+ox9gqm=4+a! zF6XGGWlmEJO-gJCio+HdvuvSRU}U60Y9R!n30WCoTCz~tFv2piVwOX#`9hYawVay@ zPUo0j_i~-*-1F&=-QC@{bKhLg;huBu;d!19&-47w^PF>}|5+TJ2a-`v5sYr&IT@tZeLi2U1NzK&Y% zCRWlfu|##%pjY6mR=-OQIpmO+F6_k)tz38lvg8tLq-EQb{6+&KeX2%4uiMLmnjNC-hO zEdeu&OMJ&JPT++WO2{IYA~tb6NXajCETVT@1Y#j=cKzWq7BB%fnLNmHs%Q^YILEVb z5s2r*?YhOFnX~NXWyX*}E^9d-s&JMfdc{QGpp;wD-CyMxwX^|VPOyp`oXnz<+rdhI zF^_a&0$#9-pqz)8%2K|f4j*2Aq6jDX?8FfSbU-yg@dj*p5LX zOX$ra8bcAk@R)5AL}aprOTiYk%x5T0hEmFJn0Q#vAV#wXA7_|~n{D_)5tU4eg>dmI z4Z$g@jN}V9@Q#Mc^a-(8M;q%G`@ST zp3!QRtHY7Vb2vf_V{>qy^-;xojse%G<~%-3JhXP+Y!)Y(6K66+L5yHaXlJ$&i)v=a zoC>y(k(AL9*Zm=8rr_QmMGiY+B1{f2CB`&J0Fg%phK+lJeN0N(eE{+Rd!juWVX}uu z?$EtIigE0XKy*++Udk_45r{|GAJYEYDPwGpxc4I*6!3GP@p$>1(LLrq5XBS@;saXv zgke4E-j7IQI)`Xt14Db0u1tj>knZoA>k}^)^`-UHpl4;M&f9xJ+lQoY?05UK!GA%GPEipD!GBG+bH##slEigAaFff;26IlQN03~!q zSaf7zbY(hiZ)9m^c>ppnF)}SMG%YbUR5CF-GB-LfI4v+YIxsNi0;}Z!000?uMObuG rZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o00000NkvXXu0mjfWo>K? literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_menu_trash_holo_dark.png b/res/drawable-hdpi/ic_menu_trash_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a0832e211b7ff262a6fa69f1457784ce6908c1 GIT binary patch literal 972 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 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_trash_holo_dark.png b/res/drawable-mdpi/ic_menu_trash_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b9575aacb676eab5eed2b1616e551b8599bbc5d8 GIT binary patch literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOeNPw15Rc>m?i8=0{C5!(9-UNr zGN<_e=lS-}?{WXXopWNP+N3fWy;(KJJUkoEI{uzH;d9^7t&$w6PU}@;y(Z0B67IB; zZIf`mrcsblLbv>z4QJK#8#oP=rgC0nJ!SKfL58h^)!1#ypRDFk>CSA020`{cPYi$O z7#k-IMVX`fa-)2E=g0q$71Ja1SDk4XylY# zIU$7oYqn==->fw+WKIaoe)D-s` zPm1ThxN!eeqBC!YVo+J-0o$MhA14Rzd)T&ZV!fQn`Ynq2vFj)D-1TQ<*8O|7`0CA1 z5<4coemnmS|Mx_-uSwjT4}fv5TH+c}l9E`GYL#4+3Zxi}3=9o*4J>pG%|i@Lt&9z= zOn_W-D+7Z@nJGLd8glbfGSez?Yxv-(vjM0<5@bVgep*R+Vo@rCV@iHfs)A>3VtQ&& XYGO)d;mK4RpdtoOS3j3^P6Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^e; z7A-8952!f+00uHiL_t(o!|j(_Y+P3rhQGDX8QXCZ+i}L%nKNUDrfDBYL{d=#NR*1U zL0n2&sLDk`q5+Da4?IL5L4^cr1P=%rgbJcX;-x}Dty-j%q9Pg~3Kdk1XlW5q8qdr* zW5tFv~$5_O@ujp%G5S$Fd)>kZOxwEyi{rFI+RE*=8{{H?o z69`sYFjOouH8Vqdcem@=n%}mit7~_6N9Rp~zk07fJIC#Y?Ew-8T^${p$1Tg|X6EPp zL!bT}e|hZ$`F!3M78d?(d|NBiZKd)bfcF3kP2%m6ewb$2uL9>HGrL>TQ)c#ENlz|c zTs|~OG#DvyOps%lw@$qqniqS!g^U8EoNM^1r&C*4s*>qd`hA~OMNmrI1 z3d7td1Q*QgE1CR#wIn&c+QGuB*1S-lTCX=)nr(8<9gyh}c^$_HTU-u>!6U#N(gAO7 z!OZS8vt1I8*OKJ)&Kqy$)sz3YCIP#4{iBkZ{m#q^l3oTDoU=P6&U)`3U0GgwthH^! zDewKwl_Z`h7mFVagYa2N_{`s1smD*hr7jpMM3f7qPUqY)j6~97X12@B?UV3GQ_i`M zhq*A5{N3LB{(*r)k2Ckh#;FW*w(nBB;elxV85oXA`$2oa{%B^;H%nmv63bbd-c=n< zjt&)z?al>9f!&gRigBC78I#_`tc3W|NKzXq7b2?lc0SwVe?c3b3&mr+d(5^i{@7}K$b-@c` zyVw`GVc@-zF7Ky7S{@<4G{kPA*+7M<7cGoL*e1i{~dAoG5wGkd{|_hsIM;`#pnY#y=mf4|X9ZonY@9)FxJdO6t1phQ_e{wP0HVP{OD+uG0Jb^DqC{V_ zUW*vzhB9mrtQlNqf}DGNs2F`4cwU)5TN$gb0QB_qaPHi>)kRnx9liV>kJgv7EW01b zfy)6?%}*-`HObs6{E4QV`VihZ_cO%(D`WNaQmm_Oe$9EHTr5(pCzG4oHy!c#Mdw^A z#>apJc-hSMB6WJ~uwf5knl`M{%z6x>prfPG)!D_Cj?S$en>Wr*&(8XFO+?isp)^pS zHdcSNR?Z#U%1jq*EN#W#_E^f zD{)elbl9M+TCcw$=@m0@7VMPtC!kv}YDOUWZ!~@2ZzDOI3z>F2-#V%(g)J5859 zj0IV(UcY_>277xMJ$sgXF0_sL-oYRY-RZa%4;7;a4C}-6TVZzuEB^a$o=H~tZ=*O+ z*fdlqex_V3eh?rk6m~b9G~$1P!a$*|H{a_3_T2Oi{*U$IUzerucU1amx&QzG07*qo IM6N<$g0s9s-2eap literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_location.png b/res/drawable-xhdpi/ic_location.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0be6ce52baaef57cb304870c1fdb950ba38cd5 GIT binary patch literal 1604 zcmZ`(dpOg382`@DMJiNtNyg){F3WI;aOU>9-iQY;zelgyR+g1Zq_kXj=KOd5IM4fh-p}*-yzl3E|9f-x1mLw-8mxQN@IR;UhWX3V_Bs zqL+IxyKg+~dEUm5wTr3I4$JujvrL3W;G~pxO=~-W=Z9OqNnM%cB9kc#ieU94_OC25 zWKu@21(K~hUEsOFJX>qun)jxHoX0-d#OT?tm;>WI&akP;s}HAV8mu5Fzg* z@8SZSiKx5DwP=#pVWHWc0{+6f!K9wR1V&b$wB&{+O}KK6K?;}$Qam`i!j`6e#?xTp z=TNZ|zoMxBV0<5`q7keNloa_kn( zBZ+(bctw`gcpNBjg0kM-68?xUX zAa0Uh!S-9zSd5Ut_%G2MwM%;D_o%U``-Z{um2`H%D%F}~2B=cnVdG2ARH$1029Or~+e*ZJn@mS-lLn9~K$JT^qmL}$w z_8LF1 zfRj&b<=CP4i>s%sT4nXVc%7N)LO+6zMBx}N93G!sXOXwCUotS5T%TEe>}21z1vSWD z9>U}EZ(6<{KewSYuF$0Q)QC8QD5QLi?;|5Zdx#`fK4zrR z2o*l0kF}U4W=y{+s`ZT=Jfxd+gVSORj0gigsN+?$48q=fG3n_&Lyb^|tlM)qlbnXI z)R`;N6iw*YcL=hYH(r`e-RFNk1-W+2Vp#VSlReIfh#Fota@|YuB8m3s>A4fF`EYi| zmwqXmMDMHh%z!}C^ZB;Z3U2f4uH9o*KsuyIg;_ToeN|=qJqXtj9#M&=7-=bQWG}$wI$4cy$9h-Vb4=xfb(4}yOv7~o5tR|IBQ;Qug-5cL{{>mf2uTa8T{tfhJhHBotSs3M`^+GCbOa_EGjlKfvO^4i?Ojq zW1P^oPQf;|Sd0zU-X4wFfyH1%BYP(P6QDDr4o7qTKXCQ-#~@X}VCg~-Gn$n`NuUDv gDCR*bl1Qh-P)Sru6enInUHayL=pEoC^nfz|0jej`xBvhE literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_menu_nfc_writer_dark.png b/res/drawable-xhdpi/ic_menu_nfc_writer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..417ec981daadc8ea7db06b186d84a78b9c936e51 GIT binary patch literal 1684 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 Wm{M7IGSvpCh{4m<&t;ucLK6VHixC0< literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_settings_profiles.png b/res/drawable-xhdpi/ic_settings_profiles.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8ce9177516aa31b898f85a51d5e96e95f4fc04 GIT binary patch literal 4566 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 AEdT%j literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/nfc_writer.png b/res/drawable-xhdpi/nfc_writer.png new file mode 100644 index 0000000000000000000000000000000000000000..60f4d6ec75dceb96fef99fa93258c393dcf24a18 GIT binary patch literal 6877 zcmbVRdpwi<-=9)Bbg){?DKo_6G>6KP!)$EMCK0J@#^%iCoT$WXBPt>!nNz5H5k=^* zktin8@m8r&LPeOj6pveZ>cOlc!@n>26{E^cderGRVp=j7WyzLwp0s1hTJRTtp|?3x*tB-+y;kH{r1B>OdJgy z!>!2_DlR^f>=y5IfD|7@GWCO7n8VCsQGkLFGTj#z8xkB!L&ffguj)ks*CMh$9Jb0r z584m^ms6gOE->q`NHWYs&p?-Cu-gE(8>xphGTyUij}FYx0BN9aV5pBY)J5(=85yDs z3}Ao#!2xTLe*P!|#^x_uz^DCi3Y{K~($|lPiP4KO(hG|W&_|k@nu>H78tMWZy0o}Z zx^Jv*C{69R1`L@-ilm0qsbQfokw#x)SQLFf9PspCA%ukgtu~bQ7fb+P`mw&@`ba$k zQAocT9UcEWYe>l7+%!6Y{BM8%SH-jgap7cr0+|*T6-fdT=dUI*6^^owB>U3CA`gUx z1^-6Tg%U;&qfx@bVb*RYFb`^|Usw!nmD|w~g%73CeM3oPJZ3)}kk_M9{ZPg>d-v`! zHAL>+y~h-Z#3IqA7!xeo*x1+vgEY1=viU8G2_r>?kVEOeW&QpwYxs|{qCyA>2P|XA zk<@6ipG{;~2y8WA6!jl{LE8MIzQ1Js{@E9Uf0We+oY5Dh^*_@5n*`L3=<@HP1wQ;; z_T*5Y)+2$U9v(K21A*k+@EEHDv9HF9mfRIhA+{X}zgDuO(Ap9QEGv(doXV40vmFGy zUK{{bfe2!pHMn)E+hb>F?b7xV$HvBJ6Z-=)>s0)L57FYBRQ3nlXV>upv)rrA#p-0rU-_!WbP&` zzCUtsF0kO(m+RIaC2H~CZ=|UBZ&KZT2EME~+p?n<(z_L5A1OmD7@vIz2O>NMHi6p! z!7{)=;6!nbL^4ziu?8k0H4x3N$^!trse2u^C}v+VUx+c+gK50t_><5u%08)TN;=m&65CtM6US{J`h0q9(A|m&ifpqA6{!C znu!6e+KpXagZ-^c#PlC>8~L#|BGtD?)NCuz!OP{6xu2i3HS+t$) zz20<@KV!8e(l(=91BJRp3u(1>0};A+J*aASQjwZMyh&<{(r?_d;$tCO?&xlzhT}<) zjR+&m_|pQ4YHGFA8JPU#+h1QKX6|FP_1-!S?^rTFm10oNi16h7at}m2)ec%A#VC7q zPNnO6WDmO*`>zEs^VG3RjCr%r>M*tL#xzms*;}w0jK5V7``*81bShszzVV{kT-``( zBk7VDA{C8)x>A}k(~llciWv3X*(W*7D0MrD6J*k6%^RiXbSu*?q3#+OPb16Z8IW|y zL&9hH)%s=MKZkco645*f40Bn_{m5jHw7oE-@>8&qth0#LX{zJMU~OoU+bx4c6H|5g zU4(#L3!OXqC_D*H5B{ZtD+`*ZeVATzoO^7k>{Gs_u+W&G6RvW%tMAMU+5^(DH2|g& zV>GJrO{tfABZBr^_HLpY6e2e9@m%%LgqQsf5N{zs3fY~elXA#DNHSz{-s@SxH%$p# zi6~gg;e&IR^G!v$D-FL$dbnY2tH8aK5%ECsqyZgq9N_04=y|0nvut(%jdh3a@rzAoE zP)^8oDn292p7$5tRIp?bHdkXfFVwMvC3iN2HI|xl59~#4N38!@ey^wXGwPRB3Hq>x z9fsZ80I{#Fd#z8OC1-dea~XhlrqTf#wX~>7EOp7YRaT@|&d#0n0(2$mcJ#a*&@Vea$O)*qps&LSvO>d<7>WCIi3}efa67DE(H~9tXeO9H7DLJMP$JV4)W*Typ0MQ zYJCzJCi&y%NDmEf=z1C&lmq9#uH7FsIG=hwG%T#SrKM$JX<^p2-9$0jsB9Mq0q1Ms z7+Xult6qj<|44>r!_`MddWx|vD%i8yTL^YHUUd>Uz{EmqPRXl#T2fhgJTY;XCLvF?Ka=TY@fPt?Tc`EX(1^|FCy64XkcMs;ccwhjxU2I zQ9YfTTYizXI>l(l?V6@1mV{BuUIc||t=Z90N^9VHph;3{#%k272Dhps5ZaMSSCqhN zgp{qWrWxv09@yMFE+}2o%{4Mg$Ob+B#Nee7>DH(5&q6xCPfr_rn`YR>*Ax6L_ssyQ zk&yTi2hk0@>uN6nXuvRCI4}*{oPLf2*W~Hme23I?gdp1R+IU4m%H!UT-RLZYi$Y6t z^FEa@B@jxVVyAD-bWy!_@&eS^$>|*CtoD1?{=Lb%T{0vz;^x(L-D>#X5go$C8GW%~G{0L1@L}FP10RgpVO*Weo)d?wIT!G0*kNFk z-L1Ko7)UW3_}mo+@8Vj?~#O44c!_3ulhk+sD+9&z$=M-k+-J`#dcc z4I48uX8A=$L?GLU4EwsFjEZM+OK~4ud^xf2t|wkX?O-+-udRN0RPyt~v@JhzRpnav zAB2xkwQufC*ZW(n*2k37cSSLA$dfL{xxXqH!K#n@w%oiZqcJ-?JWR=^p8i^~L8Dzg zp=)$!_Knl>m{0HCS?>QdaPj=`VnCrfbJ5Jh!^23ETW0<&NKcbDKlB!6k$TQfb80&w z_+)KuEzEUv#3$ag`OY207n-uN@{^(BThN(9tJrTUebi&8!0c5oC5Tte`p(bGUNl!D zVwgCtYt0$gt1uEKWBB`R{zUk*ACf0)aS_rX{0t5e|NZ-3zlnOIc280%@ou0y8@RJQ zif?^h1HqXKcLN8e{gP*o?pJ0(_&k5%|~q`gw-35M};>f7ta`C_*nSRv$9 ztxY6bSAOYK7F73FAcp<$Jn`oAJQs>T{;c#BI-`Y3d=MXn^LY1)R4oau-4vFEuO$Tg zJAje0dw-mWGSN?Y{^IDxl6E9k>~;=R(P!S!in$ICM&`<41NU(+oI22-MyrEFcfO-q7~jo2cLpSp983JIUL*?M4+l0+r%rK+y5la+EyWp zXhj&e7~ig-Eth^T^3x;Qc?IOxwYt0)Q=9)JaXfP&9x^0l(pm1O%7`a z72!g_upc4Gs1Vh58~Z4x?C?7d1DZ{GEPs?WTbmyOjKoqqF!FhN-&@apzeXoBa;|wX zke`GTC9H@)0MQw^6|XX?A9|!FqCM-Gj9k?Ts-~*f?kxlz43oh<0vR~8-Jv3HW?*5H z?!LaBMq$)bDU@pX6k%M^H>5q6#OdF{gR1%DK&@E=iaU<#*s$xKH*A&$mnPf^mwSC} z-_xF+k=H5Ik=%@ojHhMQKdTR9o;}*UwF)NU zo;GQ|tr_r%WI!LrYMZ!UD6Mo@am+qIHK8LjH8WgqmNrP&a)awna2bs3X?f&&$Bm<6 z?s$9rxq9=<#;H*24r|5hN4xcaa|2q;iz#&4QXO5^x!+A2?;W}uY|Sn)>f3a2%x^m| z+}O@U_XW-Tk4%_`e;56g7d!A`Rv#SS_TD&NwcVZL$$+Hk*mUyZcYCbsz7u_ddw3H` z*Cyk1bg;uh@U|ygi)DawEcD9vUXE5A--}T3NVns}NxL!o?WEC!AbJ5e7-&@n@|xx4 zf-3?)>&MeQfrUt$lQFnj@^GD?lh1&FOXs^sZ=S*I>}bCVs1*IgwT}!`gHs!%15dR+1WD0P5*P@}c>BuaD5L+18Kg(_O(Z%xX|= z+4hXHUzJI=<_C%Og<_i>OE(yd{TMn9Bk16mi4RTUWXY6t#!M_}d>CKLqvQ+II09z< z2A()VR-NDaeP`{AAs#JA_2b-6DDyMjd~7>7XtPjDWX$u&lw| z=nJM-+w-;|ORDW_>`Bx1_x5D$xMz2EX777L!_$>WToZD;qFjAUVeEh8dd=jTye9 z2<+K7Fw)=pyu|abH6#X-o`kP{Ng2{gcqjPKw;J6_l=2Wa3Y1WXFh%BJST3{9dCGXf2X=v@Zxma;14h& zSF>GZx@&}McDX)z?D{^h;kd)E z2JfVqj!xcgZvGk_9sT)+>|WP|wzKEYpMSTIw7mH8>qzVId30Kn?S^AMca7(_s=?s| zb)vDAs}p{keyiY;d;O?lt>OD03k+V3g=!X#TgZqg$c>fPtbfOdKov!gjEuZ2#j<9v z{F=J|<>wyWwdSV`NEZv*vG^dc+!d6!>Uv#}oY!HgpV(k36Rc zu9|g}_1dp=&&)){BqZ2t#zQQ(A+{n3*GToJ9dY$gg<9cdOG=zl(AvVXsqNczcM~}y zHkV_$m+0S%rvJzb|Bf%I{S_CSTzvs}m=M^ow+X*>4YOML-9>^|l%Y~-o%Y$|Nr;V$ zm8VuDkvR}~w|aR}|J;WQxv_D_1#&Dd_DSl#`(*i{pG9Y$>ntYc>)(p%@#rgS0Lp5o zHK7khRZ-Wdjh5ucI7W`9uzLJhbHbTj=KCmKA-9}<#S2@7oM=IO=U zx-D{i^S{!FN%zU=|vh(spws}X8x08hNWyuNl7uiJr2fBnq#S31=B)34* zAjwvEVrGxO#j%af7)R4m><|QHoHH}uT|(UlhL6$k)M;hnq7m@8d&HvR$yW5Ij|J$o z(EdNT-1i#TYUNI8zZ>eRz)gIM zF*$gOR8de)XWAB()Jx_=IeHjQo-=!&vTen38W7B{!}TwUUfHrsTnn82YSMEbYkGec zvl>HVnDe|x`F+j|fi1+8Fsd|0`y}{)X1E^*t*ULr?3|vOJACR#y6mo^;3_+YXabxL zOLw41eN)q9Q3NA(2XC)$Lal}dF{w42|Mkr~Qr=@H|Et0oQB!Y2&@+*(E>`o`gRMlu z=g@7q%&qw@;Dzo655tARFq$XlMGbT|_04)yse;6g?bh(d!=!u(FygsZJ9W=Hqq4-l z$Gs8Q;?aJ1qTEl%}J{@G#; z_!y78mO4z4DBhEH<+wyk1#>{785@`B&q=h4G7KLTezdCV@g9Fzc6iv=L{0cGvAs6Q z>B*PY#D(aw;^wBNA9_)T%5Ruo807Q$y-mK)YugA)skR(X58mx(G0bxQsG{zf+(%~S zJKp>9yj&rJH8S{O-(KQ{!rY<*E{8J1@I98L<|!iR9L)-kxm@^VU~&S=Kf{ob`4HA4 zM`F$xUO?JBN^Mtbcx!b0kV~;9K^$)LXeTc)rb!j(dNZ27cfEMM9uJZYCj?tFFUbz* z+*ha-)3s$FIFAh5cK1;-oz_W*rd=`=wf-8ja%OEC19Fl9mLU>>G80c>$N=Y*xFrJ@ zQAy-HeCSrFCaN&86D2J&jbJ!I=^E73O<{+0M4G=PlL1Dq0Wtz?pnwEevZwNt0nf#d z4_ag@fbZ@p7x}jx?O_;8X1IQPS7>s8of>dGRS2zMa7`yAKZr`9EN%=}5;I#DVCSLAyC1T|j}Xr?A|6oKU#1}g zA2R|GF+lo2$bR2yVj`*te>9~>3>96`86Xc9sOGds>B^wUeU|Rvl z^aUhu$hHWut9UP?dd}S1huY0dxC6_{T;rXTZN3&*(*PX6sty1KSnn~gv($FT{WXJU zjTSIj!KOobomq1o|hKB>k`8Ks-@S zf1|UU%H%eJi3KiqH}TWCDh?`gI+%v#z&l$E7dC2q5Pr%}c!_3ARUU<5p}`}AJJ_#S z5t~%eb_m0AiL!EmhBDyb262KoZ_cb~HbImt8MTDfFn=2f9~#U{OuaN3P!`q{t0{gY zx=pGMOw1p$$cEojfwx2Z`ko)fFgQJ+fplcMplbY#1P%<~1uPW+yntmVZ%!RRVE~KM34ZK6T01dK23UKg<`EHRb~FbK zTcMW97EG$pn}DHw1lU1mnXmmXd+7h)&e}zCMalpq`;#Gm`oOM>q92^_SSQSN^s!U_ E1LX$Z?*IS* literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_settings_profiles.png b/res/drawable-xxhdpi/ic_settings_profiles.png new file mode 100644 index 0000000000000000000000000000000000000000..59a4df0bc922f7602f2ef0e187222f2b8c485cdf GIT binary patch literal 8101 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 z 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 literal 0 HcmV?d00001 diff --git a/res/layout/nfc_select.xml b/res/layout/nfc_select.xml new file mode 100644 index 00000000000..e72a9798466 --- /dev/null +++ b/res/layout/nfc_select.xml @@ -0,0 +1,49 @@ + + + + + + + + + +