From 7a7dba66ad724ca876427e799b298c9500bd9180 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sun, 9 Sep 2012 09:18:17 -0700 Subject: [PATCH] Update passphrase caching notification strategy. On platforms (API >= 11) that support receiving click events within a notification, we change the notification format so that users can "lock" TextSecure with a click. For all platforms, we change the notification icon in the status bar from a "lock" to an "unlock," to better reflect the situation. This is all part of the master plan for eliminating the passphrase timeout option. --- res/drawable-hdpi/icon_cached.png | Bin 767 -> 1068 bytes res/drawable-hdpi/icon_lock.png | Bin 0 -> 767 bytes .../notify_panel_notification_icon_bg.png | Bin 0 -> 107 bytes res/drawable-mdpi/icon_cached.png | Bin 620 -> 633 bytes res/drawable-mdpi/icon_lock.png | Bin 0 -> 620 bytes .../notify_panel_notification_icon_bg.png | Bin 0 -> 98 bytes res/drawable-xhdpi/icon_cached.png | Bin 1475 -> 1463 bytes res/drawable-xhdpi/icon_lock.png | Bin 0 -> 1475 bytes .../notify_panel_notification_icon_bg.png | Bin 0 -> 138 bytes ...notify_panel_notification_icon_bg_tile.xml | 21 +++++++++ res/layout/key_caching_notification.xml | 44 ++++++++++++++++++ res/values-v9/styles.xml | 5 ++ res/values/strings.xml | 2 +- res/values/styles.xml | 13 +++++- .../securesms/service/KeyCachingService.java | 26 ++++++++++- 15 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 res/drawable-hdpi/icon_lock.png create mode 100644 res/drawable-hdpi/notify_panel_notification_icon_bg.png create mode 100644 res/drawable-mdpi/icon_lock.png create mode 100644 res/drawable-mdpi/notify_panel_notification_icon_bg.png create mode 100644 res/drawable-xhdpi/icon_lock.png create mode 100644 res/drawable-xhdpi/notify_panel_notification_icon_bg.png create mode 100644 res/drawable/notify_panel_notification_icon_bg_tile.xml create mode 100644 res/layout/key_caching_notification.xml create mode 100644 res/values-v9/styles.xml diff --git a/res/drawable-hdpi/icon_cached.png b/res/drawable-hdpi/icon_cached.png index 48edf531d35757a536ceff123112cf9410228e26..50f56b7a5244ea412febb4c2ac0482321d046cf8 100644 GIT binary patch delta 1005 zcmV~jGj zVFbo(_B8Z|tqO~y11yEn zvp%IsjQy34aVf07WT+{cW+xxQ&@+_V~|s>29C^QE<)W=V!qz%qF&|7$)G|+5DMECU@$GH zcC3`jjeqWa|)*^H;GFC6l*^aU?4D9IKUv0JP2$@cCH}Db`^V1 z63A&VoUU*iUF|(qzBG+JA;(@fis_huChLgX9Dm4CyTc`}(};4N1XV`KaqE1|w=U`l zJ?>DEgxXzHIOR7Kz$xzpC^6sQ?dU`OYl1ucmR_e|tKFo9$qmrIIrto(9{C4=ziTIX z&O7t9#~>>PZ9bNe8@i-rsK&B=g+FPcG{MG_ip@~ipn|thgmo4HPk5dH+nYJW4adrn zrhi?ZLOtR~tKn%E4r-rHR&j2cjM8msMSn^?HnE|QMKCL>LUGKg=8iSRTdFj0Df)I}QLqHL+?d~KK0 zrqiX4a_^TIqZC^5SAeH{7a_$?jTknDOJ+rqhQfFcpCRp_%e=cXFBb!MHGUg3!`?O> z<-4MXeG{|bzM)Ynul=tfrG67(|HHeXsF(C0Ng$w(a|qx`0%6;O@9X;6&E9}dwEg-00NOoL_t(o!|j$oXcS=(#eZ+_F1Z*%lNcK# z79utxiC6?Ai0KqWOVR2M5eq9zJF!y)u@Ef0Eo=m}5G%2g*eD_fMO28vMho#@j2ex1 z&tlJT;@-NqdmxC@EX&T$o0<1!z7PJ}-!`Rnto6~SVOD_O>VJ*DR2RAk5UyqqyBTNL z2*XR==9;fnKXnBloa8j4QE1sH`scgv>Tu;@Zh+c^ZqNt#7hfa8D@|6O;;=Tr zb@kX<=8YkVV=-Gorywrd-mbCM-GKg`pT9E4Hj-K2>c% zc#;!3`hUBV^G&kv_(HV-Q2ESRW^)Xh;yW~}_e-zun8`tMyh6M(IvoHgF_cz)sb#7i z-n8_x-DBOBsp-|Na3?@`h^tDsN;@D~*k#TDa2{+aGl1I_ zt0Lnr>g-G|)t0N6y8Rukis;J*?irQI2hcu0l{eYgoikb8BOzX+rMr<00mypT>5gJ!vFvP07*qoM6N<$f?9t{jsO4v diff --git a/res/drawable-hdpi/icon_lock.png b/res/drawable-hdpi/icon_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..48edf531d35757a536ceff123112cf9410228e26 GIT binary patch literal 767 zcmVPx#32;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RX2Okv|Bd&XSQUCw~kx4{BR9M69 zmOp3|VGzZCZ|^R-7(tU58zUAXHX?~w1SE**6huqW>JAYLD@!}EQv|UPEW9mj1ho(= zv69#*A_hfNh`~k+@n4J@jd#yt&v4@2y0?2Eh|?^~&d!^e_h!Bi{@dR+rFE?J(WhZn zfZytkzf>2x2oSDj54#y>*a*W*-R7FFRX=qFAe`hhqfuztDEjBS@9J>nVQzrhgl^CW z_!nOz!z)czp5y`u*YK47pTYfF9}z1U{0YL0N2~Km5sH5(;4=NT03LHr_x*}MBaCx| zwMJ&W&T}Ah1>s&_Q2@x(nykESY1}%dSSusGdc69eeT*P6|9u1q@r`Y*;i39MyMzUl z*q;<40U#Xm2FW%){<|P6k9;YLpe?mxwhC5h$Vh^#vEMH?1vRLFOeDLP9sqyUyIA_3 zH=kw7nE(_JfKj83L%pfhf(uzmPL|oCqe=r6vd=-1EvlJ-$x%Uq*(sb70Ze{N0PtLs zUh^T=VJ_mw4dy!Hur|PT_1IeGjVgf~nr1QP-yV+&!vfE=;6O7Rtjwn%StYj8+uY9v z1&p=rp=8Qz20_1zX;oBTDlKstO06EQ$B`Cvk6NWASxJ(r(*SpnMcP3#qQOn3T+*Z_ zEIHkUp%@=4wya}5Rc%0ck`p@myOZ-xvhVmpwE#3MxHK?AsXkC1&%NXxm}B3mFx&% zR{;|3i$wNYwFEW2THw_g$R6ai#Hu8}mrbnhI0HjjlL70t=P@Ec-3*?telF{r5}E)f CP8`|* literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/icon_cached.png b/res/drawable-mdpi/icon_cached.png index 4e3653e77fd6717b6625e7d718504c7fa3813e6e..a79e595e62537a3087edbac8e759fd5a96465f73 100644 GIT binary patch delta 567 zcmV-70?7UB1o;GzO@9dq5CAokr94~!00Ik1L_t(Y$K8~@Yg1tu#ee7RZAuX-#U`U4 zQ*m*&gNO)zKwSh8aVSZ&|A4bl2M7NH#U`O5{sW5Q2jV2OI0y=YPUukW83Tl1`DJM;C&!_{FFz;nX#jox$M`fuMspp&E3BLEGlY-Fu9 z23b85KzS5kq<;m8F+qeK-LC6aG#?89IMbNgCQI3dXE8|4QL(HJXpr_?>(T~O-OPW~ z%F99H94p#zMUzI~i2X}B_#j}u62g`0+ng4(p9;tj@FDdzG3j5yVG}2FZFCfU35>A; z8{T#WQDWvLZ4;S1gWCL5As(-CQ^Squ|a%zoqv5UJZbG?g&CX%%p)5h$;pa^Ba43I zDK0rm?m_H2jRSKaAgJptZGpl-#D_!-!y@j?s5LK#3m{PY^-EA0l~)q!deilbhcE%h!_yt2nNI=m5oT)1q%@iQ85YG%(0kV zb}~D&J7r!o!}~bz-1E-87mny?cfZX_Sc(5yIXjhoyheCZ_kUROY4DHIYaZA4+SG~x zw5bu^)H5Fgz!LZu*Bc*NTqwpMyrNGo3&S7D6T`zx@D#78xDF+ki=c zVB-+cmjFyQHGdL7QUGw^L$kYJs2&Ue1O?5p*F`V#3eG?&MIexe0mNpl@3RX~kCNN& z#DeauMoFU&+!HSFf(~a?we$@qNR>PT?C_IF%k`}s4K&7C1Gem$RJ<09GwY74xf<9Y zgoFf+^)T2-Fs!P8$ggw<0Obmx)$58Ab=}bwIEdlDpYc6$2N03 s(Z6BWVIz)HcUFH$W%=;YI#O-;KMhWkdg00001b5ch_0Itp) z=>Px#32;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RX2Okv~0(_A~f&c&k{z*hZR7l6o zmAz{eQ5400XLoiAJQUGw^L$kYJs2&Ue1O?5p*F`V#3eG?& zMIexe0mNpl@3RX~kCNN&#DeauMoFU&+!HSFf(~a?we$@qNR>PT?C_IF%k`}s4K&7C z1Gem$RJ<09GwY74xf<9YgoFf+^)T2-F``yO_og3?oTpAH=(*#lM|`HTWV6d&y~P)fx7X9OJhk;=mxK#)%3B#2777Td5O zfGb(GAXNk^RB~#^Hgi1DzhT#5j#GD5e@JEd@Xnw~C>AsXkC1zebf+^+rD$#X=T ubrO(hU8NSJ>0$cOOHfbp>r;adstnf>t?m8`i{1okV(@hJb6Mw<&;$T84jPpJ literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/icon_cached.png b/res/drawable-xhdpi/icon_cached.png index 5236455f987261181d4d9d993f003a5f82209a48..f635ea8157963e5fbf626b8d8b85194325368d73 100644 GIT binary patch delta 1403 zcmV->1%&#;3%3i9O@9dq4?7kb3PxK100l`&L_t(&-tCy(Yg|kgc?AEqIqGEc zG^0)5CiB4nec*YW+#WXjVeI?>sBd2$)>_v260P(-98qH-6uK;%uNj0WbxO z0p%i>Y23GQGaEGI_*bJNe60iC=L4GEQG;p72%;kZm41)2Teo;M0r@l5hSXH^VSl2R za^GxS$_^l(-GBLSVp^x_HfK*TWwXB`*71h#2OMv`=ow};Z!xG5M(883K?1+YQ(NZNXYxTl zBUuM{fz5z10X6@mclnZEeT;w+M!AtkS&Imb#1@|4`+p+yJtJYI&l6M_iwF;Vq*wT! z8Rn~1kt=GzYuLmyjN7sTn=g2L$2UD7Va(>sxZ7)lLIUs}zqaH3rb!DdFvE9~BP!_z zWJ_Mp#N;14|Ei~N*CZT`2)LG8l>-OHHD2BMUL9O>4ak)>88H#aa|i2StSt*NQPr1l zDLF9AQ-9{$*0Z+Ne2{&d0-(TE8tG9ns`Rmn5dsh_@}Yl)DW;l)W{hd30Z;kE7=RdI zxJLlo#~`Ixa8B{l&f{mhHVTzybWqh8K#9S(g5D@$K%Sfg##Nn4NvTCmd}eHH0MG%;{4?2QK$tA*PF$So~>%74W)s6HhJmfeBVDu^Sx6X1 zq5e!B!^>i}^nd6Hvv42|ylCr!M)c3ID_+)KALnEv^dZNxRW}1qo>5h%vwL8SL%^Ov z6)_G=DmC&ztf-VIwOBM;-?siVWkiTj|6TK=orYjfk=@+G0#=^O>5pGu%y+PcSw#Ce6XjS#K?T2_5@tVoty+jo?L8JiOs3%7C5h{YbtUrS7QYn3xh*v_+^G)a&O|1)`hSt(2!9JJem2ckT}8VPq8w^1DykPfq(%MdSprtE znu6Ux)C(na3U(vOEci3+=SSzYLF3*;p_QN2qzxSbs1l}^iBnW4`wQ}bm|zzVQ%u?` z%`y4p3fS_!L2{L^c}EAg*Qf%N4``U1SnsH8sFUMIkn~y!g-J5Z@twcgUW=Mj*ncs{ z=Nw{Q3B{_5EGQ79xo%NMqvmt$bV!b{;C|7WN4xC@3gJaAEHh-du6&(wAVr8;EwgRG zN?q?Yr;F@cfv@y69u&6SlMo~~Ctxe!YPOZ%)|aC-s0@VTY~^yWrB>}+7cE(VAQ88~ z9^_eeu>pVyp4Jm8Bv(oI;C^7aM}LiYjKh2dJkCRo^{MkafD|EWnNba&8uif!5Pvr5 z#Mw&Nu@Hqx%x#ni!F+rNvQU3=xFIN#$*_ANhXZH7a`(L;)E{y-^_yw@OxCSCvl002ov JPDHLkV1g`eoEZQB delta 1416 zcmV;31$X+l3&RVLO@9X;6&WH&|71!400mV^L_t(&-tCy%Yg|*J z8f%(%lFZCmKAbbtG0i!1>69vTKjd=GK4-6Q?e(qi+XpU;|9{_@?&41J2+nsn>SXc^ zBTfHJW`lnEz-6792%C8rJvRXA%NK{Vkxjl>>pVzac)@cz#!>ysZxbia1lkh-)4(WD z%(FpbzLlHUszJwhjgIlP_WLvM*YO=yn1MDybOfNZ%40mMo4t;J?7yB3sjBLu{#>tR zzIn3NK7efd zQdL!UeJ9X5J;=_|_VyD@?Zsabn|Ryz1CEzo^eo3!wiwVb!}Jl@Ac5cEnLFmUw8cTT zO|ka#3flo=0;>K|?{kP>JV(GVBiz8FY(#`c;tpQ^^nX>#JriN6&*PLBjRX&TtT*_c zS<01)$mG@U^<2yIjM=gRn}a;Qg zgbWzU6o2`4Jb3mUGRpb-V#K4)bHw-9t3%3N2ajn*igytC!Wp8r%yFk zm6`S#7-b6BJD@zqVL^pP9*EVY0)+(nD;{jj4BTHF5}{-*-BljxtQ=3VH_r>YhXqWQ z&3{};MlzK7Li35#+JkH-4>pVZpx+3c(Mf$oaiZ3d2805x;Z9BgB1? z6Nk&PCMvknqW-aNTY61e?`sb=;E2F;(se&jYw@T6=h-&-0OHbC9Jw0+Ve3sO_Px#32;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^RX2Okv~B1ivZN&o-_RY^oaRA}Dq znA>YyRT#y8>&zw7#3pHr#aUTZ-`(Iz6^P*G77!6!jYEA&ZGy!;6YBKV{aLT2of zFM_^l5h{ugtqAslSE@dP00w2@7|SnE7UUUu4`%5M`V&ji{N0Mo!IP|UMIW4@J}*s4Ltca4tmwf6fn@7M7iRhWS`L39M5w8~>V ztDC)!fb74X4XLW?qyAj4Wxjc`);@r2`{ci!^?iDYZ45T!cN9fHo;;(h_HgZWJ{@UW z3vFdV6ifDAb}`PNkrjm>QdL!UeJ9X5J;=_|_VyD@?Zsabn|Ryz1CEzo^eo3!wiwVb z!}Jl@Ac5cEnLFmUw8cTTO|ka#3flo=0;>K|?{kP>JV(GVBiz8FY(#`c;tpQ^^i|3| z6Je>(T+8!}*|GwggFL?Dn;wWTR`Uk#_Ija^0KC_4 z?f9^1(gF+2^4;XH3c4QIlD9BE`TNd4>*?FI2uC6TZsZnaz=3gWjIA3>eB3`F7=5PgQ+@&sYK=$K@LCQ86m@v6f*15G=CCzrZxp zO-3`y3^RbIy(b1Bh8gM+0QWIKAvT;Pe%yKDOlqU8(yR`s5(6kOusi6D69#0-NMKyi zQc6lKavT%6W0qVkL)Z%^6so7IoXSMR#|EmZ+8qVYp+jmsu5Sn zTSCyIe85m^>*gK#+#$iE)MjnXOr2>Tn`YRr6%naOL91@{qE!|Zf z>8u=2u{X~Px`zc!md#vAMlzK7Li35#+JkH-4>pVZpx+3c(Mf$oaiZ3d2805x;Z9Bg zB1Mq)a5oJ&lhs&}iD!9_3{_t@E*0PSA-9Xd}Cv*ySBgriIOYP%`v)ZaLUrTN! zo@2b71E>(Dmx(1x6n&5^Aja9n!{n3JN+TwlTme^h8jxJ!Yu?j=i7FL<;(iTrBU>Dm z4Rvz-2$C)%uERdnP^L3_y6eC*cG20fb(RE&by2$Phe3`HEfUxbJY(a8!0=5FK;Hl!f zIy6#+QhzwclWYcCTB)7uq9w}_B;pp>1H8yCwgNEDb9zF#>fOs1c8Gl*7Q| zJmlD)I{yZcVni!uRD)BaKKcOSpG`h-rW1B-L}8M08zn+ej=zB{)GwT=fv%lU>78%f zAxE7DYMdEFuY4fa=ArSN^#e*O$IV{{73tnihSGIEP;2q10O#2@`2gb5Rvft-0AcG* zDEMBD0c+Goq+J!GR;Mbh<|2G{=gSlgI3~9DYjI%DvUNK-7O%|HyOI$#gWG79+p|YL*B9?BG%@dc mcI@IEi&@g{#g9*%?Pd7+{emJFN52cua0X9TKbLh*2~7aX12YEz literal 0 HcmV?d00001 diff --git a/res/drawable/notify_panel_notification_icon_bg_tile.xml b/res/drawable/notify_panel_notification_icon_bg_tile.xml new file mode 100644 index 0000000000..57c4b085b3 --- /dev/null +++ b/res/drawable/notify_panel_notification_icon_bg_tile.xml @@ -0,0 +1,21 @@ + + + + diff --git a/res/layout/key_caching_notification.xml b/res/layout/key_caching_notification.xml new file mode 100644 index 0000000000..ba63ede6a8 --- /dev/null +++ b/res/layout/key_caching_notification.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-v9/styles.xml b/res/values-v9/styles.xml new file mode 100644 index 0000000000..736e77a5d6 --- /dev/null +++ b/res/values-v9/styles.xml @@ -0,0 +1,5 @@ + + + - \ No newline at end of file + + + + + + + diff --git a/src/org/thoughtcrime/securesms/service/KeyCachingService.java b/src/org/thoughtcrime/securesms/service/KeyCachingService.java index d7f42a7711..1ca2cc23ea 100644 --- a/src/org/thoughtcrime/securesms/service/KeyCachingService.java +++ b/src/org/thoughtcrime/securesms/service/KeyCachingService.java @@ -23,10 +23,12 @@ import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.os.SystemClock; import android.preference.PreferenceManager; import android.util.Log; +import android.widget.RemoteViews; import org.thoughtcrime.securesms.ApplicationPreferencesActivity; import org.thoughtcrime.securesms.ConversationListActivity; @@ -141,19 +143,39 @@ public class KeyCachingService extends Service { } } - private void foregroundService() { + private void foregroundServiceModern() { + Notification notification = new Notification(R.drawable.icon_cached, null, System.currentTimeMillis()); + RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.key_caching_notification); + + Intent intent = new Intent(this, KeyCachingService.class); + intent.setAction(PASSPHRASE_EXPIRED_EVENT); + PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0); + remoteViews.setOnClickPendingIntent(R.id.lock_cache_icon, pendingIntent); + + notification.contentView = remoteViews; + + stopForeground(true); + startForeground(SERVICE_RUNNING_ID, notification); + } + + private void foregroundServiceLegacy() { Notification notification = new Notification(R.drawable.icon_cached, getString(R.string.textsecure_passphrase_cached), System.currentTimeMillis()); Intent intent = new Intent(this, ConversationListActivity.class); PendingIntent launchIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); - notification.setLatestEventInfo(getApplicationContext(), getString(R.string.textsecure_cached), + notification.setLatestEventInfo(getApplicationContext(), getString(R.string.passphrase_cached), getString(R.string.textsecure_passphrase_cached), launchIntent); stopForeground(true); startForeground(SERVICE_RUNNING_ID, notification); } + private void foregroundService() { + if (Build.VERSION.SDK_INT >= 11) foregroundServiceModern(); + else foregroundServiceLegacy(); + } + private void broadcastNewSecret() { Log.w("service", "Broadcasting new secret..."); Intent intent = new Intent(NEW_KEY_EVENT);