From 64fc83326f0cd0724cf1717ed115907fb1277f7a Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Thu, 9 Apr 2015 23:10:19 -0700 Subject: [PATCH] bump sdk to 22, update notifications Notification updates include: 1) Setting theme colors 2) Using high-res contact photos 3) Updating the notification icon to latest Closes #2935 Fixes #2923 Fixes #2732 Fixes #2548 // FREEBIE --- build.gradle | 2 +- res/drawable-hdpi-v11/icon_notification.png | Bin 533 -> 1597 bytes res/drawable-hdpi-v9/icon_notification.png | Bin 628 -> 1529 bytes res/drawable-mdpi-v11/icon_notification.png | Bin 367 -> 1366 bytes res/drawable-mdpi-v9/icon_notification.png | Bin 437 -> 1410 bytes res/drawable-xhdpi-v11/icon_notification.png | Bin 686 -> 1856 bytes res/drawable-xxhdpi-v11/icon_notification.png | Bin 1052 -> 2412 bytes res/values/dimens.xml | 1 + res/values/strings.xml | 4 +- .../contacts/ContactPhotoFactory.java | 35 +++++++++++++++--- .../notifications/MessageNotifier.java | 24 ++++++++---- .../notifications/NotificationState.java | 9 ++--- .../securesms/util/BitmapUtil.java | 29 +++++++++++++-- 13 files changed, 81 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index 662d32a6ca..596a14fae4 100644 --- a/build.gradle +++ b/build.gradle @@ -132,7 +132,7 @@ android { defaultConfig { minSdkVersion 9 - targetSdkVersion 19 + targetSdkVersion 22 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" buildConfigField "long", "BUILD_TIMESTAMP", System.currentTimeMillis() + "L" diff --git a/res/drawable-hdpi-v11/icon_notification.png b/res/drawable-hdpi-v11/icon_notification.png index e0cea95c3e8b4a24e901dc4a61f79d8f6fc36521..aa31bf571be225bf04bf34f272b2c05e758cdf74 100644 GIT binary patch literal 1597 zcmaJ>dr;GM9M8$91;IlHV+dj_IOd~G(g!7x+Vv@A7NK^^6{n_YC>4{`Bprp*DfKm# zu}y~-=Nu~DaHoiW%#CRg-F!`*z~+JOA-;xp4j;Eu=hWR&pl*M#A_ zzOZ0seC)Vb0081Gc}APCW`MsoM?Q3>dAX(aPh zR@mw_kY%2{Dwdp6RbVHo$_dmZ(ar#K{g|MDB6%G2Q%h(L^J^pndNE-i7DEzn0K%7R zB!f;BTMI!0!;+v%rjin{90Ap+3{k1nYWXx!4kJnkMj%8XMNmws#9$a4dL)81)>Vqx zjOHO*!bu}3<9ROzK@}AhvI>QaVcigdq9_E*A-P;CAf#L+&EtM4&1FP17)g#`Jzn0! z&|p|2?qqztMk07R7y{+BTAwSXxuHY}DTDmD7eZt(L{Z_m2GAUDBmZ$@STtv^^pcQ` z(Tc{lB3wQ1Awu&3c5Q;7g1Q;iE{Jw-_}N;YQ~2xG+Rbs+4LuEJa*7 zYN^tRtEA3sgpk5SX^t~Tp}=ue8PPKwA6ChAMjdJ}sugMkF)8&*liHY#==D0i3C+$n zMz|K5<8hiGBep$)?IEuIf4P`}C2^i%?F_Rd(glTO49{?7j2AQ*2C5FeYQ+f;9TrXw z7iutWBguN+B3)*dp}>JmW1eBWKwtx^RGU#$2j>h#fSOGxqJ|C1Y(tLDfJ%nAuHmvb z$kqKP7ZRL-!fo=ewuy*@UJP%a4}oxaK1L)h%nmCIiL6(H0>B8uV$|9FmyZNr&r2>! zJn3H6I5u{V#FRMWbe+9Ha%jxzmvk}f>ErYBItuK{rEhN7MSt^o>e3HhxOQCZFc$V6 zcLc$)MdPM4U5z^NsDHY*?ks;1b*E2w+N=Hg>4jxn-wy81_<56Wia!+Pw`;tqt^m<8 zqV!neAF-obt2YO`H&;9E0XG6ux0K(C>26O80=xhGLfa{R+>j8rYWa!oS6&9XpZ#?9 zy?Rm0XMyr`do*$*Fe9nC_O*>abgbM^K+QLtpHg+P=T5()Ye(1P7xR3(lIq^E-8-9G zzi4t)2nkLkSItY_^NdJ3&{UK7QTn+t?6FZ<3ns1V`!$9eU3Bwf(bnkdiU(19#D6^* znON<+oAwn18_XErez;ea<2?E0&XTSbT+>2$pI@ciO0}!GmL|wWFg`x}v_VxjyBdEn()RI4WjDXL;M= zv_7%<6wJ2xzxeW9eGNaH^+{?x?FhwDD6BWvlJ z{fn|hiu~?OcylzVqi>eVBaBW;jv`zIFdL146 zl|{hXb{bF+prR%eIy1f_zD;rd!Ah6*k$26NbxpgI7t?{bQ1jc@TIm#JK#i}cy>D3K zw*L~yrMIt6xShYP^ZxAzi#LTDEwP;mzJ6UO$+1cFIIA6KjbE^L%h4MT!#{M3sleE* HUljNoXRk~* delta 518 zcmV+h0{Q*D43z|s8Gi%-002t~P!j+E0o+MMK~#7FrPe)Y6LA>F@u$Tq^`%vVFQ~zg zNhgsyoQjLOSaqtCf_6Rm4R^iN>X!w7wx&YjAY+t%zWCh=Pe42P=)qRN@Pk zHeaXXf0w)Gp9}Z-jR)T$fqPDLEN34hJY_9Md2fyp|B7q&`J6@kz<_~RV7OxA4vh|ekI_3{u#p@Pg*$)0nSYQ&1LFa`tgUsU*MS%n&2VLidjwoMQ^z2fEzQQFK`Zp-^RI1X4$TP!p^pZdoCz(YfTql9 zgh%N5O-MM8rcM&!4Vp4by`hcN30FW6vS=Y_j(EtDd07*qo IM6N<$f>{3Wvj6}9 diff --git a/res/drawable-hdpi-v9/icon_notification.png b/res/drawable-hdpi-v9/icon_notification.png index 14840b3663b8a3ae1fc03ff6ae7da71e4b42d706..ffa5235e2ad82282ca91f3208fb3bf5fa2241241 100644 GIT binary patch literal 1529 zcmaJ>eQXnD7{9i3>)MT-uoNNUjvE@lUGJ{Fe%z(qy7jtIT*oL&RvdqDU)|2Fz3zIj zZsDT?ogKjp#b^WrL;i3?K3vc^!-o@(IE+&gjaiJq_%KHN14m52NWkm1B7YDrxqILD zd7t0&{GP8HXlkr4F)uL#08kQIO-Ho#S?zt%RG@vY6t=#gEsK?4R9P>@lx{{AfEr$6 z1t=6}+JuO}@I74@1up;?`o-p`5)C&{oD{b)IUQR%p489);H^$48LmT6AXaD-6F&I% z=`UeOqS8Ki#xAAp zb7B;RW>l08A3RGc8g7CDk}N<@n-k$MI}W)?8}4+v-S$ezj^PA~;VAAvaFQYj3d5ke z2iCmFe2j|Fb#uP7lMilJlq7|s-QC@`Zih{h+fbY&NffiAb~~bJAgP{&!laQzsv>WJ z7E+unCKXXiKsk#HD{WSMu*P&Ygm^L>eq=b2noE?HGBnL3QQU^1@pvw-8SRu35&oy~ zMD0{_Pf|c5LQ2{!b6P!O6?w3hyQe$KDQaw}wX&!ch3TXvZgX5nC?VPhYd1Dtd=ZX z!-!4#I9HT?iiI7zD@N9)!i+B*JklMhY>U!2}14Y8262 z^E}o}d6Cwkx$UFT&<>A=OGs!FC2OPe{VS0M0MHkO=$hvAFYNt?533D`ZlU4LuZE2k zV|pt%!hBt@@yjbuZ1Ia3?L5nJ75eFZsPiw|0Hx|FuXhHF-=I z3Wt_o?61dH+}#aN2eaelXU47fjn{Xi%XYz)rMJMn2P4qC%V22?Nt@KGMeTd*zNL55 z^xunki~qNaFYA|_2rSj#`J)G}94$e^hxeoUkyX!^3{8b}*USCK8pr->`Q&EtDWJ^z z=iw08Qq)m=LCyI5TP!&-1*RHDsLO+3Toh#}a@NWfM#NPSYAN%et ze!qX$t=H#64+c+GO&Zl}{;g&EtFy+BGoEta7dKYj9Rx;7!S@W)E1~U!-%M3sVwW#% zy}ajS;{!lF>-R3oP7Dc_(oc0$#)+eAhm2Q=Gsn&PDFZRNrRJZ3OCN5l06*7Hi#sQ* v3v}b>;o%>uo;h}`{=n@c*5d6JKwk`OxV&l2&w(|^b3fxyu#rAdyJ_ct+x`h< delta 614 zcmV-s0-62!3-kn#8Gi%-0049jldb>&0y{}WK~y-)?NmExQ(+jrZH!Vu2qK{nq~M^N zPA}$fJodiKI=MSCgi>H_w}ABQ3gUAv%cSpi*(r zCLD)*Z<>2kt)oM~Z#&;P|M@ug|F0nI*MC>3(T1fuB?gyYMSngg-{xZSbme%({71TE zNzSA`&4Yr0gMq?@rLE$+<LC#ymV= zAmCsih<4<2I{MndOq7Cwfx?f7lyyl@bBVJqAjrsCtQY-Yx>3R;2sslqtW>QGjS)#fMAC{htQThIdo^*R&nk* z2#6sYf?v@0;`FX>u6|g$ktu~h;Q;AB)5Qg&;S4c07*qoM6N<$f|%_t AcmMzZ diff --git a/res/drawable-mdpi-v11/icon_notification.png b/res/drawable-mdpi-v11/icon_notification.png index fab48d4c50e45a3778d81f3a5c17e726755138e4..01f9abda43d67ede69acce4116ca69a08a80a850 100644 GIT binary patch literal 1366 zcmaJ>ZA=?w9KX`ST3+VB$#9PFaAnRB+Pmx9_0Cpkdqo;4YgiMS4I#m0_ zxH;L2c9^)tOfe>ok?67|>b@8=GRLynIA#nHGLuD}8WIzOCW_+&am(tpQ1k=tlDp@5 z{?G6CfB)YpU(fS3l{+gD1gY_KF}?EIP~Aj%}~4@d!TH_ZugJzK!&Gx4O%Mi5(jCdqO`Py#_1;S+ZBk1N+u zz=!N;pV^ChlP(zLyGBL0f3(NXjSg{C2yK53*fO-NAPyxKWa64qF!3w7sMC} ziV$hYj;=Ws@cMvD5Fs$@%{mS@5P+oggxO4zhBjcp2@{4B7-7^A6m2rmI1bhyRJJCD z!gMdwxo%57+0m#ZC20&xr_=hhQ7?!QjG!nA!ws0hppy~0)JQ^NGrB}dThhS56esdY zi5C)}ppgvW!NM}=y5C_FT_Hr zTHFj2`Ilg*QxxK$m}#2d#0vso-SLi2Q#Po$l0=8caZEv+47bA9jAq->{65>N zI(IR5;G6rChkfqZW54Im99Q?(UnpCSv<8sz9h!HiyStVLDs#5#GfD!?ojlYqb<5xI z-VY}<(TC*=%G^h)+jqAF8^Obhdt*fHYl13x1XxsycU8Aro%bHIZT(Ag;As(u>PzPTfNa4P0oO)H3J7547g`p>mD>a;DNHP=d&0UU$i63BP$Ei-$$3m+;_$+cSpq!wm(3E zjr}JFDxPS&u-o6C_6@GKf-rji#$IIcQp?U6O?Eo_@q9<1DLe5vKOY0(o8hh6+P7!w zwteq1PN+W}^dJA~NcmzVIP2{B@N^aF8o1h&t!}d)kx(0 V>sRxZ11}f;bRKsP^NDlt*gu|Q%4z@r delta 351 zcmV-l0igcY3hx4t8Gi%-002sU^>Y9K0X9iQK~y*qjlsQ3RbdToj z1qDq74&l~f`3|iGB^X4jN!S-OC_+IBx+V|eIsAtNadh-S%XIekY27jWLr0csC&poqbQ`eK| za>_RyZw$vjhD`aT)N(00%;=bnj4O7PR-@#YO{I5H!vm$?Mxx+?w$h?;Ns=TS@T8x5wntB@r<8m!C?)WJ;7X|11QMK(zgb#9equ{8|s@kqQV^3Af z*(iA^ciEs_Rak4$;e;){+U7m7qiQs|j5*NXtEh5Y+u_y>M$S#!>a9B&b&PoJhun(e xaX6>l@Y0em3j3y`8ISSF)o9A37lz_Le*t8=y0!{Y+AaV9002ovPDHLkV1ilUqQd|H diff --git a/res/drawable-mdpi-v9/icon_notification.png b/res/drawable-mdpi-v9/icon_notification.png index 5886aa8400016eaf726a2a2973c3e98d220207e3..6153b25c42562ae67740e078ec459a2ceef56c8a 100644 GIT binary patch literal 1410 zcmaJ>eM}o=81GOw24i6+Oc8|R7zP8^yKAp^y^}K9UOVb2ABAagTjagFw@{(I<9a|L z@grM?vSnLb)RDMp{EER4+-!)3&4@;an<3F;7_tSI2)bl0VvT={1V7#a#r;8c$=$ur zbI04yHqipGSv17GngpmR!1 z;@FCb(docfNd^6lm|N8$W;5FenX=Fr$D3)JjpHnpn1!MllA=l4O3=K(FakwkYZs29 z=}Jflh~BkWNOIsEhM@^0+1J-+?z5Uzy`7|ao+l{_X|WKsU*_ z2FU=7sXe-k`VlHkgHi479Vlgp*a!`J7&QfSiK^TaflKrP&Lf$Ugno>TVYSe1p zBGkjZQ1R+&1Y4=J5Z-`=!oUy!R+$K~3`;OPuMl=h0ffv-A)4hSN#YcI4X@l)!PQAc z8kC8aCM1M_m9bcOmY_p2AZVJi6B5nwge*%G4?{GdpcN+(MKU!!cMVfog(ft0Twe_& ztS=XgqK(qg>YTWrL)*LQluvZF#IN1H`dx+CR5+Q8EuMXa@w2k+7%0syIC*5eGMIZM zqpa+oP3#qK(^Hl2cU6k5!9?4rI8?wNc;CgJ_nw-!e|5UYE5Du2#d z@loTUC(g9x@2|Z)q1l(0vKMA%$V}k1X$Kyv*z@Sb`ImP5S)AD4*ff}T^~J<58QUgL zz97!I3#XfJpD=HmSag+L%NbJR$?XlE;wO6!d&eJ8>)vxlrVI4RnF;6dl9Hokh2V#C zX0`R(-sh8ET9~={Q(;0g4$l{EJ#uUAZTW8}H#_-x$vYWtJvcaCP)sFi~8+<-_4W-nta~tBq_(elU>raotpZvH#&q>{xQ)nH$c6-o#XE(YuB~ z1V&z~KCTZp54&sf>ZGFi&tCUgp8avD>-x?w+Zw-~@1CofN_;Z3eRQOC>l~Jwnfcql e4f`%;Q>I_P?|!-b!oixr}xDiVMS4}r)lA@>HnwypZR~*{~16y@BfZDCpqEL`wQlP z1=pV1HEYlG4SVMQngKLvS0_~Zg7(r^)Bi90xwq~l7l?m`^?z`}lJ`K7?n{_mO%l>W!ObK~^?bN{cqzG>g4BO4)b|HfnUfYxlh z{*R5}FXy&nGyl)|KN}2Z0wIW=1r(X}fAyeiYIbD%tsg1;c2 z?41W!@bkFFDSx@y-yysi|2Lig2MUej(R0B@0)@U`l(-=@;~T`ZS^xL7gMD$HfBmr; zP%AcX-L`l(RR8kFXEmT9al(AXqZv?#L9CnkfByeNiAX_x%543Kc|c)M2!f;+{Mu8E z7G1}L_h)Qgv~KUBPc#0ncyTD^C?nP=KgG0p%c|o$bszDhidSl{1nHa*0mTOl(fxz2 Q0000007*qoM6N<$f}VBS761SM diff --git a/res/drawable-xhdpi-v11/icon_notification.png b/res/drawable-xhdpi-v11/icon_notification.png index 6cccf186a00b39a447a631d149f45c5c0aeb1792..fb57ee4460fa6c7b3c15600397ca899984336fd9 100644 GIT binary patch literal 1856 zcmaJ?c~BEq7*C)YML?krDxj_lDljCw8*=SRgpdS?NQjUTL}kdaArX>IlZ`+`EvO(Z zsG~*ks(@1!P@%2kcwhk!255CGiU-sY$J8SA0JJJqu^R;2Kdd{m``-KB@Auu`Y_UQf za6f%j>k=ZH>P7`SfH4ey(sti04S7~#< zXv4#4G*`1hnL?(-FUB;4k)?8CSUE;B#ir51BXZ0tO(sqPYCOYW5`s_9HiCdbD+H6d z@o>CZjOz`tb_};{UqwQM6T= zYsR5O+)CIi8mb<;fH5+ayH6W(0x55>1dD+xiYiM&XlzE@M9L&Wkh)=M4O$H0<6I7( z4Kop~fY0QpRa~Z;hiI6vMki1U!opN4lryI1WBe#FUx4zZ5(z(yhagf;6i3RJ@Q|n| zQIr(r@g!qhnaN73Od5R5wt=!e$`yZ-i-|3`iX<#bg2)={0)?I+39Ftk17h(=)q$XR zmBwIl3WJ@6dLOq0w-{FA+Gq=51V%EA89w3#0*g@&KN>|vuwWztG+K%xd|1rki3K7t z3XXEMAIsi*uIPWc5akTyY?J@A&6tSlMd$Xz5KxB?V}zTi*|AVVa*k);Ma`a0CJ`xf zx~}h*>8FaO7G@R}2d?rijpGDry#nX3f~qP6C5%fO7)zd4@y`W;1)Dea6r^4JQnI-M z+&tl{`OO=^AQt`7I6kMi*thId{*t04RdQWdW9uZ2l(_bn{m|Qc0hJ4??R95%zD$$4 zUzk#|$9+{~z!8_vMLzBY^#1MZhI{(pma8qCdjE^fp^C}vky9nTgd+%V%IW$k`BqW* z1cpPoK<|i=)fZpO2hG2=*8Pw^t;p5lNSMCqntUZAwd8z=#|`Xu?}^g(wQoa$d^UB) zY@@AR3LWIV3!GfFWy*A@R}ztxQM=!Dc~h3xtYh=S_g^gQnRCSFUdPOO_cylJE`Cw^ zhU@D3^G3Hev@vaCvfmwleHBm|*VvhGy!w={pvE(FoMt-KR~c*bET42TX;ww;!#-N= zP!m`v*B)*3&P(*){{1^#QG0th%6zGBQtRCewxB*4S*KiCQCj(S-q~QKX9&mdo%<|7 zLnFOo&st?Ss%SS4>Vj>gy>9Qu1h_8A<|dsns5!hcw7Fi^YFqB`S@fzbi-;&!4;-gI z()C_|*GqqNy}&wfx7HzFt;}8OawQ-0YT8^HB4tc2x^4g&8KFtthG)?gSbtgdj+e49W1fKONXT`<&Hn?i0k;K@2=%CUqz5^Y7KBFoJ7NRokzm=M@gRbf?5# zxf3&W&7WEB%c~#E2s@Ua+BFRN8ndfiE3tmYimPP0|1B@YLbKN!OI+~$C5x8LKR@^M z>rlnbU7fPf%%R6~erb^}GkUJJRSxv{l+X6Q|ND*8pXK$ZE*+Y9GQV=0;HnyLSPo}T zJ5kv5YKPk4eR19iYaMNNaJun1FX$$-E=IJ5Ub3FvhZ6eKX7jftPsf#tRv^b*gmk~V z9(y*N3D}|RI1@WQJ#T)wmt*dM-MUmi*TpRd==kZbN^3%RO|{xlwLm02Jih&>h6mk) zM^T#R(8GNf=-iiO)4aLg+}fp>nXxs#?ah}TXINK1$!mCXZpEot0Hz5 z?KqJVtP_4Wcz^DemS^`OH`c5ZD@}%jS5w|Vo~^$|#37g0K52P35vC~@1x!hM+4i&Z OpC*&aCC8)E3;qF?Z^euN delta 673 zcmV;S0$%;V4z2}|8Gi%-008|9F$@3z0(D75K~z`?wZUCzl?508;P*_9wN4ZAW^Kf1 zAw<-LlMx~{wIA}rz>6-rvjV%wqN`8>i4}&>AF^)SMe;#36Z#{f$cTyvHid{t2C22l zSQa`rs_po+gmM1Q_nqzZJQ11LXrBXK^SN)0dfowdSs(47-+wbc@Qb2KGsYdZO+Hr7 zpfL-Y8~3;$O=?Ba5$hr=`z&eQ2{%R-hOO2YZi+OXwichrM>F;OM)aCh-&YQLK#y+SZg!i;jF?s56VZq<^_;dV>d@mwm(;qbH|nuV zJ%<&dAzO^Ab$={s>F}jmha!c7_f-4Gol(u8tE#;e8R+(_YOh8$Z>lySADP&p+O!Q( zPQh;~E!q*88B=Xfl(St?rSWKiot9KO8s$8z+Kjg)5{X12kw_#Gi9{liNF)-8#4#Vc zs?w<_XGFW5)fFW^)o%0dh!Wpxzpb%C&MECT6f5LRXn((4yEjUFB#WZsMxB*K z(cMwv6g+#D3|1(h=8qUAi;!QDVTNH0N~1HAbcTFv_{k57ND$Bf@|= z>Gnq@!_u9xKEe^{=52~fZnq%K(OBjl>5fM&?@Dthmg%!3%|lVkW(%5oM5j(Y&S~y5 z>!KbnYkzLmlqu5|H8XEZ)TiLIwHuDcY&L6czHxmt<33lc-lV=rW4B9I=XZmVg>BAj z-Jc$etn@pfH8bvy*4XPuS^aDvTBplXCZzjXU#ynAA;V6Z(#RV+W9{@Bu+_t!b6Lr> zN29%LG-Jj4HbuMH;DY~L@T6R{pMp8O<<|IrxEjHzosrqU#mIPfnyhz=00000NkvXX Hu0mjfiJnsQ diff --git a/res/drawable-xxhdpi-v11/icon_notification.png b/res/drawable-xxhdpi-v11/icon_notification.png index 3f153085595d53519f8c2eb7d86fccb3d2be8de0..eef8f802c1fb9f0b4f5924f183f1c512bb3a5685 100644 GIT binary patch literal 2412 zcmaJ@c|4Ts9v@?kkTNJ_8i|Q9E3+`RSu!-po{%x~##m;?%!|PZb9ApIt)%WLOSGt? zR4CaR2RYSE>U5B{NpUJ=N!dE5?ohh-kM4OtpZ9&9=l6WSzy0_5y!n1Un{>6;XhR?n zU6v=^U%7fNyjmK{Z_wMiP0D38$Or`kggd}gju?Qr^Mug=oR!Fl0sH|DFD>Z?;0%GN ziui${U?_Vtg)2<7=PY3CrHLXX8v=25m5MmrcmRY)12KF76*1m?4FTu#sE7~;Hij*t z0kM3~bTJT+?i0vOkLQwk2v--lvy`G#kO+VrxHK_AAfZU9h()~=<$ghoM!**#U_2G^ z#i>xXADku>18@g>2NV~B!@`MVd#r;4k%+T{<1knP8iPe+@hB{rLLg8u82Hx*p|mFE z?V$M6nO|)wPgF!K2#P3ZbZTm zUpKysmIS7W0JJ|K5hjbd%6jauTp}xT_xFYtfJ$#DzGA+zD4Ybkkei$c2tXE{icsFz z^Y}apmIycyh&T)i%Oep{glLWfD%ugtMPax*NYNxbp2Hy%mh^m&??EGy$V3L2PQ*K6 zu?&I-fkC7@Vm&!LJ^!sTdX?VhRxyf1q(vtLZQCIO$WsM6oAJR3lrgsnWpf+;{_H&BNK>BGT9wN zT8x0qWRS5$42|GOBe~Pah_77U_p;8YaXr(jgg*N%0wpkJ>dvRg=Z3vWyZ({@q zl(QpN4#_Pj+XMnpKggoH2TBKDgvaLv1sO)hjLaVa*A(HpH&o@rZ+TVzI=@P02mty8 zE0@(*Y6eGLORrW~F3(s^e}BS4o#j%I%h(baM#t?B4tzl}swxTl7r*WL)tweG5hm!F zvbsB^lD@Rr_S}xv=a0Hl`y(^XHT1hgUJWlPPFgvjSEjXBjo&K}X*R+h9X*v~_54m1 zq)0v`$IJCZhNR_YXQ%xtTqfXB$RqVn8lRwc&#;l6x?Y8n!`R@AxgYtC-pL;SV zEJUV_dg045m#t;plcJAX^(`;c=z$7VyJa2RPlY=b`xLet`_8v$fg7a8QvHFr`jwZn zz1v}HnsLY#Id8!U&cuu2=s4p>lkh669UdB?-J@DtoSNlx`mp#jVQ?M4b)3FQbXFYqs=m?y!%q8 zk+G-QU0}p;W4KzA`mqgN9XSee4lHlmylPVhO!st7ou+LsThZko9$uBqqe1Ux4BSG( zLg6U{q29f9o)x#`H~fFt47-*KV^weln@D3OEAocI*9KJtv?IlDvh%s|hO!TIe=ggL_y9#T-6wC>b`|CRW zGaD~|%)IP;ygaSgyy5ah@ZsfnjW-6LLtjp1ukA6N$5Rtxf0@SAOhiqMU$DCVhB0qR=Q;kbGZm*52P<%32eZQQEK1*sMMzS25O~e>_lKKHAcAvhBe@Nmhi~V4O*A-gea|quA*( z*9dBC^MNhLcD%iv=Vo?j?iK^y^gy4U<g{12aw71XVJ?G^h1r?W3Xid-)YSve4VHBu*ubu(w9%GkOOr&_Xi zo_4A%_^sNl(tA3kh>l`S-=_xxnOx3F-a{BxG&ryO0!>yzCr zYUQ7Bk-DX)T&=08osSBOVq3aaJ-m1*Wzr!Pc&ae}o znb{i)du2D7yTR$bL%Q)F*d+4BRV52MbwGBgYwHh;zglC&3u!8D@xoc#jR-HCI6^S;r9uNv(%=D#!~nsFFQgL{AT! z$PFWC8E-R&nLh3fHpt>RPT|jI+!|ESO&lNy37#d}f6!V+2+jd={RKVDMS^vdBGaG< z+X+K2C1yb{5r39nS*jm&KVj--kzPs%M?3^qzY=r+crdFdAy64ORVq?DkP4V7ZB|=Fn^9(n|IL5c-e{=Z4+vzS*{Ms z;Rn=SK@4{l-KagP4yq%G${*w-##_XnsPvKT9+X8pDihQozV;L8hgEhv|MOf+BiTixG=Z&}=e zEVf|c5_P^lh0`>;2MLvoqAyAP%=unST%bS|BpgCtFVUIP>oCzuL><(CzT@`kQuHOL zLDWI{{DiJA?9(@*?=Y4+$n3R0Zl7Ji&*-`n@d}Dy@hN)V=dqbR%^-R{Cd(1zSUKa& zjej!~BdLNcgeK<3GYFP5$hjQ42;V1I>Hp!pfbR&`SxWS-7FO~*;Tfe0!O{s5Di|aj zQ#9ybzE}w5oFEL(Bbq^W()D~x&|bsBGQZ+1U>`wxm5AR<;4B_th#*YzVo>+?rF1ZX zKM5WR?%rMyR?~^OA!-q`Aazuf)$HRe`hR|;BE0{OSwRzR43oY#u0^my39=s>qm+$w z(#2tp@e6~D;AWJ~_Bpd4gJrXnRkYxA%yHQla?s`9;01E&B M07*qoM6N<$f=&DL3;+NC diff --git a/res/values/dimens.xml b/res/values/dimens.xml index c926c1f826..dbcaf72ee6 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -9,6 +9,7 @@ 200sp 0dp 1dp + 64dp 50dp 230dp 8dp diff --git a/res/values/strings.xml b/res/values/strings.xml index 18e909b185..a8fd663fb0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -435,8 +435,8 @@ Lock with passphrase - %d new messages - Most recent from: %s + %1$d messages in %2$d conversations + Most recent from: %1$s Encrypted message... Media message: %s (No subject) diff --git a/src/org/thoughtcrime/securesms/contacts/ContactPhotoFactory.java b/src/org/thoughtcrime/securesms/contacts/ContactPhotoFactory.java index c41d3bbe38..1ea3606023 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactPhotoFactory.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactPhotoFactory.java @@ -5,11 +5,16 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; +import android.util.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.util.BitmapDecodingException; +import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.LRUCache; import java.io.InputStream; @@ -17,6 +22,7 @@ import java.util.Collections; import java.util.Map; public class ContactPhotoFactory { + private static final String TAG = ContactPhotoFactory.class.getSimpleName(); private static final Object defaultPhotoLock = new Object(); private static final Object defaultGroupPhotoLock = new Object(); @@ -86,12 +92,31 @@ public class ContactPhotoFactory { } public static Bitmap getContactPhoto(Context context, Uri uri) { - InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); - - final Bitmap contactPhoto; - if (inputStream == null) contactPhoto = ContactPhotoFactory.getDefaultContactPhoto(context); - else contactPhoto = BitmapFactory.decodeStream(inputStream); + final InputStream inputStream = getContactPhotoStream(context, uri); + final int targetSize = context.getResources().getDimensionPixelSize(R.dimen.contact_photo_target_size); + Bitmap contactPhoto = null; + if (inputStream != null) { + try { + contactPhoto = BitmapUtil.createScaledBitmap(inputStream, + getContactPhotoStream(context, uri), + targetSize, + targetSize); + } catch (BitmapDecodingException bde) { + Log.w(TAG, bde); + } + } + if (contactPhoto == null) { + contactPhoto = ContactPhotoFactory.getDefaultContactPhoto(context); + } return contactPhoto; } + + private static InputStream getContactPhotoStream(Context context, Uri uri) { + if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { + return ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri, true); + } else { + return ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); + } + } } diff --git a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java index 123cee1fd9..e13f6ece7e 100644 --- a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java +++ b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java @@ -53,6 +53,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.service.KeyCachingService; +import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.textsecure.api.messages.TextSecureEnvelope; @@ -181,14 +182,18 @@ public class MessageNotifier { Recipient recipient = notifications.get(0).getIndividualRecipient(); Bitmap recipientPhoto = recipient.getContactPhoto(); + if (recipientPhoto != null) builder.setLargeIcon(BitmapUtil.getCircleBitmap(recipientPhoto)); builder.setSmallIcon(R.drawable.icon_notification); - if (recipientPhoto != null) builder.setLargeIcon(recipientPhoto); + builder.setColor(context.getResources().getColor(R.color.textsecure_primary)); builder.setContentTitle(recipient.toShortString()); builder.setContentText(notifications.get(0).getText()); builder.setContentIntent(notifications.get(0).getPendingIntent(context)); builder.setContentInfo(String.valueOf(notificationState.getMessageCount())); + builder.setPriority(NotificationCompat.PRIORITY_HIGH); builder.setNumber(notificationState.getMessageCount()); + builder.setCategory(NotificationCompat.CATEGORY_MESSAGE); builder.setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(DeleteReceiver.DELETE_REMINDER_ACTION), 0)); + if (recipient.getContactUri() != null) builder.addPerson(recipient.getContactUri().toString()); if (masterSecret != null) { builder.addAction(R.drawable.check, context.getString(R.string.MessageNotifier_mark_as_read), @@ -224,17 +229,19 @@ public class MessageNotifier { List notifications = notificationState.getNotifications(); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); + builder.setColor(context.getResources().getColor(R.color.textsecure_primary)); builder.setSmallIcon(R.drawable.icon_notification); - builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), - R.drawable.icon_notification)); - builder.setContentTitle(String.format(context.getString(R.string.MessageNotifier_d_new_messages), - notificationState.getMessageCount())); - builder.setContentText(String.format(context.getString(R.string.MessageNotifier_most_recent_from_s), - notifications.get(0).getIndividualRecipientName())); + builder.setContentTitle(context.getString(R.string.app_name)); + builder.setSubText(context.getString(R.string.MessageNotifier_d_messages_in_d_conversations, + notificationState.getMessageCount(), + notificationState.getThreadCount())); + builder.setContentText(context.getString(R.string.MessageNotifier_most_recent_from_s, + notifications.get(0).getIndividualRecipientName())); builder.setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, ConversationListActivity.class), 0)); builder.setContentInfo(String.valueOf(notificationState.getMessageCount())); builder.setNumber(notificationState.getMessageCount()); + builder.setCategory(NotificationCompat.CATEGORY_MESSAGE); builder.setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(DeleteReceiver.DELETE_REMINDER_ACTION), 0)); @@ -249,6 +256,9 @@ public class MessageNotifier { while(iterator.hasPrevious()) { NotificationItem item = iterator.previous(); style.addLine(item.getTickerText()); + if (item.getIndividualRecipient().getContactUri() != null) { + builder.addPerson(item.getIndividualRecipient().getContactUri().toString()); + } } builder.setStyle(style); diff --git a/src/org/thoughtcrime/securesms/notifications/NotificationState.java b/src/org/thoughtcrime/securesms/notifications/NotificationState.java index 36db7a9f38..f0d51eec11 100644 --- a/src/org/thoughtcrime/securesms/notifications/NotificationState.java +++ b/src/org/thoughtcrime/securesms/notifications/NotificationState.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.notifications; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.util.Log; import org.thoughtcrime.securesms.crypto.MasterSecret; @@ -30,6 +29,10 @@ public class NotificationState { return threads.size() > 1; } + public int getThreadCount() { + return threads.size(); + } + public int getMessageCount() { return notificationCount; } @@ -38,10 +41,6 @@ public class NotificationState { return notifications; } - public Bitmap getContactPhoto() { - return notifications.get(0).getIndividualRecipient().getContactPhoto(); - } - public PendingIntent getMarkAsReadIntent(Context context, MasterSecret masterSecret) { long[] threadArray = new long[threads.size()]; int index = 0; diff --git a/src/org/thoughtcrime/securesms/util/BitmapUtil.java b/src/org/thoughtcrime/securesms/util/BitmapUtil.java index 0a1c1a38bb..0b189f6ef3 100644 --- a/src/org/thoughtcrime/securesms/util/BitmapUtil.java +++ b/src/org/thoughtcrime/securesms/util/BitmapUtil.java @@ -5,27 +5,28 @@ import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.RectF; import android.net.Uri; import android.util.Log; import android.util.Pair; +import com.android.gallery3d.data.Exif; + import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.mms.PartAuthority; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import com.android.gallery3d.data.Exif; - public class BitmapUtil { private static final String TAG = BitmapUtil.class.getSimpleName(); @@ -230,4 +231,26 @@ public class BitmapUtil { bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); return stream.toByteArray(); } + + public static Bitmap getCircleBitmap(Bitmap bitmap) { + final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), + bitmap.getHeight(), Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(output); + + final int color = Color.RED; + final Paint paint = new Paint(); + final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + final RectF rectF = new RectF(rect); + + paint.setAntiAlias(true); + canvas.drawARGB(0, 0, 0, 0); + paint.setColor(color); + canvas.drawOval(rectF, paint); + + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + canvas.drawBitmap(bitmap, rect, rect, paint); + + return output; + } + }