From d51affa86a445be576c95785dc8a638e5eb0d128 Mon Sep 17 00:00:00 2001 From: Noah Wang Date: Thu, 4 Feb 2016 19:11:33 -0800 Subject: [PATCH] Create messenger preview screen for magnification gesture settings screen Change-Id: I4824c370388c4996e233c87005879d4818cfd59e --- res/drawable-hdpi/msg_bubble_incoming.9.png | Bin 0 -> 469 bytes res/drawable-hdpi/msg_bubble_outgoing.9.png | Bin 0 -> 472 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 472 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 469 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 344 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 339 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 598 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 597 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1593 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 1578 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1751 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 1700 bytes res/drawable-mdpi/msg_bubble_incoming.9.png | Bin 0 -> 339 bytes res/drawable-mdpi/msg_bubble_outgoing.9.png | Bin 0 -> 344 bytes res/drawable-xhdpi/msg_bubble_incoming.9.png | Bin 0 -> 597 bytes res/drawable-xhdpi/msg_bubble_outgoing.9.png | Bin 0 -> 598 bytes res/drawable-xxhdpi/msg_bubble_incoming.9.png | Bin 0 -> 1582 bytes res/drawable-xxhdpi/msg_bubble_outgoing.9.png | Bin 0 -> 1597 bytes .../msg_bubble_incoming.9.png | Bin 0 -> 1731 bytes .../msg_bubble_outgoing.9.png | Bin 0 -> 1755 bytes res/drawable/conversation_message_icon.xml | 26 ++ res/layout/conversation_message_content.xml | 45 +++ res/layout/conversation_message_icon.xml | 24 ++ res/layout/screen_zoom_preview_1.xml | 52 +++- res/values/attrs.xml | 10 + res/values/colors.xml | 15 +- res/values/dimens.xml | 12 + res/values/strings.xml | 21 ++ .../display/ConversationMessageView.java | 261 ++++++++++++++++++ .../display/MessageBubbleBackground.java | 51 ++++ 30 files changed, 511 insertions(+), 6 deletions(-) create mode 100644 res/drawable-hdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-hdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-ldrtl-hdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-ldrtl-hdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-ldrtl-mdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-ldrtl-mdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-ldrtl-xhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-ldrtl-xhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-ldrtl-xxhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-ldrtl-xxxhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-ldrtl-xxxhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-mdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-mdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-xhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-xhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-xxhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-xxhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable-xxxhdpi/msg_bubble_incoming.9.png create mode 100644 res/drawable-xxxhdpi/msg_bubble_outgoing.9.png create mode 100644 res/drawable/conversation_message_icon.xml create mode 100644 res/layout/conversation_message_content.xml create mode 100644 res/layout/conversation_message_icon.xml create mode 100644 src/com/android/settings/display/ConversationMessageView.java create mode 100644 src/com/android/settings/display/MessageBubbleBackground.java diff --git a/res/drawable-hdpi/msg_bubble_incoming.9.png b/res/drawable-hdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7fed0a806a03c789de0b41f502d7ec7db52ca7c3 GIT binary patch literal 469 zcmV;`0V@89P)aolanOO1++sns(GMn9-`y#p=OE35*^du8)idcY&00000 LNkvXXu0mjfnCZqY literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/msg_bubble_outgoing.9.png b/res/drawable-hdpi/msg_bubble_outgoing.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ccc0cc8127bbede5224fea2b375f9b9376fc2 GIT binary patch literal 472 zcmV;}0Vn>6P) zyu-!80|#-;#T3CobZZP+S_0P=hl2i+wxA}L0>OePqFIO}MF+v4CJAw|Z-aK>kIU=s zy&ibBhxhZoJkJXck#S&_T*IZG-fH=f&F(?dF5&Zid}|;AmyE~HXbzL*2X2QirYzs1 z(-D8bWb(u@jIlOqH8$TYMQJ;N`Tg&xRN~9iAqW%hnA<%@skFUvavXTwCkln#)sz!p zCUa!)D;xk5iBkXu9&a!bxk0}#8fkn%#-35HZ~lUD1OtILRI9Ny7)LOdJ1~K90#)@I zgTcoCfZ^~H8jYYy%qAENzMAYC2higgp6P) zyu-!80|#-;#T3CobZZP+S_0P=hl2i+wxA}L0>OePqFIO}MF+v4CJAw|Z-aK>kIU=s zy&ibBhxhZoJkJXck#S&_T*IZG-fH=f&F(?dF5&Zid}|;AmyE~HXbzL*2X2QirYzs1 z(-D8bWb(u@jIlOqH8$TYMQJ;N`Tg&xRN~9iAqW%hnA<%@skFUvavXTwCkln#)sz!p zCUa!)D;xk5iBkXu9&a!bxk0}#8fkn%#-35HZ~lUD1OtILRI9Ny7)LOdJ1~K90#)@I zgTcoCfZ^~H8jYYy%qAENzMAYC2higgpaolanOO1++sns(GMn9-`y#p=OE35*^du8)idcY&00000 LNkvXXu0mjfnCZqY literal 0 HcmV?d00001 diff --git a/res/drawable-ldrtl-mdpi/msg_bubble_incoming.9.png b/res/drawable-ldrtl-mdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca9b14d6416441a6ebd6ca93a9d94ae3af8a639 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^!ayvMH6JIGwYpl)hnWcZ2Y-x4i5=A((%!n5UhV zjx*`<6ZoSR*p#5dCiG(V=19APMLYM3inQ53*&n~LsiywaPn-YKHy&Jdm38q6Q$9Zy z&C-b@%|9QiCfi;=VY$r z?bq_n-xBA(-#^E!G_v|NV_pB&pAXLpd0n>FUlUfXKW)R^Ygb>dtvQe^yGW<|>RUUu zgA69KV^7RDuOQKI?D6Xai3YXFK38A43-CCci)B5`U?QV;IPr63{Ml#4K%vVkgBNeK zZk;M7>iV;O2BX%}^WKxTFa8~t%^u>D$&p}k$}lbd#_^AbBhUFixwCZA6VDCd%RetV im{9nEwQ|{oui}mx;bn4-e`A0Fz~JfX=d#Wzp$P!O{EM3a literal 0 HcmV?d00001 diff --git a/res/drawable-ldrtl-xhdpi/msg_bubble_incoming.9.png b/res/drawable-ldrtl-xhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..52cb936a8ee6b84c2cec7c9dd9fc9c5a90d7749d GIT binary patch literal 598 zcmV-c0;&CpP) zHv}^`w^4CrLlmF6WBU5`094+&+%bOt4bthhs(YU+M$=MAr8=rpc!Q$Rp{gUp6(q}d zSXh|+1H&0)81pqSoIozuJ4Q#>kWRNY2PhQU{Re~-sK5UN(P(FLfOLHafCWpQQdWL2 z30Zz1Jw2P0+AN`%j*O-yadFXZvnvivSu8ea6T=v!D7RQziqwH&3>qJwtrNotBnWSq zm{>+8BQys{*S8oz7=d)%L_BVHM^yw-l7G1MaJzFPmlG+aw$iJC?0*<31!D{$q{2b5 z(b1G3N<{J1a;79bvF8w)A0b7_T2A$P?^$aI`JOUO+q2wbMTt8H>g_!us(SkGERW}f zgu};9fC>TAl+o37So4hE-Mx=w(n=Lr2WonH354ymT>hYa0?`Sti=p%Jp8x;=07*qoM6N<$g5MJP2><{9 literal 0 HcmV?d00001 diff --git a/res/drawable-ldrtl-xhdpi/msg_bubble_outgoing.9.png b/res/drawable-ldrtl-xhdpi/msg_bubble_outgoing.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0661fdba789fa348568b01299482fa29fff2e17d GIT binary patch literal 597 zcmV-b0;>IqP)*P_#)J^)}e`ilTvPBc^3uW4CXX0x&O z^ra<>p-|le)YA-yD~!bsnaioqQRn9~^!pp0qX5!0w|IG}KSw2#pL+sQlqwU6FYVj6 zy1LyHR6PE(J%|(>A3yLM6b#lotvs+)>Sr|i+iO%u5CE`H7^GnoJO;gjN~fo#0s#Qm z))uL%f208c04?j2T%b}Zz`40i`h0g%fSRz$$?tN3(&-^iOq@ys0sxYrX?}AH)MpnY zgaAfIcc7{j+fUjoqqR2}z8wo#-&An*^3M!;^Zz{9@G$q+&iLcDwG9S3zA zQi2?Nf105vHQP18;4J{*&J2aae{I)j+BM)-%QP)xYrLY=U>FDPff9)mghDrO9kv`vj3#7(Kq{ykMuUuaK j*jnTK3VXr#mizt(eh06M7!YU`00000NkvXXu0mjfUCISm literal 0 HcmV?d00001 diff --git a/res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png b/res/drawable-ldrtl-xxhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8fc747ee34eee35d224b929b3ca4acbc356d1b GIT binary patch literal 1593 zcmaJ>eNfY87%$*BipaeAu@juc=p1ae`Dj|2NJmSX0=gnpHkdduB!Py~rb~itInN0q z0^$Uj+ytEyL_XYfle%2Rc9ICi_Sc-2ULqUGl!q`~H5< z_mi5;jMQn7F_8*|Vp@8d#V)T}`PD>(%iqM4Mwh(Ik;q(W1z#w6DS=g(7`}i7(p^*$ zYiB9O|KV9SNudbix$Imi*Y*xU^DZ?N#Hf8PkIYsml9GKMigvORP{0;(ZUZ=S>?8ruF1f-L9m#fE}F*&AZHz{y3SN-R8G>SEney2Sv>H)@7s2rW!wFbo%{ zD4NAoSb>IB>Gh~yg`t>M2h)j#41!MRnT$^+;v{Odnyfm^iXfy0w^&g`QtI2|r zDHGguw1XPt>=QEQe z&ngFxX>luwo6W)CQ(#mN5pwC4vJO!r%{9g(pQjc+N7U9Quoa*C9h*Y?FKFFbh?Fb-Q4?>4yG zm9}k*O!o(Be8Wu<7l+n|ZK~*~xs$MQZ`}^JGPADtbYI`6mDbksOi}FF9%#!P{-rv4 z=!j-@z?rgh>+r&s{5kZ7gAF$Ss5z^mU=it`O*r%N-UnwK7)|KtStzaScwqng@vV_7 zGYBU?QvT5JL)`RDLo13;RP8s{Jj|-AD{0G$(kI=%bjNpfZF5ggMz+24TnqEX;2eq7>-CKWuV3jtq3klYXfz&M>Zt85^Knz5rZKj(vDU)n+>dx?3%15QmtrB zsn%+3t^MJ_Ek`Lzr@%}d#G|!S70^mW5n5}j$z|PI@Xp~j5MUiz zaEZ!-Sa>~?$IdJCFpCN^vgpEmns9*c%mz~Zq)6am1PbuG3fx}OuLXyANpT-MhCyIR zMab8J&z;J#SOGofVE~mv1GKd=yv6c@*zFxol$bKuPw_CSKwy_E7}t=tSFkbvxiO-)H)}1= zz&6Iqt@hAjJ)DUlu$a4-8wx6l-jEADtXLGPz`)U~U5r~W8?>N!qj0beQiaesf*^K? zq8S{*?MepHXfO?gW4I~>q18?YiiLPa!W-3u5i^;LrWD+SqDCcQFku>8qeOKkodGkZ zg|KF~SD@T96SB>UwuiBXmtsl1hoJ<{lf`ibp)RoIaRTSf<9I-?2jmutX5B$KDOjWD zAsZMEyM}R?Je&&{N;1ig-~g>8Py)djC`F^fAY9|1Aq|6}5W>)e636Hi3U`3Rc*h9I zGl{|DD#BzW^!i}%X$Yaz5o%qE(SREbMk5G|4#B}L`Cr$Bj>J|BZePrRD7=^=#x0JH zN1Tx_`-*BLlCVs(L6_z4x!u#29!5=x;Fkwtw~Ys@-}oY`KsI%J?4}>V2whJ;E0;Ye zttzV;ERwIxtJ9VxD9$8By&4`@Zi~b=fm>?IKH0x+dh(5*mu34N43>W6>tzI@}!BnR3P2kG3(D2iteVtN$FKrukfjn5x4$n4=Y;p z`O)6qN?zX6+&pIBMB>gI*=wrVN9uQk@pEQ2CrqrXsJQp^)LZX$bzf+Fy!+n#pGL=b z*2)icv-h<#OYX$Hd9(j|Mf|RLna>g@9*>zk;nyz@ggOcOO}sBJe5k?|&UR5HnDAwjoQt zd0)xlW4EC6fIV*DfJmA#_wKa{5&CWYHgmCk+`xs>ysjPF8|DWJHzs8pTbY`cn(A3G zSeYz4`B7=rHCytoNtvDDfkRDA0O|4hEqy7^LzTGcm&++Ut*9eerh-+Bt2cm0#@pFdcg+j+MC@#8fYC&!=r zAv&=;X>r`uit^;CecxAZKW^*lU-hKqbn%V!{r1LBzma~tR3U9|Uvi*p1{&D6*WZ|Y zyLwT^!5Ld(m(G}Qa^;?mjuQ(zmqkanTzPQk{Hd5;*SUvd$Nm0U+oRUbuqcUo>sOtD SihD{TbqLHz~p|sjN*O8Gv4SW%C~7N*h>B=Mv5F#6Z8r$Ee>m>UzW2Vjzu$L%vm0Y$ zB3aBJCWFCXX`@tndXJ=EmG@+NZ3~%KMQ^hxbv(6Xxxb^`i9IbIoT1qYx@Z z#(wQoye<|{l1>5;@kCr4gdsqJ@F0;8fuIEd3_=1v1oB~o3qhz*f|xW^oTemH zuhNX!q9qyIOi>P$&reTJ=cNmHq%)ZhAqc_;VLl9VX$04mVW%)R*X{})*PtR?xYOdG zETkRqXvBPBI!<~8gt)4OM z`!cP???N!P`%wG#xvWw^T2e#;P z6W1y5jB?J)JK*J|lkWs}TunH!H?7zA8j%v}D-CPr&)?a#T>N>`5HoG-78eUGG5=PV z`|z6POrZbQ!zXjFrhp6cIf*Mu&$X`D^3#>I?c#H`|@uzNV;pax#-~b2NgL_ z4<}^SPW>e`e(qI9A0%8=Zak{>pTb=4Rkv|}1OHmf)LGL{!#k}B$HmfpCC6Gdhwk}R zo*!-uPQqK)D{|U$D;}SLSVh(au8Elg=m=2Snb*EtJd^ohK3=?{%j|vq@cASCU1v)s z-8|b|zp3hD@hG-(RxnYX_$B=J~ zi>Yd{&5ivg00`VZ6j=I>EfK+iTWD?%J3hLw*3MzF&5~5#F(%HT{5o zjqgbGbMJ#xC}&W5&=9K5sc{CKi^`@=C6^QgwlxRG6_@GJ#$&Kmx}#jL$X=Ea$_bGU zE?(2&PGBEz{HyZCvjFA?w_`tw@JSnPJ!!cibOcF5dkXv7(>e#zCs_B-cy_Czh8-88 zJECrS$$K&Fz);l1x?8XMIGc)05qU9pv&8lb2`|4Yknh!(`)6H5BC{@N8QbO{hJsI` z%dfkNC-sI5s#g|0@!xZ}wqc?Eq-nvi9OY2kCHu(p?o^h*KWBGO+UZl;&jzc)f$dM% z<+XE8&AOexi}!nqwqDirtTE(q;$R_rc2ziQw&`;If}m(Eh=}W=a!8Wh+#86R3q=WM6tK2-*=!&}vSG84kV+Z6C>|in z2!jZ8yb4u2f*_?R5|6h*mCI9!AU!xFwo0tzRlzhh+#Hj_|kw5f6q{d^ukXiIH#_A{WbG zxeyxXMi|W$YQ*qy+j`pe7?=A-u0%oNC`FJOf=D0lf|yi-BFw3T2~a42KsAc#jSe}; zQKQk2l{l&2gloe|!T^jUS)!l70US++F)^lP(F@MvYhe*fjEi6vALr?`T#*11LUiz> zeC-6u3l||Oz5oeVAqoW@JWmcGJQ*UA2~|qIN~uzT9NHm{qf7qRHRD%wD>{y^XMh%7 zPZ4gUM~9?mWbcJmdT=LSiBQTk);ojcFfj}E-Z6Ac11k0}3YPD7a*YYt@i@plwN;C` zU8s6hReb75PSwo0DnbKn;G-$-v4-K6+euh9G#oL&98BK z&4X{7gPdOlZ9VJh3VJN>THz5p<-;OZP`LZ6i{*>*8l9Uwnd_bvDQ-3oyEq9p_XU2) zdYK>D;hAVJQk+oTvibepzMuiz-?h5QIv?>`9>A4lX7|sSZHGam@M@{x(rkO{NAE~0 zzrL2?R=ddVqhYf1HlA)@`27IW>aj}Iu(kdDN3O?1)-~+o)cPL14p-KB{GjZx_nwu- z_cijSR^&FdWgKVzl&dQ0^~k?HNl?_=!L>TIgO?7iu^(~4s`z~|k8>N^=2YA-vE3++ zuPynph9;yFomXf`+0ZXus)EpjA>cGf-mUKDVo`mKU1zq}c&G}7eV?3h(N*W2Kh@Fm zyc}pF z_AlCE|GHfB+a)BWUMpNJUH=%_iq_q1iH+hq+bW;&rzRk);KYHRki315;-+UJ#diDhhqBMgpWHt33K3)YsX2ZbS3MX&ryMt#`gRgL!@1rf^kC_ggo% zPuES_+;B4RB-L!OzgKNqrO@2DlVS?5B}!y9*%?zMdu+glZSU)boxevzb@%|9QiCfi;=VY$r z?bq_n-xBA(-#^E!G_v|NV_pB&pAXLpd0n>FUlUfXKW)R^Ygb>dtvQe^yGW<|>RUUu zgA69KV^7RDuOQKI?D6Xai3YXFK38A43-CCci)B5`U?QV;IPr63{Ml#4K%vVkgBNeK zZk;M7>iV;O2BX%}^WKxTFa8~t%^u>D$&p}k$}lbd#_^AbBhUFixwCZA6VDCd%RetV im{9nEwQ|{oui}mx;bn4-e`A0Fz~JfX=d#Wzp$P!O{EM3a literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/msg_bubble_outgoing.9.png b/res/drawable-mdpi/msg_bubble_outgoing.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca9b14d6416441a6ebd6ca93a9d94ae3af8a639 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^!ayvMH6JIGwYpl)hnWcZ2Y-x4i5=A((%!n5UhV zjx*`<6ZoSR*p#5dCiG(V=19APMLYM3inQ53*&n~LsiywaPn-YKHy&Jdm38q6Q$9Zy z&C-IqP)*P_#)J^)}e`ilTvPBc^3uW4CXX0x&O z^ra<>p-|le)YA-yD~!bsnaioqQRn9~^!pp0qX5!0w|IG}KSw2#pL+sQlqwU6FYVj6 zy1LyHR6PE(J%|(>A3yLM6b#lotvs+)>Sr|i+iO%u5CE`H7^GnoJO;gjN~fo#0s#Qm z))uL%f208c04?j2T%b}Zz`40i`h0g%fSRz$$?tN3(&-^iOq@ys0sxYrX?}AH)MpnY zgaAfIcc7{j+fUjoqqR2}z8wo#-&An*^3M!;^Zz{9@G$q+&iLcDwG9S3zA zQi2?Nf105vHQP18;4J{*&J2aae{I)j+BM)-%QP)xYrLY=U>FDPff9)mghDrO9kv`vj3#7(Kq{ykMuUuaK j*jnTK3VXr#mizt(eh06M7!YU`00000NkvXXu0mjfUCISm literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/msg_bubble_outgoing.9.png b/res/drawable-xhdpi/msg_bubble_outgoing.9.png new file mode 100644 index 0000000000000000000000000000000000000000..52cb936a8ee6b84c2cec7c9dd9fc9c5a90d7749d GIT binary patch literal 598 zcmV-c0;&CpP) zHv}^`w^4CrLlmF6WBU5`094+&+%bOt4bthhs(YU+M$=MAr8=rpc!Q$Rp{gUp6(q}d zSXh|+1H&0)81pqSoIozuJ4Q#>kWRNY2PhQU{Re~-sK5UN(P(FLfOLHafCWpQQdWL2 z30Zz1Jw2P0+AN`%j*O-yadFXZvnvivSu8ea6T=v!D7RQziqwH&3>qJwtrNotBnWSq zm{>+8BQys{*S8oz7=d)%L_BVHM^yw-l7G1MaJzFPmlG+aw$iJC?0*<31!D{$q{2b5 z(b1G3N<{J1a;79bvF8w)A0b7_T2A$P?^$aI`JOUO+q2wbMTt8H>g_!us(SkGERW}f zgu};9fC>TAl+o37So4hE-Mx=w(n=Lr2WonH354ymT>hYa0?`Sti=p%Jp8x;=07*qoM6N<$g5MJP2><{9 literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/msg_bubble_incoming.9.png b/res/drawable-xxhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ab693b3e7c19e68ba8af37fbf5d9ead9aaa7fb32 GIT binary patch literal 1582 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 E4@HGb&;S4c literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/msg_bubble_incoming.9.png b/res/drawable-xxxhdpi/msg_bubble_incoming.9.png new file mode 100644 index 0000000000000000000000000000000000000000..34130fc6d1b4a4216b93899e60a6c3c177d1f06c GIT binary patch literal 1731 zcmbVNYfuwc6pm=+QGARt3?fXI$RKKx-OU5Ck%)xwh!8{)ly=mz*(@Z5WW#2GfEHS8 zQQ8V3s8vxw>I1a40%J?D0-_Ye+9*W~l}bm@;P5Pt4rpmN2(~{Qe{^Sd&pr2k-#O== z$8277RM-M1cP9peu|O6sjiF^2{Yo9?)87tn-wU)@Muo&t3L=3@M@gI!q$X52Ak(3V zcnprJGg8{{00v{OQLBuj;^dJcjL>mV8-`=j8E7_x5fErHpjZ-40V+IEs~0mz>KmAV zRxM_35y&CAAsE+a!!t=-kr}1LGLtYw%?w-z1eip$0Ub`EfJv9EH;PPR=CoZAy|!(G zOkf&9C5f3YgNl9*i?Cr>#P=7$e!$Gb zq`i^q1W}AMbjBC0iJ2OTGKfGhJw2V1&f^edA_yZ00zzDn%VpCDwlPCbp(eK8xMJ3V z6gOg|)<9_qJz%qls)$rd%%mfIc?F$8E`McMZ=6XKoifmb8bFu>fjXV-UejnJ6@&j9 z#%s|=WrhID;~9kqt;kBicx6>7t;?QUXiW;d)9Y6*K7*j#{f0 z2_TFQL6C}#VmP18SMhMRP{yG6I7ZTV^rXyw%;;d**}NP14P&gfAF!|tI> z8l*IJ50;2EE?Pk6b)nUoYdzzEFq@xsfx}b#iI<)wd zv%Ieg6GSs7v~Y&-S5 zqK#XsIIL?QWI0fhXJAA8xa&RpElp<*c#c2x8V&#Zw-hVY=%I0WcX$eQyYxl);xWfa zORHB)W2ic3PloPhLbSU{lc~h=N5&1Rhd^s!pOlr zYZe%G5Q^>6HPzi6vZE#(9rrQ0ZW==7aU3I%h8ypE6XtC#`P#!NwP9t`?(n{n?g9_= zYNY$7@<$rW+0L3?M>i+S!t;YCSC3uBp`}4Xx2pPo4&6|Jx`Ca=e$-@5c2fXtqeZpd+Z{~)FF3Bd74tR>5 zndeAJU^)0+$f`^`ybip#an*;87Wy+VVzs2 zei)cLR9*67o!Pm)t)NIDzFp2atDpspxFnv++*(}p^yBS$M|LBR_1DKG^7^F;G3R=@ z5bk_X<*{LiR@%#1ofiB318@HnR!(`Uibs>F{6%XHHj{A++w+w9PkR4;@m@;C{npQK zXVvz{25uhx{dDtVd1t@2ppVtH>G+ecc0_(Rp5@Y36TRzZx?x`Jhm{Dmc0?6|vyc3F zsS+tpDP+}|-9`@??2;$%{9>`|vftW5t$sKX_fg`Fh1RC7wHFul)H@$@a-C!)G^N$e zf4?kbPFiMhbxrA~>vmS4t^?L$Q`*j{?1-za>vQK+zE!b&iM8-iM=#`NG3r8Bc6arz lG6AgN;eD4_u~}0N5W{&}^t>cK=N~z~tTq4u literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/msg_bubble_outgoing.9.png b/res/drawable-xxxhdpi/msg_bubble_outgoing.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd5734f10672219136ceca07a5af43661ac52c8 GIT binary patch literal 1755 zcmbVNX;2eq7>;5Uf|0SqA+*|UAfqxS+1(s$RwGSFfQX?OqEJQ4X0wo#BpZ_j0v&8C z#e-1>ucE>rP{fKY14^Zg6zo_*1Q`ycC-kg6U!J37rRj#OU0^JqBv>hVNMLsVYbq224h*U!;0Za1O@1bM59H@9zE5-28?JARm@+AqW))p^zAO^{{Dc zHhluBQG~v-MN3k)fugJ^pP!nV%1agSNLwNwl1L3!)4pMcNId6$l9d z7O64ZXmQGmoi%zHvVyP~QwV*ijWh$3Nk)xtZ~zku1h|gSadAihbA=KZ<03(bj*Ea| zp-2aU0t^?hU-9+-H+g*8DZaB){?j>AM|3+nx3A}b7G6&hVWG#zM$bv!$XtTKnEpbg zkZB#gBLxjfo-)s-#BXdIBsb7y~7sxo^1z%^Ye^@=V#UVVRs zsC#Xxt9aM%oNc<@5$u9_+wP1HuN#ndw~SoA*I$>m^!|0^rvtUm`ddFIZ`@t!nSX`z z^x^IbzkSB0aacD|>n(JXZvBR#6C|MD7uH;PG%`9k7{!@&hs1K#Z@zJ`1Ezh zoyt$S?$JXe1$rRMn)!?K23CtdOBiRS?A~Q(p+$yY>$2|kgr4*9`fB2ICf4NLwwM#Y zrnsej&8{CWZG0#G}}zACh3$|ESzVGJ1IsE6`g1gJ$l=-^1?);e*)gVMV{G}Rq@~)#40c? zvAd*?qR)Wh{;j>M#q*f&XXAxy1`Mv3%P$-o88}}wuZj>ozgpv@V*k(oWq(89?v44xE`SbIb+BXZJ;u<#^%=& zzL_?aSd`<_)$AWrSgJuAPrxQ*UztX}IXW$n6M&4Z+|cKUW1npNv-0U{gA-n+?%~A{iCVVOeJ$4U#+NN#{{U4DVv`2p3Xiz9^O%R^~Fujjskt~ z*2r5KVoO`x^DlE``I<7Xj1EayMw^PUXMseU^HD_EWqaX_>j7iRwFM8o4wlz8EY+OW zFFBDJGTzl`dG=&5nI-VbJTRPc_KfP&v8v_3-bb6Z_HxenUd!Ik`z=XTuV{MQ81Nu| zESEjMYB_7ZsK;L1XEOK{1+}|hy`SdiQ_)}F8N6 + + + + + + diff --git a/res/layout/conversation_message_content.xml b/res/layout/conversation_message_content.xml new file mode 100644 index 00000000000..7bc53e5074a --- /dev/null +++ b/res/layout/conversation_message_content.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + diff --git a/res/layout/conversation_message_icon.xml b/res/layout/conversation_message_icon.xml new file mode 100644 index 00000000000..4ffd2859cee --- /dev/null +++ b/res/layout/conversation_message_icon.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/layout/screen_zoom_preview_1.xml b/res/layout/screen_zoom_preview_1.xml index ca2ecca738c..62cd0933007 100644 --- a/res/layout/screen_zoom_preview_1.xml +++ b/res/layout/screen_zoom_preview_1.xml @@ -1,5 +1,5 @@ - - + android:background="@color/conversation_background" + android:padding="@dimen/conversation_message_list_padding" + android:orientation="vertical" > - + + + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index d94ff13d1be..c6dd2461314 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -106,6 +106,16 @@ + + + + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 90884c9b96b..f27b693bf5c 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -111,7 +111,20 @@ #4285F4 #3367D6 + #ffffffff + #ff323232 + #99323232 + #99ffffff + #689f38 + #ffffffff + #eeeeee + #689f38 + #ffffffff + #4285f4 + #ffffffff + + #fff - #CC000000 + #cc000000 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 14aac55209f..53dd515d324 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -258,6 +258,18 @@ 240dp 88dp + 10dp + 42dp + 32sp + 16sp + 12sp + 20dp + 9dp + 18dp + 14dp + 10dp + 12dp + 4dp 24dp diff --git a/res/values/strings.xml b/res/values/strings.xml index 0e7ca629610..383506e6275 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6883,6 +6883,27 @@ density in raw pixels per inch rather than using a relative description. [CHAR LIMIT=24] --> Custom (%d) + + A + + P + + Hi Pete! + + Hey, want to grab coffee and catch up today? + + Sounds great. I know of a good place not too far from here. + + Perfect! + + Tue 6:00PM + + Tue 6:01PM + + Tue 6:02PM + + Tue 6:03PM + See all diff --git a/src/com/android/settings/display/ConversationMessageView.java b/src/com/android/settings/display/ConversationMessageView.java new file mode 100644 index 00000000000..a0889c4ecf7 --- /dev/null +++ b/src/com/android/settings/display/ConversationMessageView.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2016 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.display; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.settings.R; + +/** + * The view for a single entry in a conversation. This is a simplified version of + * com.android.messaging.ui.conversation.ConversationMessageView class. + */ +public class ConversationMessageView extends FrameLayout { + private final boolean mIncoming; + private final CharSequence mMessageText; + private final CharSequence mTimestampText; + private final CharSequence mIconText; + private final int mIconTextColor; + private final int mIconBackgroundColor; + + private LinearLayout mMessageBubble; + private ViewGroup mMessageTextAndInfoView; + private TextView mMessageTextView; + private TextView mStatusTextView; + private TextView mContactIconView; + + public ConversationMessageView(Context context) { + this(context, null); + } + + public ConversationMessageView(final Context context, final AttributeSet attrs) { + this(context, attrs, 0); + } + + public ConversationMessageView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public ConversationMessageView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + final TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.ConversationMessageView); + + mIncoming = a.getBoolean(R.styleable.ConversationMessageView_incoming, true); + mMessageText = a.getString(R.styleable.ConversationMessageView_messageText); + mTimestampText = a.getString(R.styleable.ConversationMessageView_timestampText); + mIconText = a.getString(R.styleable.ConversationMessageView_iconText); + mIconTextColor = a.getColor(R.styleable.ConversationMessageView_iconTextColor, 0); + mIconBackgroundColor = a.getColor(R.styleable.ConversationMessageView_iconBackgroundColor, + 0); + + LayoutInflater.from(context).inflate(R.layout.conversation_message_icon, this); + LayoutInflater.from(context).inflate(R.layout.conversation_message_content, this); + } + + @Override + protected void onFinishInflate() { + mMessageBubble = (LinearLayout) findViewById(R.id.message_content); + mMessageTextAndInfoView = (ViewGroup) findViewById(R.id.message_text_and_info); + mMessageTextView = (TextView) findViewById(R.id.message_text); + mStatusTextView = (TextView) findViewById(R.id.message_status); + mContactIconView = (TextView) findViewById(R.id.conversation_icon); + updateViewContent(); + } + + @Override + protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { + updateViewAppearance(); + + final int horizontalSpace = MeasureSpec.getSize(widthMeasureSpec); + final int iconSize = getResources() + .getDimensionPixelSize(R.dimen.conversation_message_contact_icon_size); + + final int unspecifiedMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int iconMeasureSpec = MeasureSpec.makeMeasureSpec(iconSize, MeasureSpec.EXACTLY); + + mContactIconView.measure(iconMeasureSpec, iconMeasureSpec); + + final int arrowWidth = + getResources().getDimensionPixelSize(R.dimen.message_bubble_arrow_width); + + // We need to subtract contact icon width twice from the horizontal space to get + // the max leftover space because we want the message bubble to extend no further than the + // starting position of the message bubble in the opposite direction. + final int maxLeftoverSpace = horizontalSpace - mContactIconView.getMeasuredWidth() * 2 + - arrowWidth - getPaddingLeft() - getPaddingRight(); + final int messageContentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(maxLeftoverSpace, + MeasureSpec.AT_MOST); + + mMessageBubble.measure(messageContentWidthMeasureSpec, unspecifiedMeasureSpec); + + final int maxHeight = Math.max(mContactIconView.getMeasuredHeight(), + mMessageBubble.getMeasuredHeight()); + setMeasuredDimension(horizontalSpace, maxHeight + getPaddingBottom() + getPaddingTop()); + } + + @Override + protected void onLayout(final boolean changed, final int left, final int top, final int right, + final int bottom) { + final boolean isRtl = isLayoutRtl(this); + + final int iconWidth = mContactIconView.getMeasuredWidth(); + final int iconHeight = mContactIconView.getMeasuredHeight(); + final int iconTop = getPaddingTop(); + final int contentWidth = (right -left) - iconWidth - getPaddingLeft() - getPaddingRight(); + final int contentHeight = mMessageBubble.getMeasuredHeight(); + final int contentTop = iconTop; + + final int iconLeft; + final int contentLeft; + + if (mIncoming) { + if (isRtl) { + iconLeft = (right - left) - getPaddingRight() - iconWidth; + contentLeft = iconLeft - contentWidth; + } else { + iconLeft = getPaddingLeft(); + contentLeft = iconLeft + iconWidth; + } + } else { + if (isRtl) { + iconLeft = getPaddingLeft(); + contentLeft = iconLeft + iconWidth; + } else { + iconLeft = (right - left) - getPaddingRight() - iconWidth; + contentLeft = iconLeft - contentWidth; + } + } + + mContactIconView.layout(iconLeft, iconTop, iconLeft + iconWidth, iconTop + iconHeight); + + mMessageBubble.layout(contentLeft, contentTop, contentLeft + contentWidth, + contentTop + contentHeight); + } + + private static boolean isLayoutRtl(final View view) { + return View.LAYOUT_DIRECTION_RTL == view.getLayoutDirection(); + } + + private void updateViewContent() { + mMessageTextView.setText(mMessageText); + mStatusTextView.setText(mTimestampText); + mContactIconView.setText(mIconText); + + mContactIconView.setTextColor(mIconTextColor); + final Drawable iconBase = getContext().getDrawable(R.drawable.conversation_message_icon); + mContactIconView + .setBackground(getTintedDrawable(getContext(), iconBase, mIconBackgroundColor)); + } + + private void updateViewAppearance() { + final Resources res = getResources(); + + final int arrowWidth = res.getDimensionPixelOffset( + R.dimen.message_bubble_arrow_width); + final int messageTextLeftRightPadding = res.getDimensionPixelOffset( + R.dimen.message_text_left_right_padding); + final int textTopPadding = res.getDimensionPixelOffset( + R.dimen.message_text_top_padding); + final int textBottomPadding = res.getDimensionPixelOffset( + R.dimen.message_text_bottom_padding); + + final int textLeftPadding, textRightPadding; + + if (mIncoming) { + textLeftPadding = messageTextLeftRightPadding + arrowWidth; + textRightPadding = messageTextLeftRightPadding; + } else { + textLeftPadding = messageTextLeftRightPadding; + textRightPadding = messageTextLeftRightPadding + arrowWidth; + } + + // These values do not depend on whether the message includes attachments + final int gravity = mIncoming ? (Gravity.START | Gravity.CENTER_VERTICAL) : + (Gravity.END | Gravity.CENTER_VERTICAL); + final int messageTopPadding = res.getDimensionPixelSize( + R.dimen.message_padding_default); + final int metadataTopPadding = res.getDimensionPixelOffset( + R.dimen.message_metadata_top_padding); + + // Update the message text/info views + final int bubbleDrawableResId = mIncoming ? R.drawable.msg_bubble_incoming + : R.drawable.msg_bubble_outgoing; + final int bubbleColorResId = mIncoming ? R.color.message_bubble_incoming + : R.color.message_bubble_outgoing; + final Context context = getContext(); + + final Drawable textBackgroundDrawable = getTintedDrawable(context, + context.getDrawable(bubbleDrawableResId), + context.getColor(bubbleColorResId)); + mMessageTextAndInfoView.setBackground(textBackgroundDrawable); + + if (isLayoutRtl(this)) { + // Need to switch right and left padding in RtL mode + mMessageTextAndInfoView.setPadding(textRightPadding, + textTopPadding + metadataTopPadding, + textLeftPadding, textBottomPadding); + } else { + mMessageTextAndInfoView.setPadding(textLeftPadding, + textTopPadding + metadataTopPadding, + textRightPadding, textBottomPadding); + } + + // Update the message row and message bubble views + setPadding(getPaddingLeft(), messageTopPadding, getPaddingRight(), 0); + mMessageBubble.setGravity(gravity); + + updateTextAppearance(); + } + + private void updateTextAppearance() { + final int messageColorResId = (mIncoming ? R.color.message_text_incoming + : R.color.message_text_outgoing); + final int timestampColorResId = mIncoming ? R.color.timestamp_text_incoming + : R.color.timestamp_text_outgoing; + final int messageColor = getContext().getColor(messageColorResId); + + mMessageTextView.setTextColor(messageColor); + mMessageTextView.setLinkTextColor(messageColor); + mStatusTextView.setTextColor(timestampColorResId); + } + + private static Drawable getTintedDrawable(final Context context, final Drawable drawable, + final int color) { + // For some reason occassionally drawables on JB has a null constant state + final Drawable.ConstantState constantStateDrawable = drawable.getConstantState(); + final Drawable retDrawable = (constantStateDrawable != null) + ? constantStateDrawable.newDrawable(context.getResources()).mutate() + : drawable; + retDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); + return retDrawable; + } +} diff --git a/src/com/android/settings/display/MessageBubbleBackground.java b/src/com/android/settings/display/MessageBubbleBackground.java new file mode 100644 index 00000000000..b2e1e9701c1 --- /dev/null +++ b/src/com/android/settings/display/MessageBubbleBackground.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2016 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.display; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.widget.LinearLayout; + +import com.android.settings.R; + +public class MessageBubbleBackground extends LinearLayout { + private final int mSnapWidthPixels; + + public MessageBubbleBackground(Context context, AttributeSet attrs) { + super(context, attrs); + mSnapWidthPixels = context.getResources().getDimensionPixelSize( + R.dimen.conversation_bubble_width_snap); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int widthPadding = getPaddingLeft() + getPaddingRight(); + int bubbleWidth = getMeasuredWidth() - widthPadding; + final int maxWidth = MeasureSpec.getSize(widthMeasureSpec) - widthPadding; + // Round up to next snapWidthPixels + bubbleWidth = Math.min(maxWidth, + (int) (Math.ceil(bubbleWidth / (float) mSnapWidthPixels) * mSnapWidthPixels)); + super.onMeasure( + MeasureSpec.makeMeasureSpec(bubbleWidth + widthPadding, MeasureSpec.EXACTLY), + heightMeasureSpec); + Log.w(this.getClass().getSimpleName(), + String.format("onMeasure called; width:%d, height:%d", this.getMeasuredWidth(), + this.getMeasuredHeight())); + } +}