From a45d09ef5c4997283bb411b2e4ca117cbdc25780 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Tue, 4 Feb 2014 12:32:51 +0000 Subject: [PATCH] Show whether identities are anonymous, unknown, or verified. Dev task #52. Known but unverified identities are also supported, but currently unused. These will be used in future for contacts who've been introduced but not verified face to face. --- .../res/drawable-hdpi/contact_connected.png | Bin 1432 -> 1316 bytes .../drawable-hdpi/contact_disconnected.png | Bin 1429 -> 1133 bytes .../res/drawable-hdpi/identity_anonymous.png | Bin 0 -> 975 bytes .../res/drawable-hdpi/identity_unknown.png | Bin 0 -> 1416 bytes .../res/drawable-hdpi/identity_unverified.png | Bin 0 -> 1429 bytes .../res/drawable-hdpi/identity_verified.png | Bin 0 -> 1009 bytes .../res/drawable-mdpi/contact_connected.png | Bin 689 -> 682 bytes .../drawable-mdpi/contact_disconnected.png | Bin 605 -> 484 bytes .../res/drawable-mdpi/identity_anonymous.png | Bin 0 -> 362 bytes .../res/drawable-mdpi/identity_unknown.png | Bin 0 -> 708 bytes .../res/drawable-mdpi/identity_unverified.png | Bin 0 -> 713 bytes .../res/drawable-mdpi/identity_verified.png | Bin 0 -> 531 bytes .../res/drawable-xhdpi/contact_connected.png | Bin 1521 -> 1094 bytes .../drawable-xhdpi/contact_disconnected.png | Bin 1417 -> 1168 bytes .../res/drawable-xhdpi/identity_anonymous.png | Bin 0 -> 853 bytes .../res/drawable-xhdpi/identity_unknown.png | Bin 0 -> 1470 bytes .../drawable-xhdpi/identity_unverified.png | Bin 0 -> 1565 bytes .../res/drawable-xhdpi/identity_verified.png | Bin 0 -> 1139 bytes briar-android/res/values/color.xml | 1 - .../android/contact/ConversationAdapter.java | 14 +-- .../contact/ReadPrivateMessageActivity.java | 18 ++- .../android/groups/GroupActivity.java | 1 + .../android/groups/GroupAdapter.java | 32 +++-- .../android/groups/ReadGroupPostActivity.java | 26 ++--- .../briarproject/android/util/AuthorView.java | 51 ++++++++ .../src/org/briarproject/api/Author.java | 2 + .../briarproject/api/db/MessageHeader.java | 10 +- .../src/org/briarproject/db/JdbcDatabase.java | 28 ++++- .../org/briarproject/db/H2DatabaseTest.java | 109 ++++++++++++------ 29 files changed, 197 insertions(+), 95 deletions(-) create mode 100644 briar-android/res/drawable-hdpi/identity_anonymous.png create mode 100644 briar-android/res/drawable-hdpi/identity_unknown.png create mode 100644 briar-android/res/drawable-hdpi/identity_unverified.png create mode 100644 briar-android/res/drawable-hdpi/identity_verified.png create mode 100644 briar-android/res/drawable-mdpi/identity_anonymous.png create mode 100644 briar-android/res/drawable-mdpi/identity_unknown.png create mode 100644 briar-android/res/drawable-mdpi/identity_unverified.png create mode 100644 briar-android/res/drawable-mdpi/identity_verified.png create mode 100644 briar-android/res/drawable-xhdpi/identity_anonymous.png create mode 100644 briar-android/res/drawable-xhdpi/identity_unknown.png create mode 100644 briar-android/res/drawable-xhdpi/identity_unverified.png create mode 100644 briar-android/res/drawable-xhdpi/identity_verified.png create mode 100644 briar-android/src/org/briarproject/android/util/AuthorView.java diff --git a/briar-android/res/drawable-hdpi/contact_connected.png b/briar-android/res/drawable-hdpi/contact_connected.png index 6c9f76c4522f49d5239cb10ade1d8e5964427f0a..9fa452b33cdc41c6771b7df4bd6d24c60458d851 100644 GIT binary patch delta 1284 zcmV+f1^fD#3#1B=Fn<KzNkl<ZXx{CaPiRzE6vn^rzM09)Bs0m3wVDL7QER%0;yk2_ zQd(;fq^m*}N}$l%g$to>11<}0UAS<eLJOfT1a}q0e{CsP<UP@Jp_tM(5C&?UNoJf( zGBfXfUE~E6t@-yxEzGx^H}~H2yXV|@&p8k1sH2WL>SzOE)PEDYuIorjlI#J{9sXPc z@I=yr@B6_U3s5K&vH(U%ZU@i@AR9iaNSY-%1z^(iyviE`P$(4QBzH>MPhywEge(Z4 z1;B=XGXP>V5UGZQdnB((df@wh^R)rEuDeUpL6SSIMSQ+&D)FSM?;Wn~&b)26gb)A_ zt3BpFKb_6o27l0(&e<%fCV&SdFMFPM@09|$u4^P6BKZj*)GH>)4+Z7XljY+QYw@J* zra}DaF|uei>!wPho{QtTQ>AGqm&#fPAS7KSdBO8M+jf9Lp^yadIf?hJ<w7E*=Gf`d zm+>y8f)+)-d`<~+Vq$ZV^@(Ho^Nl*=#waP_7XaV+zJI^aHh@B*K$2ep`f#r3ls@}r z?xUeSjX~omzxKTlY{1g=oy5$g6TLTk`-42dA0?gjeP64c#aYXe0|NtNfcDK5o!KwW zmqz=Co7+gFq?LF6c~4NrD4iP&whVu~ICN{G+e>EbI{?zfVsSEZfI^`#Lh`V+Y<xOi z`JjKexqnR}0Aj7i0|>_~jZbB5X6tY({rj(7e;UJW0|Ntp6pO{bS2K@U<)KXgI0y)d zl$t|(8iP`F_lE=w?P&}qQfdN%q=Vs_(EtG0PI9<jF~QjB(h=h*FHz9}P{vVy>~!f! zy<!3Y!vMBN1|aExwMgWLg4uYNlIsndmBK0BrGI38D43O)0B|4@0M~W9NsP>wO=a|C z`FPM`gu(Nyf)+J;vV45LY$||8T-WX15I}fg?FNttS}0k|CsFSFi#%a1p9C$G03;;s zc3szO!~-b+J8VF+?`U;zB4sn}PLC5Qo7s1?y4MCY0Cq@9ts6j6Cd?|E-J7(T2C=s1 z_kRYl?oHYZph>b1z)LqR_Hvgp4WL&`S!L@L)+x)GY;S18x;^mPE3TDnSm_MROPX8G z=U<`Sv2e{f0P`CGr~;S;5U)MvBiZ(ckt|xZ$9x1J9<E*82tXacL*vNaIFq^EsGDlL z0UC8vy>TXU+c>h49)>oo55V_*3*at*hJO=7-Wc^rQ2XK?GDba440!+zl6ONJ)_)WG zzFz}4na<hl#qr!JC#JStWKK-HIG#I|&e<%$Nze0YQ6+O%NHt2+PG5783riUz6y?qX zLUWM|rD><n7&IhZi833V0&qW-wa&z`{5c!2L@L5$PP73_6UXxBmg;2O4_h$N0DpL% z*C2TrAR2YXr|%?Y7-1lh!1SHOOry?tSma;!Jg*U@2jF?$q@?S{D0%5b@6GZ|tVjy$ z4X5R>A%*fxta#}}?@eQr1aRH={pd?d0O;@U{|&%f$&B8;HPP*D9d4zwTWs7IrPo^2 zFNe)vUf0z3U*~@4?GN%2eg^Puv3*!<Ut7g>-6Vj|0sa5lDo+*ohU6gtku<gdT$OZT zrFVX(wfG+paY;K#?gzB0<}Sc{0ImUe;CbHbYwo@PCM#(q>?rh+e5Sn)V2b3M)n0$W u`EW=kB|Z0n13=^-I6CU6qmDY-kp2bu44pSGze%?M0000<MNUMnLSTa4)NKd= delta 1401 zcmV-<1%~>h3YZI!Fn<M7Nkl<ZXx{CaO>Z056^5U4=Ytw*EXo#9lvHdepd30$B?p{M zkuHj&MF20mOHsf;5oDR2e}I-nU?9JtAB*g=3W5agsx7?Y)RB_FOiWY@*JCG=ZBZ0Q z<P7iWqT`@#?AVsb*bBZ(a^}wa+>g2Ez5_GOG}BBo9YZqd27jX{a#VFrL_%P``1t_n ztLkAK$K&S~pw((E0Ba($3M>K(#a}&Dy)Pm+fUS1B-Ft2TTCJ8RB27hqDJtuLk77`A zz!sMo1Q)>qBNg2g<S(k)iQ_nXW&lwXt*hz<gr?-;IRhshRY&Q;`GeBn+#t-V*&@o= z+x7b8PPsRKZGV2`@A$#EJPy>=45cF?AGO=<%^wsXiXx+`ZzB9kRMZTN>96<iZf|Ti zN6Vv=cFv-%x)@wQv5X~`+@wbQTmIdZjg?Ng8J@CbYgJTGu87F{?RMKv9iY`}%^_R_ zekN9i!{woLFL%SVnf?SA71QRs?J6KBU;sbp1fMl7HGlf0f0a~?mVm#b{4tK>!>94% zJf(R-_#N<bx91M;T)g9UFL%#oKhBncQDIWPr>ms6CeN$+kG}c!H=#3d_9|B^xh>gM zgi5Ve`$v)_(*da0>%Rql;r85N_xD}@_FK1K!J~v?kw;p86o|#c@4eou9=>pRuliwi zXiN4*pnses$=1XHTCLU^!f(V%cIV<9_x4-2Un$-$Pip=DK_1*A>C5SoIW#-rR+wRE z)a&(sCQ0)3lQd(VaMAj}1yNzRJd~U7+-x8?M>75}5W%_m&dtVfc_^ZSs$M9bIT-+8 z72%v280lW_h8pMsicV|?R8#|9=w9xIW?%&29DlGnF#tv1kX-!!djDS9OkYLGC(`@> zJqk*mHq%%8>-~F@i?8S#69I^#XkJv-oPm>WZ*0E=WYegjiZ-+DjqR75fs=~LS`<a| z#{wuetn+}MRkL(dA1wiPYWBg7>Z7Hsnx%lRs^_C9GRGN#062?c`mgm}8(2lBV*kNh z6@MF8?Z4J{Q4DZaRf8h~sOkw|5hWiq2NiYIouYjZP*>eSb5KFaMPv~;aby4yDT_!2 z7-vh_Jm%>(z9Y%tWJ}pRFa|0jQa;WIJo6LR<2*cW4GdIu4{*F)?*Pkq>W(dAZ`V60 zs)RjYa2$Yr;68#|?v(c=mz-%1ih|^lmw!9uJp>oHUwAk&Kni??V8d%+Zc-yfJvpsK ztR^)QUJG*stEyiW9*zbO$FT)I1xDVE7x=gQUBFBQ;XiE}|CYb&?RWt&5|K{}4@cjL z<2XK0(XDZL9IR}td<l5pK5p^|-pa<xm*es{P|>Y+yL~W`T1b#j)YVbA8J-L}!GGrn z?xc%31UKjepNE^_Np*FE^2sEt(Hkh&ZP{w$Qll@a^d?=*Nh-a@rAFVDtqO9zh+rmj zph=QsT(8%AD*98m=UQjr?DbynRllv~kK6lTPrrA%Q@L8PYSf_oIgaCGVgLoi*R@*h z1cqkiY9&8>;qYGia=L_IiYXvRn140`*rgAauAh1LOm63FNsudX9ABBrnYdP~eTGoA zCA(VvusSq{W@o>(AL0=J_K7eaq!WTGsq|03ce-=t-7|T<kO#nDQT{NsLw%AY)a&&x zfJIxfFNRxTcIx9(clV?HUS7@XMe?TK8><KgC<UG1i{{(Sq;j=l?VK$Ee{w_lQyj<n z)Pt>7t7SywO+_aXYzcBjRo{QyJAW1}J_5p1)h5DIhr2+h-EKd-aQ7iF3#z(SBnpcn z@;~u9a6?3%uXz0->%$R|IaU462M%E3A2?>3X{MQGI+p$o4T!xPl9_X900000NkvXX Hu0mjf=ya~$ diff --git a/briar-android/res/drawable-hdpi/contact_disconnected.png b/briar-android/res/drawable-hdpi/contact_disconnected.png index 4a1053fc7d3f76039fbc93c9fb1dffd1fd5e2af1..9de4968499c5c464a53beb423088bbe7c618b5b4 100644 GIT binary patch delta 1100 zcmV-S1he~<3+)JyFn<ImNkl<ZXx{Ca&udgy9K}CpMw6&92{oa-2TG)hf{ns^&_!L; zq6ltWTLhut|5RvKZ4q3%5hRMxc2(|eO{yqL&F+Fh@JEa$I&-@43bv-0OlC$Gb5`?a znEU;nd%yR7&pi(Y7+`<_2G|7D?E&k$ZrUD^Gz#p<Uq1tuY=6IqF}6Nh0##Lw0W*^J z0TaMj{^^PBN0ROV^C5&M9}R)3s<uixVEZ_57#IQ?KwDDVHu<@cpI3o7Nmp&(i7~$X zU<B&AK5Y9`CNK=Nfycl@NsGXnnH~owZBI%Xv)uqzfIE^dhY;raN}#UmhV3(wPWbf{ zk4U-?T(kYBq<`nOUjc9Gy(wu6FbaGQ9Jjq!(hESgXC++>A+&o=psK17;2dyN(kk%O z_N5r(^$m`5OwwuFJ9F9n2K*Fbe6f*nni~u%N#6orNdmY5d>3Q9wb6-4DJ>L55hZ;J zl#-?;jTc4nM@p$T1j@2J3w#YA>6+~yVvNr^t>2W=a(`Ktzvt6xTGAe1drE1(>jbK* znvwL4?U(r!`98+j-s~xsQgT_AbHE-+pGf+wEX(^Tr3dTze`B4Sb_h6?AD1Lu=w!qF zA3_LiNf&G{*~a#%9J4zFfPIn<+8&m4DTJ`t?G7G7Sd?@L7zPdk`?^NJ_Q{<5LI~kH zJwgcKx__hvNyEU&t`Ml}dIvBAv~AD!L7&aqZrh&8u{$S_8`hD0PCo%|_BwmpH*>5Z z+ehlUZfs@+wgLO|X|)I}^<f2;vJ7bg`)zOQm_Y856Ovkz9s;j=uJ5H+SxdDfO#nMP zCLn3Mq;a5S`|(@ark7{|k8QVraY@@ZvjT6EA%DvU`mhhy{M^YNSk5!wv^{RS*@yg_ zS$;ROG+*8ffv3QuJlHN^OCJbq$+4O__S4M}cn;jP-I6qw^?a|(XH?RZq?YZwIfu>& zWU+Q5>;5rGhx)Jrhis1ltCDWKPcXi>6KA<RZ@XdpL>~y8$a&3&5Z)`**DL0(04tKF ztADCG)~n3xx;~aKHY>KTbW@Gq18(Pw`02W?r+Se5l<m_w#_epubca9)VO7%Q+z&>9 zvsG0!x|Mt$>ueqy+m}NKt6ja3rIa2NMX^)T0iXoNilUfHDS4AK-;i_;_%i1+8)ICz z>fKOdDvIJSU{cavNz=gYqA31ODJ^$eHh;i*;Ar-WegS^$*`+?EL|K-%fC<~XCG7&f zD2iewrL@q2t#aP>?wrT3z|S$p4GBhdTC<YQ0Bags!1JssTUpCAbB7(3^p3HWFEJN8 zF$wx&E!rNJG--P>TPPpaTKo@*t+o$HI&S;0q#>YTyUlBZ7uyX<jZAPAm;<f?cSS-7 zAI{uegUp!ind~S`Ncxw(4&0OUaoOu@?2o3T5!>&)-~hV*f@6RI1{h#~P2nH?su8Yg SyVsil0000<MNUMnLSTaVhZ1W5 delta 1398 zcmV-+1&R9Y2$c(vFn<M4Nkl<ZXx{Ca&5Kl58peN5bu68>?e1vHa4#5?7z|0;z`f9m z36cz&fW2@xkRU_{;(suI#_R{iEHoh?%+5u-NE-xaHW|*z*iIx88M8Z(Cc%%kHKkS0 zEOI)i>8`G>?v5_%g`(=-I`_QqbIyC7_v6Aq1~QO=3}hXmjenl7uInM&+a!$u+w<*v zz=G`uF~;_D3!tj1QD9QieqbCJ&41moeM`~};A#lr&T|8xs;VuL4%j{n90Zy`1L#QV z*d|{$@^uTClXTJc^%&#BX9l3I>w~tBW&m4(4saXzLDD?1w9;e1gzX7QqqZBsPr!9a z7eWYgzbSyau74Z0-<Nd6KQHk%NjHHnZ2w2necO+KC4V21^a3yfya61xy-(5uK(=Qk zoeLp!HXT4!Roj3Mfwv^JfV;NO#~3fIah`W19kab7yWPKlPhyM@)-un~8kI`YpMkd} z0bBw87Gu1&)`dtZeODAkl=OR`l(bjUSWy&TrIa=YKz~`5$ALcrNczI|=@{d^e*HJ4 zv{;tqzcX9ymGlxYoKm{F;Q*?tnw0c`?T48~{vKoOte3@7N-oQC4tPn@PDwA9WqC8D z^nEYSH+np@P2gz0T#)oxKL>6l2_bYOeP(;XHnxvuof`uH*e~f-+gl}_4<XENbOa9} z%u6~CY<~q_1@`yy+zY)7vi%;gRnpB6!le~l>>q%E8A)eD2!5IXfD@9Y0fi9$v<!$# zbzL6;_5tq!*VerQbzN@<CV`Ia*={%`{g^raR8>{Y$Bb`EIwk2a@M8wLlFZuf*q+R~ z`v;H%)|;89?*LzS89rlsJFqBe3OHHUwerfJw0}Kidohoh>9X5jXI)L(Z`O6)SdR<+ z4tOQA)jY7UVnmeA+HPj!+ma3eck_RTfJNIwz-8cU7o7`|=54<Sykh%G&SuxX135~L zOKMB{0eIBq5E?jR`%7Th_C4G0N_saNFf8dyNoSruA5SgBqnt~%C5;0+`gS2n!;;2; zwtwy0kL5PYN{q23>9p+`Nli%)frr@zXMocogw`s%-Ue>lZUbYIhWiGPQ{g2r<n&=R z#zN8)&o2Fb{9dnmS9@kP7Fx_JKV*9>`*62t-2_en(?AQ@0&K}i-?XGB*r`i)FqXe> z1B>eca2L3hC)?HS(C0+&BruhgZU;WM{eSrqI{{OYPG)B6Ml8Fs&Ra`F&@X`dz_+&B zl6L2OekC~p9LncqiEYm1&*i*}ZQzik6J6YAMAB|aZQI{w8~Ou~leH_^1x6*k-sQkg zFR=~q3){pP4V=mMhVz)|E^1%5JqolWU0E$*Ts0Esbor|7hV3J(6h}KHU6k|$+keCu zTeeRF7lEC&ySdPjY}eHg!m6oyPZe2R*RR?Bi=?LQkJnm#t)WzX2lxnR+5T%Ug;KBC z=ndeTT!<g5>w5Pl7{A;0v8>~p+=AJdbUK94l5`>a`Ur5ms;b6D8K37mp6AB)g&qRl z+A6Y?()UGC?2vQ-D1p(UDCSa1UVrDxHza)s{2|*j8)KZ^l$y9GivI!=lJ-g33+yS1 z;(sZn#eUr;`}|wES9BRTyJ<yzN{O;8uL0w>_ek0WOch1(Q%dQ(KH4fD+1``w_$Tmb zjPcQ?H@2#(YDjt?ShleR+|OBMJLfV(Il_)e`c-2q7cuAhX%hS<twq~ol5Zw#PvjQL zvu!Ot1!9Zs1CkEgJ}9XPG;DWrgBRNkNsSD!1<d83c0Gjf?3%mFfEl$tnL7&OlAdU< z12-f+U+wi}&c~3XZMJ{)f&<v_7aRi_$Up`%kafxb0fzv&xwr+qp#T5?07*qoM6N<$ Ef;WV$%m4rY diff --git a/briar-android/res/drawable-hdpi/identity_anonymous.png b/briar-android/res/drawable-hdpi/identity_anonymous.png new file mode 100644 index 0000000000000000000000000000000000000000..aa539d31b7aad168d93e4d2a45a28a6c3af18c7f GIT binary patch literal 975 zcmV;=12FuFP)<h;3K|Lk000e1NJLTq002k;000;W1^@s6S!27f00001b5ch_0Itp) z=>Px&iAh93R9M69m(OclRTRfR-}zz2U?+_fWYQwI5R^$Bb6<m46v?6+cdm@!(xu%h zxYbQI{R><QDcQJlQwm)a!J2myv0$>2tfti<bkt1JcINA%uVs>UCiCJ%63l^t_h!!f z%=eyq?m6ediJjPgW+8-92%+?U;urEbOPZ53cUTL^*hh+A$Ps-3iR~o29;qcsA|QEm znH(8@DM$2YZQqatZ~^#nlnbyu3*5+VN6rUkf!z8FLq@*<)PXhIYqqDe??$z|1xa;a zE&EJ|5Jt+kUC*@V;twmL3bcWiq?V+%?dk}#r)s+mw1AfFwxsF^v!^PlEvc3LM>|{7 zXabZ)e?7+7P1Ce%dp+CnQCVHmdW^9fW9$O!S;mfP1M0wfnx;?q!|E^fq+u2OlC9@~ zQ^1Ro&j8~#ladyC>d|fB^CSsx0$a8=fj@vhCAUF$(==`EDe_f`zI@vYJ?;bfHg{u; ztv$!6uYS-Zu#0bdD1NCY$~Dl(g`$74`N>^vmd1ShhwoQ@-5b?3O&<VX0lal_=9LHA zdQJtGBpTh0UYGbLOXc1oU$YsCA7dQI2S3FhrT$*NcJFdhmHY|tU7E(Ve1$N)2E1?U z>lk-u&vE7#d!3ri=1#3vy9HdHnwt8p*=+tkWS6LeKC)SeF>d$sYc`uZQ&Us7Y%bSo zwW0YTgt~P2e9%IS=`OwoJT#xB*|jX?pB0$0?MsrXX_{WmIrh(IUGZ9$^3U=qOS%N) z<|j!qpLN8(`XBRcS7VG<b9FIEOOnp+(+;bW&e~o&z}UY84CH66{y=<S$@aebGYv}z zX!9=GY=E}<w@<cgHl*E0b;#yh1Z~(HDu0lE(7yaae{mWsmVJ7BveS8zk~2vqgrxHL zetfdiDVBZO)>!`8<aqE04T_a+hle+>uigiEXKrR%MSmgrv$x-!c^Tm5_0{{`4iACK z0gk}2;176N^*MLB^G5wb<%Khy54P?VYBpa=Xy<QzdhxxP=3kq|Z?W%y&jFkHY7j?; zFVUAj=xzSIq=|B+`|5V9@N-;A7khrY5@wQ6u5>@NIVI^Hu$puHKU6+&9{AV%K}W1% zd)a0&uB7p)X?G=!phaNWcH;nDtYLc@)R%9wC}|mJ<gY<)JkmB;zoh*7LkQ&%!bFal xV<JhCat{A;k|Yy3^h|^h%11^2iJjQ+_7Ccuw4?9iY1#k)002ovPDHLkV1hHr=coVx literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-hdpi/identity_unknown.png b/briar-android/res/drawable-hdpi/identity_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..b098e93aaea14e2c907662ff93b1f09f314f8bb3 GIT binary patch literal 1416 zcmV;31$X+1P)<h;3K|Lk000e1NJLTq002k;000;W1^@s6S!27f00001b5ch_0Itp) z=>Px)LP<nHR9M69m``j}RT#z3x$n(%_&22jmMI0J2~aJxo%d)6RbwjA5Laj-V1fw? z7aBDtl4#;qqY|SLqtQe*8c4BS=)xES5?G)F;k}kfQrIX2WI(H6!FD<`?;aNn(AJLh z)fP$QOD1`f`{g(Hp8MT<zBj<FxD_`nJkN7I&vXAzd=n>GV7tKfsagQZb^tdOKbAnX zv}<Z<*G$FaecvYl|MH{Hn}t7afvU5ujgPs-)sMNw)z#V7dnS7Ul3FG01F#RkiYeHG zRsj1*#^R4lpa#!3x6>|PNG)DSExw($sloHjB<`*u*$CiR`LoRPyh-ItYLs+LQY`+s zl5#RL*15%vDIk>sQtRB}#+=NINvxi<q(K1v0Qw~jl1xux^`uD-lI$=4#vp+7qzTmK zlvXv+wi(J8$~4fnwK=6#lemCJlE=d^v|$)p0LK9|PT~eM0yrK7!Bu{_Vy_$Surf?L z(EJQFSHSFoP*Wu5%!2A>LQCtY<dxhyDme#wX6=gXgBQUw3F)^aah|}1oY)tEXM-T< zA7!y=615Vi0hk5gHd1o|OqWn2Y0I$mqX1s^eXj+;fW$rkzXP~PYEZ(tFbw-g9iud$ zG5G*%0F2;E8W-OkrgFw5o?7WdYwx11BanBAfqAg?4uBE>i2?wZn(<7cur>nlE6nMV zFkL|EN0~EUmfSBQU|YGAhg)n$!ban$SHcll_PJF$dhomMpGNOm7=}dvuK~cyw(On7 zJd-qXNi^GtcLUl!nlC8>a9sQ#2*%AHVRx&1FD>Bd7u>>g^~Nr=y1KebwR`!T5;$$m zsja2t`vg8Z5RBa2YgOc@Nj(MNs~`xE#k**|1^|yp+!ltx4dXk*lTPPyL(A*tAN-`0 zEUq+BQ?*h0vV;``;$`hlS@ZMeLh7wMY2Vu$bPra%>~p!Hy1KgWB|M+WWPZuza=(tV z18yYwgoG_&80M#n4{%Eu2KiA-96Pd}zkZ`z*xX`li%TTN$|(uO9&38Gmy&OHhrwqt z+x`sz`bq9Cm;6{c36c*1NC!c%Gp4m~C_Ccr@{z5`my`~}aAzzRI}difUaWdE4-8ex z$pb^L7pvYp4|YwU?e7Gz;GgWaZ1oEybxy#%IwdW*j-98=bLfn1^Czs~rbMwN38c!` zjQ{~q`58z8sZEJu%L!{H@M<6j;7JJsmF*b=5>ApMuYx#yfCK-qP1ogD6evSm<rpn8 z1O&)|SQPU`anPYCL56^1v?xPc6~8xOm6Ooy=`~SwwdAvY%JclxmG9GQqR2^Tw#5I8 zUr`_nRMiN}T*!4Lo;K#p)>3lk2c=|JAK33ebRoA!SZ0B$2^@ixjZoUZr>6h__qAu2 z(a|fUURrg3b`b#V-_ujD5lSdm@qfXu_}@sAiI&WRtu2Vrw~n*-!#|TdZliYOLF_M0 z+w<&<!jtz#QTsgD+9ne%*$o_wcL$+f7H69pSEOdnjUFBN!(=49N`gaw^0~GLvbjrr z&gYQM0;&hlH&uKR75Nnf8UmYot#k5g@#Aj>6I~aM9O^xHZTQo7n_CYZO%xx$gL-%f zY(h+dBrPXdok-cm`F`_5*d25X8-B;j`d%Vs*Grg1@(%z#F)L^}fPc-ec*HJ=OLs-? ziwCUx#)Tt?dPk36IC7}>fOX&46}c~75|>WE#hN7@2G|jH2jSnk>Fywu&_VJrfaVFj ze>DR*ETJMFU<b*=<=j|3O2YHJ>KHvoweS0h82Jg`_p4*fr`q$p#LY7QTX8GKAAbSE W&DerCQbEE10000<MNUMnLSTY~@SijQ literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-hdpi/identity_unverified.png b/briar-android/res/drawable-hdpi/identity_unverified.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e2486261cf419e1a629e08bf671dc5034334c5 GIT binary patch literal 1429 zcmV;G1#0?<P)<h;3K|Lk000e1NJLTq002k;000;W1^@s6S!27f00001b5ch_0Itp) z=>Px)Pf0{UR9M69mR)QVWfX?rGe5iAmTuc^OS{|BE~zb*R%mBXXa!9%B!rlV0i!`A z276%>?^Fzum}m^v@Dnjyn26p;B3h${3r&O?O==Ngr-fi!3=OPoJ6mW=S)tqAotfiB zDVCpNC)pt;_FT;*XP%t*o%5aZ0dp}I_bn7fkrYLd{!e_tPBJq!F;kOM0-WX(Q4@eB z#|#SkjkQ6)vDPU8PV!Y%B>?K=qe`>=ZuadqZ$-`P&tG~10KWNo#bR9lwI{6#oaO@$ z1Ne!E0ALw_6KU(9ibczWV6pj7b$P0?x;#}G^qWg67A+IfRk_oARaFIMu3_drX6^$} zt0;<)HiP;jQr7k@vCUZ-?8(Yt&-N{`&HWK6D_sJd<^%8&QJjck0Ac{*0K924XhT!H zp`kX>C<-iy0t*ebiN+00@rHC&?=+v8YXF=Lg+i95X%>L9L{wvI2C1s*l|(MCC@~6{ zkvoy3yhMuf^SxFeH``oPS!TGVax2RWSD?Ubd11qn)gv)s&@J<b$HiBOFxEdH4I3s! zL!nUYwiWA@C8UL)G7!}?Eq2>6@&a7MOc?;O0r-fx06-={c>vy@mVSnr-%wSh4!}4w z4Febj@D~xsnK3lQm!`SwcgfuR)MN4WOCLxE1OXGWgz@qsqm(4TOaaWq03eH;_2Fw* z*0TYGhonf#K&EBEbLyOHaQ|2HzBNobaHEx{uUNlJw$j2+8F%uT*$>cWLF8U$oMMZH zB{!cr-r05j_O1wpLMZ_60>JXd`h}?pa*@Ci5tdpeJqYl@DgG_%Ze?S=*J674lkKCg zRF|g~nAS~sGc_*&Koo$!uzc~Q_k8;W;*UByyJC0CcABp!s+WkH0elw<X?^wvxl#>a z9Wx!!w12w)mKoI1*%d4HnR}Nv7wzu3AP>+iZVN;}&jop4d2`Y3VxPHprsD4he^MCj zW5y;$QEFyu&SWla0%+fKbME!)P*<-$`%d%KSJyl;Q721~@0OD?kUH|4r~9n~IeWUh zLSNYVV@~r`RecUXjG2#UnwFZu7@3IHFtb<Fv_rPG*wCoZwsA*6>$Nx~X3Du1r^Ln` z1+7D)LYv*q;xr$?m&{!9FYDY3paj5|w%5EKc2jH1SY3vTJ(EKaJUJ8i#xs!NVoz(! zSe+hrlili_<^wDO6b5Mg9tU`w8DS!bwhi*mPq{@2WuiD)yd*Luk~EP>Qd|_7n8Bh5 zh!V=Y^HXlyH#dj*%;Xkj&dtm-&6`K6UiB!7>X~}a%ri|<=3HiS+cwCw;11-QwX(#L zBr)~<DGzSl={wZ2%hwjUEXE{>NtRd&<eRmo1=|9g<^%9pCX9~u?j!)LY^tv%k>4cZ zZ4ImH%K)IGy*p`{FaUUFg3Q=jYgZL6ee%)xR$q>l^?7^dk56wa{NQ?A*x4JF4(~eX zy|}<{WLGUP$`eWA$R(-$kN)U@o$8(D2LgdAW+V!IC6_A}7d;b?33Y7IE`WY9Q}p7( zs^VbYywY=`glr;Y=(--YWl(9Uf1St8!Oy<W`t<FObM_?0jvpNv9<;7q9kh&zfm4T% zRh^8Eio+90D){}p96cY7YIX!T%?|_uYXB@1Wv(<PgdVLc^mR0<Te_~Bx~?B9^p&_o znO8F-NJKfhuAjDLP+oq?rjvcHy(fBIZR4ZIhweDz$;fbcB-nW_BAqr2dR*7_AM6Nl zn(z1fw*WW_;E2|xMebM<QC$xN0=-1U%)HtbUr`iUQIs4Tca9uYRb?CbvZ|^%HtNYy j6h;28)IS$<G5h!%wEA1&#&Qzi00000NkvXXu0mjfwM(EO literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-hdpi/identity_verified.png b/briar-android/res/drawable-hdpi/identity_verified.png new file mode 100644 index 0000000000000000000000000000000000000000..02e819fa1023e98c5124d9cdb17b9ee85629c766 GIT binary patch literal 1009 zcmV<N0}lL&P)<h;3K|Lk000e1NJLTq002k;000;W1^@s6S!27f00001b5ch_0Itp) z=>Px&t4TybR9M69mrZONRS?H#-rHw;*Y(<oi=B`tu2R(v)RvRokO&nKiV#v&RM86u zdMM(+i3=AFoDmgL4@gKkAffce1x0{}Dg=cV1d<!<L>veTq9G=Y>n5p-BWJzdkKxcJ zYJx1hl2h3tb9&Mn{pLUOX6Nk#IIshIWTt7Fq-mP;f8sMw5eQEK;i-K)fi~oOs%E6m zJ`Df>bMW<k=x;}U(;bwEj-`gr8Y9DJjgdt6SgO_H+m+u`fleexnbPH^`qS2Uf7%*X zy4}=?<S1*E_;%(u<y0y0;K>Ws^CCcg5g`A`3)S<L5)Za2fp+FMRiMOZeXJ*GWf&*M zII*6jl}U`&$6D6@ZOq>p(z>pz02Ei_ZdCG9w^PS1$ATyq^jIinr{YOFy6qcJ+R^BM z{pRy$GS4{{u5key+(%{G#JiOe+W^2)E|;t9xnfmBXbGPPO8I<#7r&MIALj2Ah=_U_ zgV&BeZN6|suRn<hH72MgtF9afQI}%@5Fr5oFiy(pw<|B#HgUqJFvGPlKm>t5bG~2a zKbOBDg3AD~D*;68MWlV>@0WhQ9iUh&ZuCChJ6rl)$j2wlboYSW<5wueC6Ha`J{S=Z z5s(PTbr859*&n2k9C78Xd+hf0j}A={!3ViqesyoFwvwNJgnYg$$ZF9X8j0QbZZc#g zpEc8R*bN~*;3DEf-GGRI_fHOJeObCS^?LMDPtyAEr)%>@qwl#B`FwAXrNxqauX-!H zK6mslB|?Xz38$a2fBOLdI5t`fSLN$h-VeXKxI8<xv{-WgYv^?vzu_(B*f2eFQJu65 zG#mL?2AVS$)k(*OX|Fd+r|=sVsJtRE?cCNN7bLb@5r6=I9;^YlAfcVx8Z56!o`32( zh2L;P3A;Wu<_<9l7!d&DgmxWkj)ex}ghW700;a~?Atmhkye7~o{DzNJBJitmC&MKY z$N|=GN`)UjKJ+ah(8L>?FGdHPK12{|+{qAu9{{#IJ*+!~&l?4JLXV}7J!8Ha>~h1u z%qUl;--%3`RrcQI9sXtZli<1%A#wPKJ!n>$u~Cq&tt{VO^^!oR@EdjzA`BOQ6Kg+z zs!T0@ANZ_L&Mv^6o$bqCT^i3W-SGX`m$F_$gkb=f^^!oR@EaDWw#kmqe<8nR{LSVI z<!pWLexaOQ2+Te8$J$NlDi`pI*BQ~#d`;7YrfK13{dHXr>$)yH_zPXv!yfd6HBA%k fqW{1Sta<wf?UTV$8BtKS00000NkvXXu0mjfkFeSN literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/contact_connected.png b/briar-android/res/drawable-mdpi/contact_connected.png index c7fb72a6d4c947ae698fee1275bd4427477986c0..22c0771bc14f2c4c8d8b31eacbc5b0f16c3126ef 100644 GIT binary patch literal 682 zcmV;b0#*HqP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00001b5ch_0Itp) z=>Px%WJyFpR7l6|l}%3*Q51&HxiixlC~Yki6KrU^Xkrb7#VwJr1OpouZgk<#z(3%Y zl{<feD^2W177$b8O2xS*O)xc(K+DI(Kxk-dI#cG}<AVB;LTOPFH@xec_c`~TbKVPZ ztuDe|4|2{8L<|rS06<d+adIVq>?9xY>TJUIFs&5C000<+L*1lJb3hgBPr~_Y0O#2S zw~F^}&$^@IbMBoRw`2kUpt7%()>o|J*Sxi3h3SnD_UlUnIL|%|4a*1fk85`aNBxwN z06?wdNWe6JqaA&F<!R_+?Ld1eg#F??AFWg6p<(&x{*&W{(6GFzd?W<KKkHHwsXwBk z>FH)_Yb{_5MdA&|aW>k$*m-Z>sN(GWVr|L_tDurdh-Yt#2&g2I6;{Fd#oAP(inG~C zKGGH7)!9U5#!U<+{A4HdcF17DPiAJ^gjZ)17XmovhVNl|Y|hOnd1}yg3=vRCfU!9@ z<9nFqoEsehh!{``V$rxv{%UA1B7|sMCY6F1A_h7FT1)g#YWHaGL6b2!tn6tez)Qf8 zpt7fx7=uGZY<2_)Ax?CYHrH3JBGUkffVx)<#592QRja6*v}xP+$%Rv74yZygZ<UYA zdWmU-7eP+V36IKpshGFQ=71`6T{LIksV7n+#%{rgrKg)IqmKfl&W`I(bGORAFE54j zN@7mfLiDuBj^k_$MdG-%7BJ%DelQqS(bL}jjtWf&tnBLB%S++6t*FTL92G6dm!U|! z@%dGscl=G;>yHrWCiVGEY#was8}FY7-{qf$J}8N~PUinVuCL<5xmH*G00SZ`93OmX Q@c;k-07*qoM6N<$g81b=jQ{`u literal 689 zcmV;i0#5yjP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px%Ye_^wR9M69mN8G;Kp2MK@33MgBuE8SA|Zk)gJosuiLFw{!cd8S5GlW)106ec zEJJ?*D*u2D`WvF_f-F}GOOU}!p%g=6N6vj6>Va0mI7un3ly|i6{5|*i?tKrKX{JXO zO)^PJSqIPru$DgR0XR}h`40*prQBrjOVadI#6pW$3>XYHxu{J|Ech#dJ}IRR{wRQy za*e@nL?kMGr+<CcKC6Z6p)pz<tpH%-!U)Qpa#Gu^otE5ESz9_J(0ip+Z)yN3<ueAq z<^tb%d){i)i0S}_zszL-1O`yBx|VOZ>=PQ&Jb^war9Mv#kgoh)T#sXS-?hOoLH9s2 z7=+l_ay-*FO#;2m>V&xGTiaaVo7}~JE{VV}-F?^Q0^cxrJ8QVe+HfKg3*Mf$n!EUK z5Z<1*Dk8BUrQ94FfWaGmr+*zaqWW0HZ$U(jsNQ$_*9_hm3qVR)CrwL1J6K6K+@u-? z?O=s8Ev4R(y8}%T3l7&q13Z~orER2eJv2ltI5n=^0BaP}AX!YRQ<Mh?NEVYS#Wc9( zn)y$`-_TtEJvO;$To?g(imx+ZTo?hHTuk#KH^7lLHB~y5Bz3q+e*srIl|-AG03788 zP)hkM_`JGXJq1vhq6dZQZuOJ}pWl^~BI6hzmfTX=>RLW{f-W%F>RNuuEtLs$IJOZf zr4F>Euk4n60zy0%M4AV7%RbSTzRHScagUkp(2(YxEyv3ZaVw0{MBK?5K9}_}2!ijm zTCF#CHTQh^<FbGG;?hW#k|zL0cgFFt6*ONpyT&)8n8xv!|NBDnPh80!@=`j}OpmS~ X&#p>ZE%_4!00000NkvXXu0mjfQcN$2 diff --git a/briar-android/res/drawable-mdpi/contact_disconnected.png b/briar-android/res/drawable-mdpi/contact_disconnected.png index 790357f4e5d8e306028516269cd39a708f7bb017..bef15c40b285d783f8586d6e0af2476ec8c609d7 100644 GIT binary patch delta 446 zcmV;v0YU!V1mpvdFn<A_Nkl<ZSi|j>KTiTd5XFCr2~;K|XS0ydVnO3{HbP<4FG6dB zg~Xah8e6`I8VmUXqXi9?C}a!I5IRgWv6&X`k4MmiSKiIMeLFilZ()NC){Lz*Ng`4P zYCy$4jevowj#nx`M9zQ{U=PRvU-oMU_y*pAdsV&7RDg(7fPV|12#kS8-~|XRBmnk- zBcKdSfooMA{aS#C902FQ9O$X4M#Kxy1PZ{7sy;1?&&AmJCGY{XRP`-Nu=n0O=N^DV zpy8Z*_TJAH#cxOOwQT2YRsD>6t`^(2+}5(#?TCgeTG{7GyW4VlK+(7oSKt(wM4fqr z2n8m_6<>he^M3&7XE1B}KwzA)D^Rlr9cCb4Xk4`<0xC9S!VCn2##Kpk3s#Or0!B7o zgACRPjBAucz`$mEH3I=v;~K;kV6GMd^$Y~mfpC#iF6)6ipk%W>6)d-8T*(HJS?UyM zibx^F;srCM=`wqcx&>WxwT_776D*zwI+oi_?S|g_nKyIp6=(p*&N=VB_c6+T1?-v~ o5C8Xr<WD@wR{1F1V1u>e2XLOCIuZpqjsO4v07*qoM6N<$f@SH)a{vGU delta 568 zcmV-80>}O21Kk9WFn<CUNkl<ZSi|j>ziU%b6vsdPnRF2Yak&Jt)**{$bFm#nU0vO~ ziX<&qbP_r=4dU9})isEN{RfT?S>hN?xr33|$);6s`4&oe$$N>0D&z}yx#!&PJMW$! z-wSiham84e=8&0{fC^C7RtIRgdv~S*nArp19&iI#0)EQ041fFrz5;LEz4=!IFtakS z4HSSb@E-UC^yE?mZUT3J63_?g?%w(10L<(b@EAA+4&B{T{0-Ow^1v&1|1i#fDZ`&X z1-=0_cmI+WaEvjA5Z(c|fz1%Y#~9<uDF4M2zMB4g*WCwM^D5t6ovn@YT}&ysg0B5^ z((2ZkL!cn8M1L%g;kXYR59i#>-l!0(?tZSl6`%o>-2LIDAl%H3#nsGw1M2f4aFk%~ z0y&^=W~*kl3e>fiGzX4=qBt|BprQh8C)ldM4`2;=p|z&HYJz`TT$M=zC~L^{5^{SE z?5NkTYxRMhi<AtZC$91|T`+Tu3ZSC`Ehf~*3b3yZ`G2le0QO}YMp0ayNdjnTwy!7H z8kchZT<fAH8VUaE;%a3MK&sXQHWJJwU;u2p`<c6+Nhb!f4Pyi7jZ(^mltJ_ec$qf; zQ*_}8@OqR&E{>UGO;z`nndPVWcwVB^A1BXgU2q^(+cUG=1Ru`<dpdhCwHn44PeKTv zflc6U2r(hX7-NQOe+FEW9Jl}P2gyJ2B%9@<bdEW$9KQi_tJY0y@LUoA0000<MNUMn GLSTaQp${|w diff --git a/briar-android/res/drawable-mdpi/identity_anonymous.png b/briar-android/res/drawable-mdpi/identity_anonymous.png new file mode 100644 index 0000000000000000000000000000000000000000..c91a016de8d6f692e8850f77156e4b0d5af82852 GIT binary patch literal 362 zcmV-w0hRuVP)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#300001b5ch_0Itp) z=>Px$BuPX;R7l6|lub&+KoEsrWilJZr62(zN6>otfh@8Q3gW^$c%(UiHxMu2Qi%tc z%`9BRy%@yFq}?Pij3F5XCoTA(p?Otb)7{n8z`raO8`;b|18exr_^E!KpY)vm5WpUQ z((}BsD2no%w>K&el2=`G+jzH0I08&+jJyKacU-eHE6msO=0T(vbtO{(ZzARZko!E( zUu@t30IE#GSO*&}jFqZPH~q2swp0Phq^GP2$)G1bD&HpgB(n}bBk6DPc6Z8me50l^ zH5Omo8VkTw!|gXRugddw9>sbYgqn55Y~kHaLj<CyJf2L=*~h!wI1VI?^m?_FI}ymx z26oN69cv`w;Q8_4X}0FgNS**l0Nf7jVLYCsY|&(5EB`0;35=}H+p&?6Z~y=R07*qo IM6N<$f+AU;m;e9( literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/identity_unknown.png b/briar-android/res/drawable-mdpi/identity_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad29f8a0fa134f02856cdaf1de831cce8158b28 GIT binary patch literal 708 zcmV;#0z3VQP)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#300001b5ch_0Itp) z=>Px%en~_@R7l6|mCs95Q546&=iYgfKgfk)Is@8Ri@|8Z_ukA%E_A?zEFl6H1-Wq% z)hcM^KTzv7Wvv5uZu&{>2KqVP8Hy;C!cuUg!BvUly!Y;DGs5UFDmDWK9k_5g=X^N# zd${Lb;J@u-i&(Z9v21g%yj`?f@?yK-fON+Oq&xN(JqQ(7&G?D}TFq#4m(asqLJzl^ z(dIpLuLVF3K(4s2313lwExnP5@In#cg>31K?4f%JrBqTWl?0He74IvmZ94=#d_w5Z zI#AalxZ^0Cm{Ux;D4p?m&&ks{O$!Hr{3k8GuRuIjN-b~j0QWJ|F940g#}0d#E2%RV zja%onO9p^dB0dOEvKl;XWSp_hvzH9#-Z9c09s?lSER`9OfNv}oCLQD2bCr2o8n!IE zPa3?MdY4w)wKdjb*`7m<>9k5#gWq&YzZnbP^{>4Q3*D|ahakY1)nf5_p?<KCNzGQc zw^0CorPS*R@m>H0rPOq_cv+g@EibLSIDBOCIO)NF;I`73^5ln`PJRD+CiSCIce2^+ zQZN{l!C>%IHk<vrrT7qld8O3nYVu`6oM&=_#GS=^Q(QohxHHe>?mT<!vc`OwS7RRF zs`F(68o=Rz)J+C6-m*-kwftx>BOrBC130{6d8Y1kM$G^~yvMo_jafqgkj|(XX6mjs z@7wAaH42FpO}`(o|Mr(PdFLk)_t&{MuIR$}s8LAV2VQM=03wiO+U?TdbA>!T6ao~B zTUR}Yo)B#rtSazj0^WGO`YG3l<ucPV8@^}2t!Xnl6(GL6i}$;i1Qt{8(-S4W3EQ^2 q0rUcRR5RYTZQ8{TN&A)mC+!dX&{>hV{oh3Z0000<MNUMnLSTaD!A_q5 literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/identity_unverified.png b/briar-android/res/drawable-mdpi/identity_unverified.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8a13d4bfe10e6a710842ae079324dba4234c2b GIT binary patch literal 713 zcmV;)0yh1LP)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#300001b5ch_0Itp) z=>Px%gGod|R7l6|l+jC*Q5eRbvu|4~=PriEHn%ZjHnB~&z3Q5gcU@?DQP@pHs276& zLtO-he?mq<H{Av0MF!EGf|YhQtpqK|p~8&a6)v}Z+uKE}bj>aMq6~WAh4a1d`SG6T zobMdqzYefk{1j^OQ|NE;R8*xox=O{t-t_QbZ+iGw7oe2~;3>xb4Vdd9)@UHp7Y$_k z%ykj#emiUBiKrex3P7qj-k%2g+eUb)fqAKc2m0Ga{xnZS7s`!GC5jVl&U&@)bTH#d zZwr&lmUoAmvK{_oIS&B5erHI;-x}xFH<h&`Cf=S|IF#5(=^sidH-8roa5uB~2%tu% z=N#unLQ1(<thWh;Jq1-50Bi}twSbtGQf`W`PR^fg>%B7c;YP@pbr<pgv)JuaFmwtK zUoozY-LZ_`pIUshv#ym7hpAgJ@YekEn5=X%9g#5QbD|~|lhfZ$;QNi}@;$wqd~)(c z)|D^pE-5<3vnAtt^pgDy3bQNaZ<IEkh}r=drIfRK)Vly=rIauBwy2NVrY5`#YTU^? zV`{>?0DaU}_2<>d6Oo6AddlQ`h{#j@6;c(o$(d{X^1;Obnw+^tsES(EfL0!?asjJ9 zWD8gYSgmfrnD=>Iszos}CT9-MKb|waR16HSOSQn5_f_q$k!KdcSX?dxKxZU;uDv7N z0|2qOTxJ%*()mhh;_9g7@^P2iIdt86?bZYH=*@ezw_hdn=~Mn}#BAn`>ABQQr3Gl^ z9S(=jZgYHcy6qQp88HbK>rS_Q*ml(MUg%&?CX;U}?m(cG#!S{ob7|gWjWh>ZX{_1~ vYUPP&oQQ&D@<AdRuLg^sXdn(M|4-^OYf^1*3JT7000000NkvXXu0mjf?!{M; literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-mdpi/identity_verified.png b/briar-android/res/drawable-mdpi/identity_verified.png new file mode 100644 index 0000000000000000000000000000000000000000..79cbaedc29a153ed0df16987b656ce659a876b1b GIT binary patch literal 531 zcmV+u0_^>XP)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#300001b5ch_0Itp) z=>Px$%}GQ-R7l6|lg}>$K@`W|bZuLjVB3{!8f+_)wj$aZ7H16?4&vbAfTO#UgGlP% zAg(TTa1s(f5)IW#6Tyn8s6-=0LQuQi9S0<(+J?g}iI>b_=Dp9n_kHsQ;NO0+d7H7{ z+l>9cnJ+8m^aL`)008lQ*!xKVTJVNK4u?&!It6LaDM*73n_&HJa;^A+0yvM{&-*2w z_e(tIk^8?}fL1&L0Kgb?hBDIA)SYq3Psl`95T-$p0<2T62LMPX==0MZ<BI%<Zs~IJ ze6VU3)ht?$Mx!acdGxLXx3zZnP2SCMF1d~<0IG@zLazb|0b(!^geZWNNGF$ODo3Nc zvDMs8=*6SlOIXz98k<Xpob8fFRnW&-qX;A-#>3fBb|6i{;#be92T$b&J;KFxa-%WC zxv~Lkt-|H{PQs@6!UWTM`LumjXdd<8^FHyz4JB1^iv4v*-WEU=r`R8ED5=!v)0)o{ zV6v!g){$i>nt-@&jvQ~ABb1Q<>&P-Di|Q^_fYv<q`5-XD4AnF!or_b|)3H#+xVUDX zPsWY+^**@+5G0ObS6jsj(3=Ne3l8!&Ax|l96WqQQ94ysAU3rW#DwUvEjNbg8v=@%m Vpg!n)QV#$C002ovPDHLkV1nET^pOAn literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xhdpi/contact_connected.png b/briar-android/res/drawable-xhdpi/contact_connected.png index 53c5273b9c9c95efbf6a66eb03b12c7918498f30..4341f01a1a16797592c31e81c119d260cff7f9c9 100644 GIT binary patch delta 1061 zcmV+=1ls%Y3&seLFn<I9Nkl<Zc-rlnJ!oBJ7{`D2>*TwM2{l%&q1CvwOL!>gl)Cvr z2f@KX3JIm)=A=`m;-HhWgak^54y6uNyS7sWdC8)Su_+;HX+zp1H))#t>5%_{%Oyi^ za?ZIYz3(3m<ZyD&^Lzj2dB0!q^78WX^78WX>P%&l3S?$k;C~n}01N}K=pJAbcnUlL ziom9GuJ+OxU}inQY2Xxa66gbZfo}cFbKn`U4XgkUfF<YL&XG32%-#Xc0j95=*Hv%0 zLXPmN=-LDv@Vj&F?;~Y^nVkYY0nX@4mw>Da4^RebKvnlSJum3KqUV7!<4@oh=iGx- z8(?Prz{kL(>VJAkkGg>M;kPPJKlrlv;oxhvbNl_ixSCz~`P;#pI~&<iU<laNqd;xL zUEo*e+*axgFtay+FMzYE(>c9=WqN*X<{<B!n;N;IHlwa==?4A)t~uxaO^pF&_AYP< zcvWA$3wSs^zxGWO@1L6*`3^Xtj0k|oz^rrbueKXtW`E<rSE}n(AUAor*!}kVrO%_R zUia?>*YEx~@H~v6w&4fo++y1dFtgWH_~UB0n4Vv|6lc#eH#IV=Kl8w<O!)7h@5>&t z!MmumuO?CWrWjSlz9^Pt4FEn;H&+63Nff@xgq&iZ5leCgnAsR`9@qhb$;-v=q{r}z z8HnM$n1A9oz|3;M1)yK`@KMwa-it^vABmwKxFELJGhj?<S5`WH-L9EjL+rAc#*#4L zJxyi+{z<`%He~1%TYLtXSpk>`2RjEH;YFMUGa7i6fC({1Z-DC8I54R3!+MI=HP*#6 z2#mMV7POK9{hHI~fqcHJ{xB`27fU$RJ}uVB4SzVMiAe#de|ly8v$Pl>mb%zZHmo#7 zYQV4>ni^0UI9{7biveN@*AV)|8jAtF4O7#!sVcVKxC|HodX9hrJz|Z0F7Q&Q6$6SI zcV{#aNt?nIs2#CJZom^QLZsb*XJU=TfNlLIUtG;Dq^0Cy$%}0}E(12%+q5VHnV)8c zZhxf30I_7mwj$OS8$`7bXA4+Te_OBYW=^EV0I^im6D)}}+6-{cRe?odL*30#it7K6 zm^Oe#u}0qwI_Jv3f>vU7wQk>5i6LArUl3!g>jA&1p#gX^1z$g8*cMyt3nI(x?bQ|Z z1-@_N*AHVC#Izi{0jgiO)X-Fb(fjv;>wifXUNJ|-um#*|rS2bUDD0eD2JUFwUDA$C zqEgI~819IPL=2E_EA0ZH+OT7jMC#9~%L~MCJBhhKa~5m?SJ~UB%r$@|QTTA^`xv-- znC)`EIT{6AM{kcen9#WgBpOWU+#@ngMs(&OseO#-%wux<7}1#rC7Vo0<xyELFCH&1 fFE1}IuTItfa7VLU2M&6600000NkvXXu0mjfP3{Yd delta 1491 zcmV;^1uXi;2=NP$Fn<NBNkl<Zc-rln%Wo4`6vlt!S7LjdkXLCYa!I0?w1T#TOKCSy zwzPs(ckK>Xv8lv@J)4RJOOPrmb<zF-Y$)ogWkJ<~Zc+pY1xKbRDnl`W#2!E5*L0C% zh!9nk$JmC<C(U9s9?y5bd(Z2h3qE}K@ZrOU4<A0ZCX7~nNPj660D6D~&=2&<JwOh4 z20R7wKu&Ajcw+=mN=1QjU<^nCaUceC%TLNc5hwujz<nU2wJyEZ0w|>>fR6wrvmKJl zU3E2iG_RUmIY0w9wAOR4l>kbqG2nAxm&|kp2*}_8sz3v%%Y9IuhvmK|&m*!j?f{py z*7rMF0Hu@(e18UfDz;vcM_r9bBbVQsca{z=#q)df{k4JGa6MKZ1ggPeFc;2-ADK7J zZ12_HQerw04^#p@z_Pp_5#MkX_(^N+besT6sS)5SV7J(G5HO09#ijXE^JZaJ;bXVU zUH;!caxsjG5sBZ4|B*bGbYioyUNM!r_>9}Yk6P=$JAXz1rPNN~IPjLtdRIAFUdo)! z43#EIlLT0wM{f{_&P8X(PmgE2=ev7lMMQwdz;{~fdmH5*+=RiWfUkjVGE1R{Cm!ZA z-((KfhH8Bn&mG-*rpK)f)CRI&WXCW_C#Dlo`GyH7%d*n8Z9i?B07@wfI4Og#xdGQm zUq}ZQj(;wwb<g^%5TN1gbCS-K^SJ*?ziYTg1Ly+YwJht7ZQJ>l3m^{f1h50By8+j@ z`@>zc@Im1{uR>O3q_TbS;G#2lX|QUzhAWPC#ImeEZQHJ_Puun5u!Ok^5KNy>2TPNs z39l2E(qw5OeLfwO$*Ty5!!2C_N~s;dm(5uH@PEWZXW{6AYE@cY8L4c?C6ky=#KbYa zBc`zA`3g`<1%V^th(hILId31c545_7v5(mY%E@wGk}DH9BHTPTfgQ5!ssNd@nL$F- zT3*J5sAbM(23KX4yM&wP0(>IH48_S}u9Pb6Y*#5;N|kmNCyP0`jSDyL1W-zafvIM) zGk<?--rP`}-*_75&Yzk$B_vjWDdD*J0*HO3fL_38L>jrm?!x|dZ)g;D7xp(Ijhtk) zy+CR$zF;jYz?7Ok1caO^r|5>=YP$t+!*11?a*C@;?Q!9{=>qh~W=0rr7Y{9Vw{`ii zGK0lKi``N%g@t2}7XtK)qiFy&=R;?xQ-AjLgiCV|Aue1!5g^tqO{+uIw>w1u;ZhfF zF|Pzj0MVuZ^;o^9Qv?t$O#!09)$>~5jlfz2$O9z_H^E>rnCp~52$!I6D+$+47vL!? z8<YkR3}?fSIz<5C(iEU5Ts;w>An%0Cn`X9C1Q0GE;a2cUfE+7Liz;Aj`*m9xw|{k= zrT@-^gv-k8SA}EF3jrJ;Bk{Io&X_TyYJ}T8exquH%^5Ssi-t-@xNfchTI)KH29^Lf zPzm(JZ^y5<TY&iO_;u+axWX+hTsJ=qYOSll3@cmH%gJ*|r>$n-VkFNc9bRmg&j?3P z_XB<xM?-8j))P%f@3m|E(RB1)Y=1V^Ovnnt&GQYB2dwn!!T{r^$DdGp-t%i6YJ|p5 zk3VTfLgDma%{jzcU$AZ4wJhr&R=U1MC>M%hkaqSt$ySbk_~P)jzF+zh;`z(K_gd>` zo(mu%ELoNnXQdCgoS05Tohj#WWu&sb6@yRQNZcAdGa8Y>M}eQU*1vh33V*+hE3)h& zKs|LbRgca_=RCLj+2~yAWU4O3PeeFeS$7(}-WP4#u2`0p0p15p!!;U%mj<iO9w+P7 zN=V#D+?qT-xok8HS2DjW@U7N*q2&UI2zkr0{$k|>NSEOn?!e`N04^D4k2AJu{lOZc z;fur9M$e2!q$L)Tod1H>`b@z_{(8%|$Nd8mn`xt4`iRU+LTt@LQm+tVYaWw(g%Dfw tpyW#;bmUQ4A3l8e@ZrOU4<B0<{{jn%iC-PXt4#m^002ovPDHLkV1fm5#bE#d diff --git a/briar-android/res/drawable-xhdpi/contact_disconnected.png b/briar-android/res/drawable-xhdpi/contact_disconnected.png index 9a398fba118a854f2bc778424cf318d316c45a55..d0499ddf1ffb6335c4b4f48d42ffed128d863a62 100644 GIT binary patch delta 1135 zcmV-#1d#iQ3y=wrFn<I}Nkl<Zc-rln&udgy6vscAWb#8}(hl0vH<h3?B4`(KC<GMh z!V0E}P`6#S`~E527F>4Ig@s_77Tbjd1A%g|iwcsI*i<JEYa8pRiJ6(qbTQu{j}j;| znK$q0ye~YM%Ny?b-tRs4zH`pKkRd~c3>h+H$dI8wG0-bRW`C9gCV&G#0eD?)fHLqH zSO=a0Wp}T?G6I;{7;qFg0vrbR1N(qc{pAI)0Xzrp1NVRxci()e1u(OBfcF5?Y!B&a zM4lFp)>G3{1|0a=-G6(j1TeEBz=yyI&2$CGY48A5pbl)SJ*fA2wQG7mEYG+DeCzJ_ zQZ0a)jRUj5`+r*N6}=h({sC5jhrl0N>yP!m089dbp2NUvz?R+*>;FFi^X~pEbpn`K z5%?H5sWm;Q{_g_|z!LDgyEp!)pCJiw3^=Xd4SCBb@GJ18yO&ZUfSDZwJ^|j)td9U8 z@B^^m?k_s*cT^&L0K6rS7zX|XuDbhD;sTi2H1L_$`hT`&ei8WE-5+&H;6uPiz)Zx( z2JpGNFDE8|nFSjBA#Gd$bMF34Oq=UP;If)Sz$1yU)@h%Ed))9o1*Rgq`B(1#eO#Zc zFbtQ1AlTGC)6hm+41(a7Fbpf5^qJcOp9}iTRV3t`yZ;z>;36AyvRM&_3!V0t>u~m` zfV04+Hh-l>V7`YT{Jd-qi^ExQieCUT8w4%^<64Igfor{r-Q@*!;F@d?iOVH%i`@gJ z<aSlHZ@Bwkz0Trf^F}1HJRxqe3oxT(2H*j3E5U5`mN+0zGqDO_W_jRLB-mMS_pPKx zFWU>^QUOkhWA_En`kGeEKA_nCZVGA|cg1Bu+<&Iq*$dk7fN|yYt(5iwP)dOSC2?u- zIx4PR7hpn(NnSxn$=z#7k6s)~;*=N1i8ur(Xrrks>|G;0Sc}vU_KRyQ0_=;VrcY8N zz!Pz5h+`}Q900~50<5P<fc1y~W8xZnF7QgA9RZ#y?jBGgQb^G_3Xuxbrnq)pfOQoi zT7LperbvLvhyWYyEYEfYc+O6BH%O5HfjH&FF%|*JGz*+nDP2?nGf{{`QJkvcSdK%0 zXTS<O2N!S4aMCD>ON-ZvxOP_nci#q<_04V2tlJ+?fdI$Fr6F$1;@bVspu1Or+p5HD z0jJGuBtiEdp;<O>mCJ97W32UnMQt?5^?%MJIQwVB0dZRFML}eh=2=}U?>=v42NRh6 zgTQ$;^WwA`y8v2W*R|2qfH#3FI{)w0;B&wg*{+Gp^>)_&o<d=FUj=R|?yjg5HQPf6 zn3c_nINTH`dLn@Eo!o9%iO6L$JJ*BRKS%R)Xj``Lh)YN4_+%&y!%7eYE5N&|z-ZKg zlR*$P!Z2KlY48{2`ml2}_JzCu-D#iM;b@l#_V4j{glzv_kcg1)-zzfz5u!gYN$ny; ze_oT@MTq{qD7j1cn!2m988T$ZkRd~c3>o?r{{lG*ylE)}9)JJ<002ovPDHLkV1gPG B9KQen delta 1386 zcmV-w1(o`c35g4kFn<L@Nkl<Zc-rln-)j_C6vsciiAmI0+fXgNQLIu$Fny3qA)uuq zsi0Ma`cNDC*y3ydl)egmEdF?~Ahx#H8Z0OT%0UYiB$n9JAA_}xbv4FplHES!J9Jn! zyE~JeHM(<PU@kLr@ArPsx#xcGy#twLmRV+*WtLfHnYE|oT7T7$_dXB20;~c0fY($8 zC;$(EN#HS1FtgH2LxA^wC9nn93~U5e1FL`@z48or3QPgFfm^`1nN7dY1bFY?2Hpj{ zyxpm*9JxXq;WekL02uI#nf?Ak5#YVw415Uekf)14UY!S+1xmoY${l*XLghI<?^0x3 z2fj12Tg#dN?|*$SZ~%B;W4)+H-N3)V1aKetQ)B(1p7#N30jFyt@G3B)=UsaLXW+b< zJy~`Hc<=jxPk{lA=?>L@8@K|D0e_fTxlTQuB48V^OZR0(OAqiH@U@xUT{Z-G@3#S; z0qf=UZXf`D1g@CbvxN2bh=dP-Hx&_Gz+b>uW;XWR34ie3Zw0>4Sf7{YM}cq5>_L+V zUI%;x3`W{`3Vdm1H=i2;-g~FcuT$azIBRC#rj%R{0*6)X1RjWldr9l;SYpEa9M}}e z=BLf<hqR`wAPB~sbJNN*WhL5v=iId*2#QJS%r61Yeob>l5qZ|keo9-osExB~vnUMv zlh&6{=zsl9z#d>)Nof=~-$Dt0UTt;>!yaKup8)TD2XF}J)i}HloN1MIR}_?hGitk2 zSPltW>JhL>VK=Mt1vC4*)vGwQc_E@KcL-Z7>rBx0pcXSl;0|!PPQ)CKB->N<@`U$( z2so<ZyqO)V@%m+{PA5!*z<6pA;Jse~?2L$=D}QD-)4)tKudIF4d%w3v{d?8<a%8@* z6$LX=ncc#)Qy801fX3HWY4)77{f!vyggIhZUasc(VHHa;u-y=roUm<;lMCWRK(E&H z;ga?a(1;#CC2)&I!Xlo}>DzjCS6D(^TZFZ_LdZF{UTgce<e^{9>{<ijW!yRU1b9cC z3V*#j;GCOs&TR%hsd$zHPMF!n2I?=Vj?g&;U?K>DLbD^FPl=`^*?TWW#vZ8>2>>7K zqSEvFrct{W*+W<@tfWD}sz{hVN}%9Q==;#yxr+O;JRet4K8g&lRcR5h23Q#(U^2nn zJyJnJx#IprOwWfl86jY$u%^BicquFn0e_FByTftZ7q>BG`{9Vka~1c)wRA$A;Th(S zX<=<T0h8K<2nkplv-3k0ozF*xK)!;6p_l}$jS%oO&hU&&z!d-Q?z)(sucq)$>x!iq ztIg8Flo!TS2q<WSb5>0EYXh@U&sQqElV&!eq<6AW#aN~OPM}|yW`(hk1_4jB(0>RI zE;gv)dRA58MYH`PI-wj{6xFhRVF_`K3u|);Ftd5!rsmu-3;Xul8~i-#`Kt4LL?={6 zLOt6qEM;N4DXh((2F+|1xT>9)8DN+9zPrw64J*7FigB^<?`C1!Jlrn7DvYV_2aE#m zv2cvF0oV;(tkJ1s2^3?aN^rL@lz)``Mq9BXG{M4IUAXSv=e>Wu)dEIs?o)AvFioUR zfX3H3C7L<l4d95*|6A4hJa9y9&k4)9IAecFQrOHUfJ@TdMQueLXkh>xP@6?zxFk%p zgaFz13cD^PtHTKtToUgOv2Z#xuePrXOCn2rG86<s(K$D+jgDR=q5<bzIb#Tdv6MQ0 zP@x|t@CU$gGy5lLo!Q}NlK{5w@puGm`~Dyi0pGsA$W#!~o<B)dA)-BhldD2Rd;Ta{ sMZPY(Uu84PEVIlq%Ph0ZGHX}+4=!a>9yGS0rT_o{07*qoM6N<$g6UhE761SM diff --git a/briar-android/res/drawable-xhdpi/identity_anonymous.png b/briar-android/res/drawable-xhdpi/identity_anonymous.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f254fdac6b62ee348a82b48d5e166eeb6cfb11 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq003YB001Be1^@s6?ZACh00001b5ch_0Itp) z=>Px&4@pEpRA}DqnO|s*Q5?rV=XtltP$ILlB2q?~ZNCf4GOUz@OHywAi72;Rs9oSf zh)7(xpeD(UxFKYX-TdCwZbpexdWLDu_6p-YE<9?@=6$y3wb}DL-#WeTbDnd~=XcKU z{LXXE^FXRpsZvc%iO4h&nU?a$FE64EYlAddn)3XThz4v5ejiNI08Dwl7a{zX0=+<Q z@PDGiKNkEbOVAGBT9CF+!t9F$-y5g*X8|i!^^K~&0jh(%iJE<};g2^0HUrm(Twf3J zCQ8ZXi^$C|c`5%NM1Y9Y12;yvbtAa<uR9+re#r=c8Nh5{R*>cZbDd+pF|Hg~1{@fn ztybWINZkwP%sXRv4}1)E3jIO)q^h3_bTCnTGYq~PXaYKc*Fl7Q1_q|j&VO%v)bTis zR~t6euK)7MD*<K#Gk`p>7^nsws_K<dI-fYc8NrB+&e5=7+2EynEuGy(d1CFXUeNub zbe}P_sp|a#GcZy7%<#g#@4vFPqIaMtbHZBt#P|JN#5J>gpeJ+Q7<XAU`?OH`r13MO z81c?p+XkGq);{xnzki(YO5lt!99GS~3|lWr{LEjB=(pD11x{IOJAB{o8zX!n&<yNR z)!wlhpA^0c(NG3B4!l*>b0Oh}fJ)$qs{V)=!m;KTJO=~~903}~V0U9NI-dl7*n`*- zpk)jOv;=jErP%UAI>1%sfAB3V{a0C6RlNSkmmkUjE^k)XY|FL(xz^QHiqzTR`8C^e z?JjRt7p?m-=7(~C@mO@V`T2*Td280y9(8$h)H!pkzM*#4(0f;#pMNkOi;6V>apo6v zfQVE8UB9oJwybItk=tJfyv}Tg?$2g*@8B1&Peg7tZCN$+LDd!1jr#H{*8DKr(6zuk zpdH+Pmp3`%ab8t(!^)MpJO_>E%D`L%>VY0rZH+hpvF3;QC|?6C2R4H_o$b)BQMPM2 z;G~Ew4-O!M!OUrmI0<9T595Fpz&%yH6LR0&1?(1)trX`gQF8erQYs?lQC>ueNNLJX fl`2)L|585z?&-`o`IpIW00000NkvXXu0mjfNEn-4 literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xhdpi/identity_unknown.png b/briar-android/res/drawable-xhdpi/identity_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b91a85841af0985cc2635ea3ec9e516719520e GIT binary patch literal 1470 zcmV;v1ws0WP)<h;3K|Lk000e1NJLTq003YB001Be1^@s6?ZACh00001b5ch_0Itp) z=>Px)cu7P-RA}DqnQe#_RT#&A&&-|mx~5_;t~=sto0Ti6t0!tnT~iYBB`btV=u028 zFibQkNGRCog@}qu2_+N~6v`qj`;eFvmIP-v3{x{J6dBEz)phT>&b>2FAG{mewz_xs zF6+H<|8Tf>&YUy9bI$)fGv~}eNhOt3QgO-{GsqY-sKoEPoIKkwGn=lJik_dyvjO*K ze|KJ^0VsODlSlZCuXUm+wN5m}7&HDFg#UP;8E7tMexD6!QyyI4W+pChGZWjCMb}{V zJqmo3O^*~S-|3_KL(i*>sgT&Okk~)3Qe})8I)JlpC@{%dd(>Kc6qsDB{5}~V=z>*V zI3um1X%$`Ng);<QFo3gfKCrpd@#bt^(ee9a!136rt9LU-1Q9{%-HbUNJ9Ps%0E?}) zUvwN~|1T~^zSD>Bt6S}b^DnAsN8UvhUG0VQjWKlt5dL+*)^1L1Ek=H#8$dZQ3>cbC zBY+!FDo!C~K}^*IFG`3Y|J;%Unczf;AYHbkYTBLCZ$d+alfaqmO5s8_wODK0dgx%c zd{st@Xa#UP@N_p-zXR49GwqP7oD|`&V&F>`_)=g_trLy7MdERQB%sYhQ?5tLT~RbI z76?_evjG6AXql)u3O~B;S5cZ_X=F$S$^kv1&YwTUZZojUTD##2onH#f0rmlZWFxc< zXiW}_Gkd;i+MUa+nm&8#z3nYd0=SOL{1~_ym|SRl>825LCrh+uaWXybx(roa2fDXX zMOzab-PZ2?xli3!thHbFFazhRGJVwT=?`{n*>|E}o|sD}k2-P4drE{og~oTg77l{o zcem1S`YiOWpPk554TAE%nxKldz^RoNlV7%oylidb_dV4Kg5Y=GuWW8T?Y`#w{<lF8 zr1HFHSG1mX-xJaGg~)fW(1?@Oqy5Iuqr}KrZl*d3gL`X&DtZpit`3viMmRKB+xT0q zb%P){>HGd3;2q!he+Yu$LLWOn8hBfTRfWoTuhNJM)xN*$^C)q{OgE|-B088HJrI;L zIOm=Xlbc2e&s%God)xRR2rl@(|0VFI@B2+b5S;I2=c|AQU|AvaC5H>S7nK){6OCEs zg-^siRB=$&r^`0l*gZB_Xt35sd4{kHyb2t**1nr#oo9g2zzc=W?{Obst&Ii?4ZEU5 z%FO}p0=uF_sy_z5gAcp_)c2xVeSZx8K=5<jh*huj!g*n*&DWI_s_05DoCj3*<Nl`_ z*wTygTZ)CBqXAljaxRw#u?T{44z#BK`mYn>h%ndEm&@veV&LawKx-^_Oe)X#{~Bmj z&ML>6m1A^?i%I1fzcrRS`mOu1++DjUwfDdG+G(SWndW!RuU(YdtFhc&4E&r7$Ox6g zLn=F#mr0Zl%e;@*TuOfO?4{(^-Qw&`qNrZBVt7bpMlP4{4~fIrjSUA+b<VqI*3>l` z%NkXAsc!nz$2*_f*l_TaIE*a@evbwiV=8Aj(bxz`sB*YW_CMTSzIK1g-TX_FU45j< zKDRyeUVEs${QbjavOl3p1k7-vvBsFZO~_v3K*#Z%g;VN{F`r&)b@nwj+2xIm_Q`a+ zbKV&9$()5#IzK266azn(W$4Vu-1LT9ohZ32<Nf+`<nDAG)>>;*UCIrKVxFGlM)xgF zq;ESMyX{*eZ>hERyF3SACU7IL7j(JCk`jmay5noi3UPD@$U2}7I9=%cTt3RzZpwH& z!1I#Ax}Tctfh#Q6QotLoG20tMcR7$w3bom{g!!lzr~&4Kyw!Mh{_Dn=n(PKBot?P_ z&CkVviAiCHwRU@s>*fQ%3S-Oz^v_qSiO_5Q(*FhD7~>gZD)M;|WsLDk{E|v4sicC` Y-%B_^7(+Az6#xJL07*qoM6N<$f)t6=NdN!< literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xhdpi/identity_unverified.png b/briar-android/res/drawable-xhdpi/identity_unverified.png new file mode 100644 index 0000000000000000000000000000000000000000..85785c09cceadbf4357e8ac8e0f25366ab5c5f19 GIT binary patch literal 1565 zcmV+&2IBdNP)<h;3K|Lk000e1NJLTq003YB001Be1^@s6?ZACh00001b5ch_0Itp) z=>Px)*GWV{RA}Dqnrm!SMHI*Xb9cAhwroom=xwKE3zZ1vT_!E%As|YyqG)^(5@JFs ziNRE{#78J<0)cNl0uePTFEJQvA_)p17$gw12@X}%w4elNZ7)k{yDr_b?BgCkP)uzK zd-p+aiTh6`o1LB6-<&gN?wOfgAgQF1O6vZU5F%9wk(%VkE+x(}Jk(Rn(tXdj#yNn; zdS1UX$pQC0-xA028}n$Xzp{vja{X}qsA*cq055;j`2ZdO;OCrcvGQYn1bKbzsg=)k zjbHg}*LbgwEgtC5Gn)@!34qUf$_oRU1B4KcHjgsW#Y5c1L%hwSxP%an0gOJ=`2Z$K zDVwB}O#mjx%8zLR6h@17ukDx}3NQ)<80}u$F<W7@XrLTmHXp#_0QU8IzptlmV3eg! z-%5>~LiGg{sxKgF<dmgO-}-;y3n9KVQg=_1un?kr%WIu)j>!!>83O|VJ;-Q6QE=EF z?$M_;P5bK}8*e%vz-3L-8hY1r&cmGZtZ4bxegNqJG66VxN;ZID45VImTT?Eyz*RmW zV7+ZT05AqtJ|SSe&|+CSqM&S6p&AMhm>WPlfKC9{dx}>|*&V^aLCGgV4r8PO7z^N) ze!89n@V*e!&Ji&;W4LOB&-%bu0GPj^)Sq4QU|<vhEX7LQsVVSTY~)=y^F{@9hR{t$ zy&V7mL?CM_F(`y1KcpQF2U+IL05Sq0md*gGKc8~x=xKW=fMZh1kMCgopx^^I3*cf; zj_d}|WzW<@r@pU0ZX~K_JzO%+?^Ub-h5$$hpaU2UU~*qR>t_%P<_mw#>Sf+h!-kNn zuc6V32-M!inl|mrymU<3H%KXuMu<Su`9zqNJ2v>?q5WsCBqU=mot%5+ob6@CaH=n# z^*@MdQ`{Yvm8U;-KRtY?J|b2p5P`0Fl(y1J^?>RO?~wA$FUFp;=JSbI4P&U1Qo7^J z87dLBGe#Tw<FmVT<n9jTow`rl&#T$GGg>DQf!v)+NBK)?t?Ja*ODS8U9JuLx0Gk1< zmQuFF==^*Dn*dbbiGRm)fRwUTb?Vh+mFgbtn&MFuGQLk&2--EpQ&y?&QJs2qw8jq> zK7i!_)(atAF*x4^U_F54cjGeyUu3!7&EBmj_mAAVs&jc*zk3&pLRhsmd)MJQd$S{* z)=4SDaV}xg`2aQoXpvHGGuY=<0QmscMB*z3A|dQZr*(S|r~3?@8Z5xx!|A?67(ZC} z0M-DQ6GgW<Mw}nbRYcLwnvRN4fJJ-`gaV9q)^t<=C`#b@$8<h`{ZX{vZ<KFv0;re> z9wUj6F)$){04h$L{igHB>0tznw!YPt#wBb5JlB<pb4zdXJ{Mxp+Lh)j?MgH7-@u$( zdXsyuD-#oCzS(@z+4QN4eRch8SM!CK#{1S!UF@qPolQ^J1O!4X&*{+fZg1}_X*yp2 zU})_lRXJbHSfPIL`O%Czi(LoNEl)TddR`#J@)G3$v-wOx;jVR!ZN2Me&Mm1Soz)Pr z_sVCLEbIN*u62!VOhI8nF5`p{c@;BmEL&LSAFEh^y2g~>CoSQ%-9Gm9uV>{puc!5B zOJ`x*8{4wm=au<03Uk9b(1GTw7I#o_9oICiE6!br>3jeMnx>rufcZ~Mnd5X6YzYV0 zkuzuH7ERN>QFHPOIp-UTMb4Fr=iQfkF6W9l=YK}xN1Oo8dC7|vzU7%2<XijE(9=6= z9S4RF)i?em&-`|~O>3)mZsNGy69-SEr8Zo$Vak}G)n-N3iJ$GKG)-%Y#{q+Z51^ZK z{x|1&Z~48JT*mOWl=5G`rfKIn=imCh%5ywFZz1Qr5r7?lJrdu@IiRZR1{=))TSgk~ zkWw~8XkYBR!B!Fw9Fj&CrIg#_j6l=*0Ez+F0BknG2T%<l2%sSn-^jlr#t%uOLsH6v z2KUVk0IGx#Pa-kD5}D2i5G{X2Lij=mn-D^c=ORi7VN3FpN-C+O2BrQ1>$?H|i<QY3 P00000NkvXXu0mjfb0goW literal 0 HcmV?d00001 diff --git a/briar-android/res/drawable-xhdpi/identity_verified.png b/briar-android/res/drawable-xhdpi/identity_verified.png new file mode 100644 index 0000000000000000000000000000000000000000..d93ae1df22bc1530da908a3ad53d12b92e68da8d GIT binary patch literal 1139 zcmV-(1dRKMP)<h;3K|Lk000e1NJLTq003YB001Be1^@s6?ZACh00001b5ch_0Itp) z=>Px(ElET{RA}DqnO|sIRUF5^=idBjZrYf(>C!aaYO<Enbe*ne>xOg#-4y4jWkSIr zKJ3AV3B$LEFQW(|_#ld)4+?z|6gMAcQPi~+oTyuO!XC=jLAN@)?auyP|J>XrH#a|D zBG|c^+oX2(CSN#&z&U(=zw`TZ?ztBzsicxh+L+>;yE*6X5<h=Q1=_GTJ06xcJl|2E z0ncWC2OiP}Y<Rw-fbwgMbR-|k{%aIMjIDF|+k&5W3o;G75IeB!j~!U{n+6WAck0=N zFXb8iiupToDBNo747VCP=kLgMob!rx%s$)j^Q!<xhq`;`_Zdk>Mv_r?@BBV6I<#)- zXCr=I0a%=rJ6rba?Tmpj2G+7)Z(p30JJ-v9JMrZ_%5TrE9__{2=5z#L0Dz1MIGm)( zTEkUURd4>s<!>uKyAMDC-~&*R9hCs8iLlAgS-CbVg^rz?>Qej^`TM%WT{iwvPffqK zDx*3*w8R)D0n7lH1F)DK3qpuQ4hM^h&+dW00^lj7(o8(wrFRkmvI7a(MVhmWv_K?X z@2kngj3gt*R<0!iIo-q-rliZ$<BprgGV_`#<~7q$7y~Z#dwxpH$qIlWA;iZIaK7mH z_p5-Xz18N??%w&mZZC!J1+7*@prpobo#}n#oHir(2_eqr$iSlF|Kki$RrPwnUpMy4 zr{(^(gZdU{8I*jDAOa=svZ+sA4)inNJt5*h=UP*2eE9)J{PF14Q2fGY-c7B~EJs~R zM!~9WAZWAlY~Rtqm*v%&H-(5>z9|+HU;Y;(78|yPhK9dTY64L+QN1M{A+lzKBonTk zcMqL9;XmuGq!U7jxz%P*vGC;_Mx+~}p@Hk?-A&WKImQ~FNbW!mBbY?^{#{?+r8CN? zOTimLh*ZA)vl#d}FJeLnQ<8D=@?cp~lC4A^$j&_}gfI(z?zTJM>P<Mh`-s+LrY*dr zN&~x(XiWg3Yk2>$E#G1QsHJMN>4%jbNDNh*O+P>_Yv;dx`IZ8Z(xvU;Z7I)+UdISa z)6&G!j5Gm8E9Qr{r93HJ+P+rq+nI0agN&iGpf8w-nJES$ki$)E;Qflzqd$~Q5P{kb z>X9dpEgm+OC1MQB7tF*Aodwrw1MJMt834|CsG`R3kO|06!uYUj`1I?Q7c0Z*??y&1 zegy!YiuUI(eD1x~^UhpHWLK(#OrW;e@OZ0uNC=@8`0~rv{G8`{U0vOdJuhjmxfEz$ zzwH|w`BoY9_~<Pm;v;{}xqVx`8f~uq@!GF$-;KC)p}s9$ULG*(Z^Yf_R8{@GkPWaq zpIOL&<0+j*061M9`cMdQCCB`hl+IoSV7NRqE`<1?zznoC-^v*fb9v|+Aw<8$=jJN_ zj&sht06ez_Ex363oO37VJXpZ`Am`j!;+IrXNhSR+^(S@;ev|OyLP-Ds002ovPDHLk FV1kAcHADaa literal 0 HcmV?d00001 diff --git a/briar-android/res/values/color.xml b/briar-android/res/values/color.xml index d9fb00b4c6..c7cc015fe1 100644 --- a/briar-android/res/values/color.xml +++ b/briar-android/res/values/color.xml @@ -4,7 +4,6 @@ <color name="content_background">#FFFFFF</color> <color name="unread_background">#FFFFFF</color> <color name="horizontal_border">#CCCCCC</color> - <color name="anonymous_author">#AAAAAA</color> <color name="no_posts">#AAAAAA</color> <color name="no_messages">#AAAAAA</color> </resources> \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index d36a862bdc..7fe48d2980 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -3,10 +3,12 @@ package org.briarproject.android.contact; import static android.widget.LinearLayout.HORIZONTAL; import static java.text.DateFormat.SHORT; import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1; +import static org.briarproject.api.Author.Status.VERIFIED; import java.util.ArrayList; import org.briarproject.R; +import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.MessageHeader; @@ -41,14 +43,10 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> { layout.setBackgroundColor(res.getColor(R.color.unread_background)); } - TextView name = new TextView(ctx); - // Give me all the unused width - name.setLayoutParams(WRAP_WRAP_1); - name.setTextSize(18); - name.setMaxLines(1); - name.setPadding(pad, pad, pad, pad); - name.setText(header.getAuthor().getName()); - layout.addView(name); + AuthorView authorView = new AuthorView(ctx); + authorView.setLayoutParams(WRAP_WRAP_1); + authorView.init(header.getAuthor().getName(), VERIFIED); + layout.addView(authorView); TextView date = new TextView(ctx); date.setTextSize(14); diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java index 932e6b49cf..06c72712ac 100644 --- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java @@ -10,6 +10,7 @@ import static java.util.logging.Level.WARNING; import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP; import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1; import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1; +import static org.briarproject.api.Author.Status.VERIFIED; import java.io.UnsupportedEncodingException; import java.util.concurrent.Executor; @@ -18,8 +19,9 @@ import java.util.logging.Logger; import javax.inject.Inject; import org.briarproject.R; -import org.briarproject.android.util.HorizontalBorder; +import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.ElasticHorizontalSpace; +import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.AuthorId; import org.briarproject.api.android.DatabaseUiExecutor; @@ -116,16 +118,12 @@ implements OnClickListener { header.setOrientation(HORIZONTAL); header.setGravity(CENTER_VERTICAL); - int pad = LayoutUtils.getPadding(this); + AuthorView author = new AuthorView(this); + author.setLayoutParams(WRAP_WRAP_1); + author.init(authorName, VERIFIED); + header.addView(author); - TextView name = new TextView(this); - // Give me all the unused width - name.setLayoutParams(WRAP_WRAP_1); - name.setTextSize(18); - name.setMaxLines(1); - name.setPadding(pad, pad, pad, pad); - name.setText(authorName); - header.addView(name); + int pad = LayoutUtils.getPadding(this); TextView date = new TextView(this); date.setTextSize(14); diff --git a/briar-android/src/org/briarproject/android/groups/GroupActivity.java b/briar-android/src/org/briarproject/android/groups/GroupActivity.java index 11ff72b1e3..629a73b439 100644 --- a/briar-android/src/org/briarproject/android/groups/GroupActivity.java +++ b/briar-android/src/org/briarproject/android/groups/GroupActivity.java @@ -230,6 +230,7 @@ OnClickListener, OnItemClickListener { i.putExtra("briar.AUTHOR_ID", author.getId().getBytes()); i.putExtra("briar.AUTHOR_NAME", author.getName()); } + i.putExtra("briar.AUTHOR_STATUS", item.getAuthorStatus().name()); i.putExtra("briar.CONTENT_TYPE", item.getContentType()); i.putExtra("briar.TIMESTAMP", item.getTimestamp()); startActivityForResult(i, position); diff --git a/briar-android/src/org/briarproject/android/groups/GroupAdapter.java b/briar-android/src/org/briarproject/android/groups/GroupAdapter.java index 4900e2f3e1..25195e5d3a 100644 --- a/briar-android/src/org/briarproject/android/groups/GroupAdapter.java +++ b/briar-android/src/org/briarproject/android/groups/GroupAdapter.java @@ -7,6 +7,7 @@ import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1; import java.util.ArrayList; import org.briarproject.R; +import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.Author; import org.briarproject.api.db.MessageHeader; @@ -32,34 +33,27 @@ class GroupAdapter extends ArrayAdapter<MessageHeader> { @Override public View getView(int position, View convertView, ViewGroup parent) { - MessageHeader item = getItem(position); + MessageHeader header = getItem(position); Context ctx = getContext(); - Resources res = ctx.getResources(); LinearLayout layout = new LinearLayout(ctx); layout.setOrientation(HORIZONTAL); - if(!item.isRead()) + if(!header.isRead()) { + Resources res = ctx.getResources(); layout.setBackgroundColor(res.getColor(R.color.unread_background)); - - TextView name = new TextView(ctx); - // Give me all the unused width - name.setLayoutParams(WRAP_WRAP_1); - name.setTextSize(18); - name.setMaxLines(1); - name.setPadding(pad, pad, pad, pad); - Author author = item.getAuthor(); - if(author == null) { - name.setTextColor(res.getColor(R.color.anonymous_author)); - name.setText(R.string.anonymous); - } else { - name.setText(author.getName()); } - layout.addView(name); + + AuthorView authorView = new AuthorView(ctx); + authorView.setLayoutParams(WRAP_WRAP_1); + Author author = header.getAuthor(); + if(author == null) authorView.init(null, header.getAuthorStatus()); + else authorView.init(author.getName(), header.getAuthorStatus()); + layout.addView(authorView); TextView date = new TextView(ctx); date.setTextSize(14); - date.setPadding(pad, pad, pad, pad); - long then = item.getTimestamp(), now = System.currentTimeMillis(); + date.setPadding(0, pad, pad, pad); + long then = header.getTimestamp(), now = System.currentTimeMillis(); date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT)); layout.addView(date); diff --git a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java index 83e97520df..d4591a8e37 100644 --- a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java +++ b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java @@ -18,9 +18,11 @@ import java.util.logging.Logger; import javax.inject.Inject; import org.briarproject.R; -import org.briarproject.android.util.HorizontalBorder; +import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.ElasticHorizontalSpace; +import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.LayoutUtils; +import org.briarproject.api.Author; import org.briarproject.api.android.DatabaseUiExecutor; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; @@ -83,6 +85,9 @@ implements OnClickListener { timestamp = i.getLongExtra("briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); String authorName = i.getStringExtra("briar.AUTHOR_NAME"); + String s = i.getStringExtra("briar.AUTHOR_STATUS"); + if(s == null) throw new IllegalStateException(); + Author.Status authorStatus = Author.Status.valueOf(s); if(state == null) { read = false; @@ -109,21 +114,12 @@ implements OnClickListener { header.setOrientation(HORIZONTAL); header.setGravity(CENTER_VERTICAL); - int pad = LayoutUtils.getPadding(this); + AuthorView author = new AuthorView(this); + author.setLayoutParams(WRAP_WRAP_1); + author.init(authorName, authorStatus); + header.addView(author); - TextView name = new TextView(this); - // Give me all the unused width - name.setLayoutParams(WRAP_WRAP_1); - name.setTextSize(18); - name.setMaxLines(1); - name.setPadding(pad, pad, pad, pad); - if(authorName == null) { - name.setTextColor(res.getColor(R.color.anonymous_author)); - name.setText(R.string.anonymous); - } else { - name.setText(authorName); - } - header.addView(name); + int pad = LayoutUtils.getPadding(this); TextView date = new TextView(this); date.setTextSize(14); diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java new file mode 100644 index 0000000000..fbb2d8e775 --- /dev/null +++ b/briar-android/src/org/briarproject/android/util/AuthorView.java @@ -0,0 +1,51 @@ +package org.briarproject.android.util; + +import org.briarproject.R; +import org.briarproject.api.Author; + +import android.content.Context; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class AuthorView extends LinearLayout { + + public AuthorView(Context ctx) { + super(ctx); + } + + public void init(String name, Author.Status status) { + Context ctx = getContext(); + int pad = LayoutUtils.getPadding(ctx); + setOrientation(VERTICAL); + TextView nameView = new TextView(ctx); + // Give me all the unused width + nameView.setTextSize(18); + nameView.setMaxLines(1); + nameView.setPadding(pad, pad, pad, pad); + if(name == null) nameView.setText(R.string.anonymous); + else nameView.setText(name); + addView(nameView); + LinearLayout statusLayout = new LinearLayout(ctx); + statusLayout.setOrientation(HORIZONTAL); + ImageView statusView = new ImageView(ctx); + statusView.setPadding(pad, 0, pad, pad); + switch(status) { + case ANONYMOUS: + statusView.setImageResource(R.drawable.identity_anonymous); + break; + case UNKNOWN: + statusView.setImageResource(R.drawable.identity_unknown); + break; + case UNVERIFIED: + statusView.setImageResource(R.drawable.identity_unverified); + break; + case VERIFIED: + statusView.setImageResource(R.drawable.identity_verified); + break; + } + statusLayout.addView(statusView); + statusLayout.addView(new ElasticHorizontalSpace(ctx)); + addView(statusLayout); + } +} diff --git a/briar-api/src/org/briarproject/api/Author.java b/briar-api/src/org/briarproject/api/Author.java index 16693137b1..0ff392f9f9 100644 --- a/briar-api/src/org/briarproject/api/Author.java +++ b/briar-api/src/org/briarproject/api/Author.java @@ -7,6 +7,8 @@ import java.io.UnsupportedEncodingException; /** A pseudonym for a user. */ public class Author { + public enum Status { ANONYMOUS, UNKNOWN, UNVERIFIED, VERIFIED }; + private final AuthorId id; private final String name; private final byte[] publicKey; diff --git a/briar-api/src/org/briarproject/api/db/MessageHeader.java b/briar-api/src/org/briarproject/api/db/MessageHeader.java index 64831d9fe7..4a1b2054b3 100644 --- a/briar-api/src/org/briarproject/api/db/MessageHeader.java +++ b/briar-api/src/org/briarproject/api/db/MessageHeader.java @@ -9,16 +9,19 @@ public class MessageHeader { private final MessageId id, parent; private final GroupId groupId; private final Author author; + private final Author.Status authorStatus; private final String contentType; private final long timestamp; private final boolean read; public MessageHeader(MessageId id, MessageId parent, GroupId groupId, - Author author, String contentType, long timestamp, boolean read) { + Author author, Author.Status authorStatus, String contentType, + long timestamp, boolean read) { this.id = id; this.parent = parent; this.groupId = groupId; this.author = author; + this.authorStatus = authorStatus; this.contentType = contentType; this.timestamp = timestamp; this.read = read; @@ -51,6 +54,11 @@ public class MessageHeader { return author; } + /** Returns the status of the message's author. */ + public Author.Status getAuthorStatus() { + return authorStatus; + } + /** Returns the message's content type. */ public String getContentType() { return contentType; diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index ce5f74aab9..004c0787b1 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -4,6 +4,9 @@ import static java.sql.Types.BINARY; import static java.sql.Types.VARCHAR; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; +import static org.briarproject.api.Author.Status.ANONYMOUS; +import static org.briarproject.api.Author.Status.UNKNOWN; +import static org.briarproject.api.Author.Status.VERIFIED; import static org.briarproject.api.messaging.MessagingConstants.MAX_SUBSCRIPTIONS; import static org.briarproject.api.messaging.MessagingConstants.RETENTION_GRANULARITY; import static org.briarproject.db.ExponentialBackoff.calculateExpiry; @@ -1525,10 +1528,12 @@ abstract class JdbcDatabase implements Database<Connection> { boolean read = rs.getBoolean(7); if(incoming) { headers.add(new MessageHeader(id, parent, groupId, - remoteAuthor, contentType, timestamp, read)); + remoteAuthor, VERIFIED, contentType, timestamp, + read)); } else { headers.add(new MessageHeader(id, parent, groupId, - localAuthor, contentType, timestamp, read)); + localAuthor, VERIFIED, contentType, timestamp, + read)); } } rs.close(); @@ -1701,9 +1706,14 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT messageId, parentId, authorId, authorName," - + " authorKey, contentType, timestamp, read" - + " FROM messages" + String sql = "SELECT messageId, parentId, m.authorId, authorName," + + " authorKey, contentType, timestamp, read," + + " la.authorId IS NOT NULL, c.authorId IS NOT NULL" + + " FROM messages AS m" + + " LEFT OUTER JOIN localAuthors AS la" + + " ON m.authorId = la.authorId" + + " LEFT OUTER JOIN contacts AS c" + + " ON m.authorId = c.authorId" + " WHERE groupId = ?"; ps = txn.prepareStatement(sql); ps.setBytes(1, g.getBytes()); @@ -1726,8 +1736,14 @@ abstract class JdbcDatabase implements Database<Connection> { String contentType = rs.getString(6); long timestamp = rs.getLong(7); boolean read = rs.getBoolean(8); + boolean isSelf = rs.getBoolean(9); + boolean isContact = rs.getBoolean(10); + Author.Status authorStatus; + if(author == null) authorStatus = ANONYMOUS; + else if(isSelf || isContact) authorStatus = VERIFIED; + else authorStatus = UNKNOWN; headers.add(new MessageHeader(id, parent, g, author, - contentType, timestamp, read)); + authorStatus, contentType, timestamp, read)); } rs.close(); ps.close(); diff --git a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java index 1799cfb642..37a4c944f2 100644 --- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java +++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java @@ -41,7 +41,6 @@ import org.briarproject.api.messaging.MessageId; import org.briarproject.api.transport.Endpoint; import org.briarproject.api.transport.TemporarySecret; import org.briarproject.system.SystemClock; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -898,42 +897,26 @@ public class H2DatabaseTest extends BriarTestCase { // Mark one of the messages read db.setReadFlag(txn, messageId, true); - // Retrieve the message headers + // Retrieve the message headers (order is undefined) Collection<MessageHeader> headers = db.getMessageHeaders(txn, groupId); - Iterator<MessageHeader> it = headers.iterator(); - boolean messageFound = false, message1Found = false; - // First header (order is undefined) - assertTrue(it.hasNext()); - MessageHeader header = it.next(); - if(messageId.equals(header.getId())) { - assertHeadersMatch(message, header); - assertTrue(header.isRead()); - messageFound = true; - } else if(messageId1.equals(header.getId())) { - assertHeadersMatch(message1, header); - assertFalse(header.isRead()); - message1Found = true; - } else { - fail(); - } - // Second header - assertTrue(it.hasNext()); - header = it.next(); - if(messageId.equals(header.getId())) { - assertHeadersMatch(message, header); - assertTrue(header.isRead()); - messageFound = true; - } else if(messageId1.equals(header.getId())) { - assertHeadersMatch(message1, header); - assertFalse(header.isRead()); - message1Found = true; - } else { - fail(); + assertEquals(2, headers.size()); + boolean firstFound = false, secondFound = false; + for(MessageHeader header : headers) { + if(messageId.equals(header.getId())) { + assertHeadersMatch(message, header); + assertTrue(header.isRead()); + firstFound = true; + } else if(messageId1.equals(header.getId())) { + assertHeadersMatch(message1, header); + assertFalse(header.isRead()); + secondFound = true; + } else { + fail(); + } } - // No more headers - assertFalse(it.hasNext()); - assertTrue(messageFound); - assertTrue(message1Found); + // Both the headers should have been retrieved + assertTrue(firstFound); + assertTrue(secondFound); db.commitTransaction(txn); db.close(); @@ -950,6 +933,62 @@ public class H2DatabaseTest extends BriarTestCase { assertEquals(m.getTimestamp(), h.getTimestamp()); } + @Test + public void testAuthorStatus() throws Exception { + Database<Connection> db = open(false); + Connection txn = db.startTransaction(); + + // Add a contact and subscribe to a group + db.addLocalAuthor(txn, localAuthor); + assertEquals(contactId, db.addContact(txn, author, localAuthorId)); + db.addGroup(txn, group); + + // Store a message from the contact - status VERIFIED + db.addMessage(txn, message, false); + AuthorId authorId1 = new AuthorId(TestUtils.getRandomId()); + // Store a message from an unknown author - status UNKNOWN + Author author1 = new Author(authorId1, "Bob", + new byte[MAX_PUBLIC_KEY_LENGTH]); + MessageId messageId1 = new MessageId(TestUtils.getRandomId()); + Message message1 = new TestMessage(messageId1, null, group, author1, + contentType, subject, timestamp, raw); + db.addMessage(txn, message1, false); + // Store an anonymous message - status ANONYMOUS + MessageId messageId2 = new MessageId(TestUtils.getRandomId()); + Message message2 = new TestMessage(messageId2, null, group, null, + contentType, subject, timestamp, raw); + db.addMessage(txn, message2, false); + + // Retrieve the message headers (order is undefined) + Collection<MessageHeader> headers = db.getMessageHeaders(txn, groupId); + assertEquals(3, headers.size()); + boolean firstFound = false, secondFound = false, thirdFound = false; + for(MessageHeader header : headers) { + if(messageId.equals(header.getId())) { + assertHeadersMatch(message, header); + assertEquals(Author.Status.VERIFIED, header.getAuthorStatus()); + firstFound = true; + } else if(messageId1.equals(header.getId())) { + assertHeadersMatch(message1, header); + assertEquals(Author.Status.UNKNOWN, header.getAuthorStatus()); + secondFound = true; + } else if(messageId2.equals(header.getId())) { + assertHeadersMatch(message2, header); + assertEquals(Author.Status.ANONYMOUS, header.getAuthorStatus()); + thirdFound = true; + } else { + fail(); + } + } + // All of the headers should have been retrieved + assertTrue(firstFound); + assertTrue(secondFound); + assertTrue(thirdFound); + + db.commitTransaction(txn); + db.close(); + } + @Test public void testReadFlag() throws Exception { Database<Connection> db = open(false); -- GitLab