From 47074b48d65c881111312c3433f61f62c6f16fc4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 30 Nov 2021 12:36:12 +0400 Subject: [PATCH] Improve sessions list design. --- .../devices/device_linux_ubuntu.lottie | Bin 0 -> 7415 bytes .../settings/devices/device_linux_ubuntu.png | Bin 0 -> 757 bytes .../devices/device_linux_ubuntu@2x.png | Bin 0 -> 1548 bytes .../devices/device_linux_ubuntu@3x.png | Bin 0 -> 2294 bytes .../icons/settings/devices/device_other.png | Bin 0 -> 414 bytes .../settings/devices/device_other@2x.png | Bin 0 -> 662 bytes .../settings/devices/device_other@3x.png | Bin 0 -> 984 bytes .../settings/devices/device_other_large.png | Bin 0 -> 611 bytes .../devices/device_other_large@2x.png | Bin 0 -> 1011 bytes .../devices/device_other_large@3x.png | Bin 0 -> 1686 bytes .../settings/devices/device_web_other.png | Bin 0 -> 821 bytes .../settings/devices/device_web_other@2x.png | Bin 0 -> 1566 bytes .../settings/devices/device_web_other@3x.png | Bin 0 -> 2454 bytes .../devices/device_web_other_large.png | Bin 0 -> 1081 bytes .../devices/device_web_other_large@2x.png | Bin 0 -> 2148 bytes .../devices/device_web_other_large@3x.png | Bin 0 -> 3999 bytes .../icons/settings/devices/terminate_all.png | Bin 0 -> 699 bytes .../settings/devices/terminate_all@2x.png | Bin 0 -> 1253 bytes .../settings/devices/terminate_all@3x.png | Bin 0 -> 1904 bytes Telegram/Resources/langs/lang.strings | 10 +- .../SourceFiles/api/api_authorizations.cpp | 8 +- Telegram/SourceFiles/api/api_authorizations.h | 3 +- Telegram/SourceFiles/boxes/boxes.style | 38 +++- Telegram/SourceFiles/boxes/sessions_box.cpp | 207 ++++++++++++++++-- Telegram/SourceFiles/info/info.style | 6 - 25 files changed, 231 insertions(+), 41 deletions(-) create mode 100644 Telegram/Resources/icons/settings/devices/device_linux_ubuntu.lottie create mode 100644 Telegram/Resources/icons/settings/devices/device_linux_ubuntu.png create mode 100644 Telegram/Resources/icons/settings/devices/device_linux_ubuntu@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_linux_ubuntu@3x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other@3x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other_large.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other_large@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_other_large@3x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other@3x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other_large.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other_large@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/device_web_other_large@3x.png create mode 100644 Telegram/Resources/icons/settings/devices/terminate_all.png create mode 100644 Telegram/Resources/icons/settings/devices/terminate_all@2x.png create mode 100644 Telegram/Resources/icons/settings/devices/terminate_all@3x.png diff --git a/Telegram/Resources/icons/settings/devices/device_linux_ubuntu.lottie b/Telegram/Resources/icons/settings/devices/device_linux_ubuntu.lottie new file mode 100644 index 0000000000000000000000000000000000000000..b4f5567192eb0480add5ac16ce281ef45679fcb7 GIT binary patch literal 7415 zcmeHMOK;Oa5dJICp4XP&NqqxRdg4^U#fnf!-6rHI+X1SoQh^(fGZF{*3#9^4fm;58 z^N;vuckMWd18r$qpiz`vJ3F48*M2je?6D`zXRcn=9md&q#C*@-tUY8trU53?!o^eO z+n8E%>i6)-=+UU3j2_ws9^2a567-EY4wIPqL7lU1V>gWGdM{sY_d#ZImh3X$;Y_f( z-)|54U@>e&VLxHM%UKK|K-Iy+du%{MLvZilXM==$h6{6_Gtd>*vK0d>kh`!Fn6~b& zIo#j|1f$0-$cGV>U|pmHNlpYA6p@f57a|}j)K~HI6e%%;#1JKJHHM*7pVVbL5tM90 zLD)ms0W@MEZqWj%l&PF=1WM2cLZZ15J7cF`tirEBpgFp=R^^(jo7GyK2b!l>>3&Uj z4RK%7E!*K*P50zFB7yE5-F9kq?9pU?5{*JAChUe;xGjC3o~9?`7vq=XgNg|adVMH) z>(1@<%7d_(45G>=8K9z7Hlo332!a-TzuoA@V5KaeA_1mS7Jyfz(=XKmQo|VqrGBu7 zw9kxrq;<}yy>&6|q3pE(?PX|h3-=m&&4%-(C8lmPbtmcM-5K?^&#kx6x7VZRfFN+c z45bh0r}3-wOZquIPEXQf1l5~L`fU0$aEq8>rU!*a7vtVN$Up14)~F93Q}e zr*Px}tn(FDN9iFslI_D_!iDn;BZH=rSrY;@YC^~PqO2;Kpn!JALHkX za3{;TD#S~HrwkHB)Lc6x;u!x1tjRJ9@QY9iRcgW97LJH?BH>gQSpdhV`&djp6n4Oa zDO^Vy0&1Ni4V?kkH2nD{Pl7h9f*W0c8kJ&Bb&753rz= z&g#qgwuoAxUPqw~Qr7x7GmpF;wH#NpP>L-E%K>k&65Xz{|0!G!c+J{)7fd*)8mL)h zdZI;?O?h+hQac)^$4yTubd5cYGW40Qd(YK5K-EDW`k&hde^F^kN1d7m2=^s64G^Tg MM%0miN!Is&0wFjvWB>pF literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_linux_ubuntu.png b/Telegram/Resources/icons/settings/devices/device_linux_ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb524953435217bd06b630c7a64e65a85df9013 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3t#^NA%Cx&(BWL^R}E~ycoX}-Q- zRU8bA?U@WLASFO71;h*t%nKM9n1M7SNNfQUTvlrVGlC6LctvU{Hv&;e)wKv z*Y33N_Z+Xt%IfOZU#kpkW%yW`8l%?6tqm*TfA!Vs$A$= zYBxmaxbc@5%~UwQ|20eV!JjpL?uTZ--!OmegC!R;TzcgC-RGY#KiP6JWl=nr)AHw! zRdtt@t_+FN5p&de>Zmt8*{Rs#VZn?aT#PFZ^rYXqnqi`$v!nXTw6|s5>}@hBK@SQT z=J_o@(j2z>XwUu~(w!~^ay+I|yfKbuvvarK7QeWqw`iwNU%ZakmbvpgzU+GTwaQlR z{PE+*b=d-H>o3}+P2K;*VDq8LW$`|Ci)vC|1*!z|^Jn^}UJjO*v#BV&*~reXyQ@6U zGQ&w@%l8~hg$ISa(@$-9z5mLNhu?oQ)_&XJSlOP)&6L)4`K8M#t(L!a{XDuNTqzsF zR>$(c;D5v(%HJ#(a>31esZf-)rGtjZsgzA0D}2HXgav*E9?E8W>+X8^R;pxzT2$iV4YAH3+)1azN)KV21YTs&C)Kc0| zZ6t`Tq;|1R)7lSd<)BmRAe5R+{Fyn^AK(4%eee5m-@EU9iS~9F84wr*003lctWl0a zc0PiHh%jbJ#^(wNNOZ&?0k20?z6c8x-p%GF4hMh;a|r-2o&XR#k_Z770ssp-8c z3_MyZ75R79xm5JO{7A^WHEaO@h~KwCU2+ZsuDV~-3B9B!SfMKozydP$@dK1{9gDB?nwDmT!330H z2~MJw#w}DsBcs1|c4VZbNhDHzLj!tqdwZM56I)MBO^uH~M*8~sGo41`E-qT(!otG` z`uk6T!R1BdL>hxJI6Qn>O|7G&Lr}|0OiEIR;c&P_G|a#N3WW;JJ-bm;R(2yaba!E) zVp1)4Yjg7k9xoo=Ha|Bv3Az0HMrFvHy?co7?F}}I#hRV<^z6AeGCI1xw#E{6(9LAI zI)J@Fm3SP=%F6MesJQsksnZs5VutDruv82ZXz1kRM78@Sk4B^OTXc1GKXfN0f$%Vg zsIV|Zrkb*H1@^K}-I;mukGdB{;B6HZ6t}j92E4B?5?fEBA=?u0PWR_P(*A*geyK1hv{HmtQY+6H9UZ-X{W?nZAoA+fiK(fnot>TTZWI

`gZ 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 m%$Z5tMbV1h`Y&S3cEBoe`U literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_other.png b/Telegram/Resources/icons/settings/devices/device_other.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8bce06a0274608d59104860f93ee49a225fe2a GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591SGu{#_<3t#^NA%Cx&(BWL^R}E~ycoX}-Q- zRU8bA?U@WLASFO71;h*t%nKM9n1M7SNNfQUTvlrVGlC6LctvU{H&7Xer;B4q1n1kS zzI-kY0)QuzTQ=Lu+qnN=bN)7iY<5k zDe}kn%vz?o{=<}Z(M73|hq}W(js%;T^vl)UKfYRHwR@kp&1s{8&c_uK+ZN{DR^XU& zcWbHcPm3<4)0@5(FJM0PZ}a?nPqHMA>A%&?zp#H})i!mGJ92h&WL#cW2YSV hY2Y+qRQu4*5@&Jk;Jk|xnV^tl@O1TaS?83{1OQ$rmq-8r literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_other@2x.png b/Telegram/Resources/icons/settings/devices/device_other@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..db27d3482c6d9eb8779c1a13957984a987fc386d GIT binary patch literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1SBVOwoe06jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-evVa-E1}WU0an^x>fr-J>#WAFU z@$Ia=eT;z;ZRV4ETUeX6ZAS<;rY;iGrNuERVA^!}4);IH9HX2U8 z@!8xs{k+}fvp?>=uX+F3Z_bks9}luJayT$B2{bUUC@^3$8{%13U42zyb1!duykY$D z$AwmNue~k}|H1h@Y1xd}{ag0mf8XnNnDf8V=jj)PcFsKi+;4{egWUd4H8ygsP6sd4 zC#(?vRJ1eap37Ee0hXy=uA!oHKDX+b@72Hn56yP*->fRy8B?`4j%(VJ>044wZ!N$5_Ei5wztoZpZU1Sf zpI-J~e);Cxviz!fe#Iay&ZvvTUwulubz7Bke-K*Ov1G+Q}H<&XA%@EdqZU>u9%r`HoN_>tAG6BR)=a5zW88ZspF_&UOsh((Y_>sFVdQ&MBb@0RDduCIA2c literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_other@3x.png b/Telegram/Resources/icons/settings/devices/device_other@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec10ee96fff9617beb21ffc34ac4616eba659eb GIT binary patch literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^bs)^a1SE4EjqU>}#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1ATfmH9gA^)E6L$kDck*;`45?sz zduMN!k)ue%Lk&lPMaP^1v>i8W_{!un{n+gfOg{5hcf?+Z-Vn6mLYQ^+{~(qtZUVZO zp8jTIQEV4YEdRD+_4=vlX2s{uY~K9({I1H12aOC&910B-5DESYLY-G$fBjfdVq5~g)|BT$7p!+{Y|*-4ujQkhq5AA|<@VcufBpLP^QWcxwv#DEdBHPo$=a=o zUwJaZT&g$YOWwVp_>+;-?!N#2w8+vY``Yh_r3a@beP&(teP@f#;i)VBPm%3)Q{Vdh z`SY^fd++A`|8w-`gYVzV&1RdLt{t{#OjOk}^v--CVOX;bqj@uV1g0#$Wsx_u}Z5 z*!E{aU9a~oQvSm9#OcM;4#AZR#TBX)zf@gYB=m*JMZYEPd{jtNT*Hgj3$G))y)JMI z>=mf8%?{+OVq7Hdv_4%|%TeFqi_?p*Yg|=duy(|8?47rD1h=BgR%Kh3F5CDjxA*I@PY(54WwYASZVnki&{HRoFU+MhQT_8(2!#wPN?ru*ojYaDMc%#L4kTWW%TrBLS) z!_R4(KW-}e{db?ga>-1y$tP#r{#0WdS?yDIdb`<-|9RK4wuY^q>aIM0*Zr5gwtD=k jyA&x&ra-;dSpG3{2|V1Il|J`7C|7y9`njxgN@xNAGaID% literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_other_large.png b/Telegram/Resources/icons/settings/devices/device_other_large.png new file mode 100644 index 0000000000000000000000000000000000000000..0f47128db6ca4b54c75c61c84fd1c3549865e30b GIT binary patch literal 611 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_web_other@2x.png b/Telegram/Resources/icons/settings/devices/device_web_other@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ce90741f832fd5a28b46e96e9124e0dd2f8e687c GIT binary patch literal 1566 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 Sv2M%!nu)NMwkQ_DH~!xkJAhUI literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_web_other_large.png b/Telegram/Resources/icons/settings/devices/device_web_other_large.png new file mode 100644 index 0000000000000000000000000000000000000000..200206a6e97336a1e00a35ef4552dc10b5eeb6cd GIT binary patch literal 1081 zcmV-91jhS`P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91JOBUy0E^%0TmS$Aqe(e5n6XPEK@`T#88l#! zbb^hfh(%OT1UoT}h$&Rk*`^TDGJ=&sY_+ry45<`5#U^59{)9AIs3}ws#70ojKoai< z4~Air+pKrHA@OF5@aDa5-hBDy?ab_SbeP8|U=%P47zK<1MggOMQNUIKpKbIT!JeL; znVFe*JRXfkhlYlN!62RA-rg=RFR!kya=G03`T6_%`!_Or3LP68J3c=C`1ts;eE?xVX$p;1o4h{~g)v97EcBN85T^1i1egCuD;P6iX1Z*OlqJ3IB^Y2pNbeSIx{y3kQFG>JFUDjMJ4-wzKD3y-O(DIu}6 zw4^f@8>d8piDzVFgzh*=<$0a(0!bYsm0}E!Y&Hvn&(F`^-ric$I0*p&rlRl`y-Dcp zd&!H>*c7Fz3L)|E@PPm176=3w!eK|J z<-tjajOekmvqK5$*_W4>nSGYwqoX6;Z?P8_7Y7FipPruf_V)A;<*~lL&H;-dIGpIA zf3+_zE~tlmK3|*Y?(U8dyL4?x_W%F}Sa*s|T0#s_8>;JZS|0uV{q%o)e5}nPr_hGS zP5}tml0?$V5SCEgrfZ}*I@cXQIR(&E(rWBhFq|rFGlMn~>imb~%taY76sNY{SZ zV_B6veSY{h?zB8uWw{1eSXkh|w7a{@Ay`c!2d4S?d75l>YXfnI+V3L(-Y$M_@wL{Z&nU-fE3>RvVL=| z(afvf|MgN`Np1|IfKk9GU=%P47zK<1KT?6;Ch^1zoyeN`00000NkvXXu0mjfx-#1k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_web_other_large@2x.png b/Telegram/Resources/icons/settings/devices/device_web_other_large@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..740152c945e74a7075a5dac1bbff515233a75a73 GIT binary patch literal 2148 zcmb6beLU0acSy++7maQ%?RrVgPsu9MrEOBX%S&R+RxB@}xn5S{B3-j9&2D*}m(A!_ z!b}PCQhDt*=G~<$Z(ZgsMvQse_%M+Jay z0RVv%^5j4Y0G8X?%ai|~G$K#o|MZTc(wOT!2(+gIZHsV;kP|WA-a25fnIJoVA?dI- zBFTsv=SlT?Hm&FN4LA`Q*l;YpA`bHXr_BByJE@7LBKWT=c@rs?hz1iA z6Bid33kwS!vhldeL#Ig=F&oPzc-}}|?6zZ$&E*r#I!9nM5Bz|xb@bX~dyZHv4jOB} z@?kGGT-wd@j{;yp9?7aMp2KZH?Y-5FS+;eMX zmSN~@vMpT~_dLT4X|F>=+&RIw0v=5ImuJCIIMK-4&6U}Ykofevm`%x-J{UeuIzL>C zO4yG}&~Y{n)V^U#oq^JO%J1~}MEd(r3mC@(mav&j<~bl-?zP&<$w|`s$5KyK9gD|Q zB-9nFfocnlgW+>q;r1Y$n?1}jc1t>17u#EY^_N@Zh=_>x>{ABk&YsQA(9etg@@Ju% zQc*K>(s*1sVE|(tdPy6aU~gO(F3L8{& z4UDSZTiUx*ZH+Q-@a~kfKRah-B^c^_etYGMD_Aj5K|uivh5df`j4RXqRCXS8w(=Ec zz1UAI>@O!zIbh;vR+g8```+A>)wn9PyuiVj2Iea+>|euz>*!xlRqL0|D5piO&OaNz z@Nit%lA56vyAGu0d4(b}IJk6Kl|rFBaU{b7W%?TKsCoLnf->(Ur|q@rZhi3BmTXhL z__LbtEm|>Qf~0B}QK2U`L-4nV3nOoHXkMEV5sgNJ^e1W@2|GmwU#YCDY9w;~BsE6- zpF4dslLmyz=%a()1{NJGtDEV#hZwu4>X&6yV?mtW{?~zNYUd@(8iCv}6=mG@#|7`<+?%S*GBVQku&LHq)y$GAoZyUR7ZExxQ&HE* zDH1;af#NbyM4A`zjWn&}9K9h(rbbFz_pR_NV*e&TT3ZW&jKHWQ%Skj8<)-8ky=e@Kvja zgVjA)-uz*t=_C=TA@_=f(YnE=a9=a6DQK{I5y1>vyfl%Fz~BN6GVaLl<;&AQm`5#{Oh`lrLb5EK1r_ ztUoz66zG9NrrUBR%O3kuc|zv`cc2!zsXixo7?|Oa-gu9OqG)Dv>GYC{mjB7=V=sbm zefg1??LN)#DO|~(G#jf0M;DCID|K?H?vhCi)j+-MnCCkk1Y^z>g?<=mj(Gitzu0lL zexQ+KViNCyt*f$admqWi0xpr*34y+6_tN#WHcupRFBp2DOgVig7##XV$|ZhLbfiz$ z$vMU}3XskCps@L2JJ$f)o9^}nncde4#Ip9IX*-{lK)>CWg632P4f?geuP!ND>i+$r zD4$?f8HnSz5k&s*T3&a*sa}>ADt3D-XgtwcalyYiJL;#HziqTILN4X>^>@)(gU)ni zAo$O^hXcY4Oc4iD6{ zdQOwtjWg`#VXbfavto*=va;~G2AMg)?>rV~rVdO9N$Z%^SKLqi_sWhF$p|y~R5Nz8 zU0f(F*6ztELO0*ne!IRIDzcL{8OxW9L1Qk>dov!eH>yL&cQ=$wJIV}>Bt&^jn$%l< zXtlZSy11c|Wi~1Jt+aO$^ysRLOoHAHVwf|CBgW+Av^(7T)pV%>C5Ym%&s{aSqJYr+ z9i+#0x!}_Qjq4uf*x{P^L%ai6IYx%vNBmTEQfz{W?yCO#8Trp#{gYW=C;3|>x7tVE`4fQ97aVN4NUym60-)X+ A!2kdN literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/device_web_other_large@3x.png b/Telegram/Resources/icons/settings/devices/device_web_other_large@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6463c3a3430f0485c974cc9e43d79842f65bf183 GIT binary patch literal 3999 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 aic3yS3qh7=s}tw9pJRxc_A?~NI`ls>^l;Mv literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/terminate_all.png b/Telegram/Resources/icons/settings/devices/terminate_all.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf538575e787d6296bcd64e9057795e7034c28b GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfl1ZV#WBP} zaBqn1iH(60-#%*^1)hrU>SgS9-855U^2CEWsUd7XPcB=+!`AA$@dghYbGM4-)A9+E zrtJTt`muKUy!VHHKd7y~|K;xCmsa0v?_Rh3zVp1L$fVRo>i%zbQTk}RFvFzl&fhwF89qj)#s(Lq$hBby&ZY@VKPlQ7uQBWF zvl6S`UIq8%msf^pF-$($vgKk1%bweB4W^w=)tdS%NLz-lxx|#O-I+tO*Uc%zK*B(x z$7vx$UyNS8$fAR-Ceu$}&Dv@r#p_kAa&U8uUjOmrr9q5hT&?|cx&{0gll7*rzMA#< z=bwosUlXjueVD`-p3hRd81Jv|l)rI1=U=7VbhFtHudTVBeaL>UALE7g!w(BmS6$8O zKB_eNp8YE@hYi1Frx0>M$Ujnqjqb%kM4jHgf%M%c_lL+RQ)Sk<|6^+r0VHzO8Wj^gts( z)~xjNe}@y#KRYhH|GxX^qxsxF|JJSeQni;~>w<8n3&)YiA7_8d7U5xYJl5X2MqS5d z#x81s7>A?((4wiAu`j4ZBE&4T>%b{mfIrY zEaf7;tY3w-#kyPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGPf0{UR9Fe^SW75vQ5fFNIVR*8 zl4o8cQHBN{c_m_CWWYf3%qwK-EqP=hsYwPOj>ZhltU(Bzsug~7z-i*Dnsr~)^dwYA=*Vk`uZdO)SHa9mJC0e+%vtwgp z!v>lKXJ=>M-rj1vl|)@#U1kwMNf#Fv4GFlqx=Kq+v$M0qOgcI`;%Tq1uM-m!-QC?e zIXMmv4wUC>fR&XMt7dj~wymvgcXyXJ;w4fy!^6WYlg9@K2Z@P^#8Cn?q9lz*6B-&C z92^`H5<&z#bU{G@ns|Mf(E#jpIXO8YCIK%mugS^Dh=_=#r6n>-1EC<5N|m0TURPHa z5D*}U#3B+{FbrfNj90d`wdLXA;pXNBuUf4h7#P5VJw84XSpuk7AD(z>YHDa`NM8+T zm@zEb5bo*e2@4DJ_Vyke9OOAcK|%5H@rL*UyN;mF&Q4=rxgZ^yr>Cd*i%(Q#WhHsp zS5HP!pcNDt7?_on#gm?&pBoz+@nnCqOrQ+1_=H%AqTTBowR0#oHWq7&XJlq(j*X4! zvn^oJju7@E>Ti5}oUny~RuByj6kw%TSO;~d6-1`*1wVr1#{Xx8{<#s-ei-GXbLZ#h z0uF0=cz6(a^_#xFz9}gwo}Qk2dwUBD3)|b<`W$&d)6>&QNlDmrFD@xVg?6uglQAePf;Jt5eZ?Kehs?%H8nLfXi<9k6DFLM&4h9%-whx6EQt%~oa&l7I z8N>Uy5MnGk5O*}Vvc!cUrV(53>5x7fxSm4kgS+$P<>ha@KlzmNzyALXL@N`oFaE2r P00000NkvXXu0mjfQ3NL> literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/devices/terminate_all@3x.png b/Telegram/Resources/icons/settings/devices/terminate_all@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d4da46f9fe2c849d20344a591f7a9288171a26bb GIT binary patch literal 1904 zcmV-$2aouPP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS>+DSw~RA>e5TWLsDTNKvU(~>Nk z(830-v`ZBBFjZf|N5_mAGgSA=QiZ#B@Ba1cmn;O*jq>vHEcHW0`FZo^efsoC+S?H| zn4%jtY?wNA>YO=q;^X5n18Mc(;NYoKr_P)?la!Pc6cjXOjOJUkseU+g=n!?z1l`-) z>*3)+btNVynrPqJ+PZ!Fc6)n!Dl&TX_3PJ}b3HvhX=!QU;o&=X?(FRBG}OL*`1i;0|Nec0$M4_2HIua_7z+%xyY>1uK}|lP6E6n$@9kw0rjKnNcLHaQX7()TAO{>({Rr zWU;6&UAn|H$Hc@?%}VLN!~)~TkB5KEV{tRfOE6G^lD@va*w|RMCPPC*EiqvPSax>`x4BANqZ^AO)F8ynxfd-q2Tih)sgahIv9tCO zg1!g~3zL#%<%@s+SRrM7eSL9VT(xRdRaF%&7ih)6#42dXzJ2?utEFI`0 zu~-k{{^CMfqB~&a<>knInm$`#|5&|xHHCp0OIgr50tPTESFXhN&0G|-85tRK=gy_& z41r79Nt|tR+rfI1jKw&gyx@ zFaz0Gfkhr~+_-TZh82xiW@aWn%?tqY_ekpFM8e9!TE|qxM_HVeuC1+Iv0}xSFJHu{ ztOMAQBS#J%JjlGSsi^@fyxwBv23GGQcJ$~`_Amji;{pLxc#UO%AtrPU?AWnm`}gl> zPQQ8c2B=INN`&_M1%^!=w>yUF_3PL8i2o54llqUviyykBLc5Vh+7}_gPu&pc%F0T- zH#5^XPM=gG0w!iEvOw(Q$&=IvfqwPsmHDXP45B|&DKhz^{2UDzaO!|S<1sOA$`eERfhW*zK{7cay|K_yy$x5bSBOOtAU^5ltPEy@KjFYqFh+7)QT z*i=9z_;c>uIc7k7mQn7xDG8v;&CO*-!Qvc424 z>@HlmK+Op>0yr)%F7oxrYI*qZVX>w2=g%XKCre&-qoqri;zhgI7UsYDsNj{8lM^~j zY!81Ez(ifQZr$wJv(eMC{U6Z~v1`PV@oKNMv=nneYz0v9pml_dip=!s)A0sdY*p)$ zM~@z9h)U=ng#2-c)*1=bf9={eyp~jPcqCOJ@`?a5wXG42kQ>ehqkI^!Ly80`AB`Yk znO(hl6@gL7-qo}MeTg^NIXO8yNh}M1VcvV q^XJdF(qsB*0m-J*)&sigfqwyF5E@z27p$)U0000name); //} result.system = qs(data.vsystem_version()); + result.platform = qs(data.vplatform()); result.activeTime = data.vdate_active().v ? data.vdate_active().v : data.vdate_created().v; diff --git a/Telegram/SourceFiles/api/api_authorizations.h b/Telegram/SourceFiles/api/api_authorizations.h index 45092eca28..f789740fc3 100644 --- a/Telegram/SourceFiles/api/api_authorizations.h +++ b/Telegram/SourceFiles/api/api_authorizations.h @@ -21,8 +21,9 @@ public: uint64 hash = 0; bool incomplete = false; + int apiId = 0; TimeId activeTime = 0; - QString name, active, info, ip, location, system; + QString name, active, info, ip, location, system, platform; }; using List = std::vector; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 6ee4529a0e..5dd5c1894b 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -281,10 +281,21 @@ membersAbout: FlatLabel(defaultFlatLabel) { sessionsScroll: boxScroll; sessionsHeight: 350px; -sessionHeight: 70px; -sessionCurrentPadding: margins(0px, 7px, 0px, 4px); -sessionCurrentHeight: 118px; -sessionPadding: margins(22px, 10px, 22px, 0px); +sessionsTerminateAll: SettingsButton(defaultSettingsButton) { + textFg: attentionButtonFg; + textFgOver: attentionButtonFgOver; + font: font(boxFontSize semibold); + height: 20px; + padding: margins(77px, 12px, 22px, 10px); +} +sessionsTerminateAllIcon: icon {{ "settings/devices/terminate_all", attentionButtonFg }}; +sessionsTerminateAllIconLeft: 30px; +sessionHeight: 84px; +sessionInfoTop: 21px; +sessionLocationTop: 43px; +sessionCurrentSkip: 8px; +sessionSubtitleSkip: 14px; +sessionPadding: margins(77px, 11px, 22px, 0px); sessionNameFont: msgNameFont; sessionNameFg: boxTextFg; sessionWhenFont: msgDateFont; @@ -293,6 +304,8 @@ sessionInfoFont: msgFont; sessionInfoFg: windowSubTextFg; sessionTerminateTop: 9px; sessionTerminateSkip: 22px; +sessionUserpicSize: 42px; +sessionUserpicPosition: point(21px, 10px); sessionNamePadding: margins(0px, 0px, 5px, 0px); sessionTerminate: IconButton { width: 20px; @@ -308,10 +321,6 @@ sessionTerminate: IconButton { color: windowBgOver; } } -sessionTerminateAllButton: LinkButton(boxLinkButton) { - color: attentionButtonFg; - overColor: attentionButtonFg; -} sessionNameStyle: TextStyle(defaultTextStyle) { font: sessionNameFont; } @@ -321,6 +330,19 @@ sessionWhenStyle: TextStyle(defaultTextStyle) { sessionInfoStyle: TextStyle(defaultTextStyle) { font: sessionInfoFont; } +sessionIconWindows: icon{{ "settings/devices/device_desktop_win", historyPeerUserpicFg }}; +sessionIconMac: icon{{ "settings/devices/device_desktop_mac", historyPeerUserpicFg }}; +sessionIconUbuntu: icon{{ "settings/devices/device_linux_ubuntu", historyPeerUserpicFg }}; +sessionIconLinux: icon{{ "settings/devices/device_linux", historyPeerUserpicFg }}; +sessionIconiPhone: icon{{ "settings/devices/device_phone_ios", historyPeerUserpicFg }}; +sessionIconiPad: icon{{ "settings/devices/device_tablet_ios", historyPeerUserpicFg }}; +sessionIconAndroid: icon{{ "settings/devices/device_phone_android", historyPeerUserpicFg }}; +sessionIconWeb: icon{{ "settings/devices/device_web_other", historyPeerUserpicFg }}; +sessionIconChrome: icon{{ "settings/devices/device_web_chrome", historyPeerUserpicFg }}; +sessionIconEdge: icon{{ "settings/devices/device_web_edge", historyPeerUserpicFg }}; +sessionIconFirefox: icon{{ "settings/devices/device_web_firefox", historyPeerUserpicFg }}; +sessionIconSafari: icon{{ "settings/devices/device_web_safari", historyPeerUserpicFg }}; +sessionIconOther: icon{{ "settings/devices/device_other", historyPeerUserpicFg }}; passcodeHeaderFont: font(19px); passcodeHeaderHeight: 80px; diff --git a/Telegram/SourceFiles/boxes/sessions_box.cpp b/Telegram/SourceFiles/boxes/sessions_box.cpp index 5ede4940da..bab50931fc 100644 --- a/Telegram/SourceFiles/boxes/sessions_box.cpp +++ b/Telegram/SourceFiles/boxes/sessions_box.cpp @@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/wrap/vertical_layout.h" #include "ui/layers/generic_box.h" +#include "lottie/lottie_icon.h" #include "core/application.h" #include "core/core_settings.h" #include "window/window_session_controller.h" @@ -39,6 +40,22 @@ constexpr auto kMaxDeviceModelLength = 32; using EntryData = Api::Authorizations::Entry; +enum class Type { + Windows, + Mac, + Ubuntu, + Linux, + iPhone, + iPad, + Android, + Web, + Chrome, + Edge, + Firefox, + Safari, + Other, +}; + void RenameBox(not_null box) { box->setTitle(tr::lng_settings_rename_device_title()); @@ -133,6 +150,141 @@ void SessionInfoBox( : QString()); } +[[nodiscard]] Type TypeFromEntry(const EntryData &entry) { + using List = std::vector; + const auto platform = entry.platform.toLower(); + const auto device = entry.name.toLower(); + const auto system = entry.system.toLower(); + const auto apiId = entry.apiId; + const auto kDesktop = std::array{ 2040, 17349, 611335 }; + const auto kMac = std::array{ 2834 }; + const auto kAndroid + = std::array{ 5, 6, 24, 1026, 1083, 2458, 2521, 21724 }; + const auto kiOS = std::array{ 1, 7, 10840, 16352 }; + const auto kWeb = std::array{ 2496, 739222, 1025907 }; + + const auto detectBrowser = [&]() -> std::optional { + if (device.contains("edg/") + || device.contains("edgios/") + || device.contains("edga/")) { + return Type::Edge; + } else if (device.contains("chrome")) { + return Type::Chrome; + } else if (device.contains("safari")) { + return Type::Safari; + } else if (device.contains("firefox")) { + return Type::Firefox; + } + return {}; + }; + const auto detectDesktop = [&]() -> std::optional { + if (platform.contains("windows") || system.contains("windows")) { + return Type::Windows; + } else if (platform.contains("macos") || system.contains("macos")) { + return Type::Mac; + } else if (platform.contains("ubuntu") + || system.contains("ubuntu") + || platform.contains("unity") + || system.contains("unity")) { + return Type::Ubuntu; + } else if (platform.contains("linux") || system.contains("linux")) { + return Type::Linux; + } + return {}; + }; + + if (ranges::contains(kAndroid, apiId)) { + return Type::Android; + } else if (ranges::contains(kDesktop, apiId)) { + return detectDesktop().value_or(Type::Linux); + } else if (ranges::contains(kMac, apiId)) { + return Type::Mac; + } else if (ranges::contains(kWeb, apiId)) { + return detectBrowser().value_or(Type::Web); + } else if (device.contains("chromebook")) { + return Type::Other; + } else if (const auto browser = detectBrowser()) { + return *browser; + } else if (device.contains("iphone")) { + return Type::iPhone; + } else if (device.contains("ipad")) { + return Type::iPad; + } else if (ranges::contains(kiOS, apiId)) { + return Type::iPhone; + } else if (const auto desktop = detectDesktop()) { + return *desktop; + } else if (platform.contains("android") || system.contains("android")) { + return Type::Android; + } else if (platform.contains("ios") || system.contains("ios")) { + return Type::iPhone; + } + return Type::Other; +} + +[[nodiscard]] style::color ColorForType(Type type) { + switch (type) { + case Type::Windows: + case Type::Mac: + case Type::Other: + return st::historyPeer4UserpicBg; // blue + case Type::Ubuntu: + return st::historyPeer8UserpicBg; // orange + case Type::Linux: + return st::historyPeer5UserpicBg; // purple + case Type::iPhone: + case Type::iPad: + return st::historyPeer7UserpicBg; // sea + case Type::Android: + return st::historyPeer2UserpicBg; // green + case Type::Web: + case Type::Chrome: + case Type::Edge: + case Type::Firefox: + case Type::Safari: + return st::historyPeer6UserpicBg; // pink + } + Unexpected("Type in ColorForType."); +} + +[[nodiscard]] const style::icon &IconForType(Type type) { + switch (type) { + case Type::Windows: return st::sessionIconWindows; + case Type::Mac: return st::sessionIconMac; + case Type::Ubuntu: return st::sessionIconUbuntu; + case Type::Linux: return st::sessionIconLinux; + case Type::iPhone: return st::sessionIconiPhone; + case Type::iPad: return st::sessionIconiPad; + case Type::Android: return st::sessionIconAndroid; + case Type::Web: return st::sessionIconWeb; + case Type::Chrome: return st::sessionIconChrome; + case Type::Edge: return st::sessionIconEdge; + case Type::Firefox: return st::sessionIconFirefox; + case Type::Safari: return st::sessionIconSafari; + case Type::Other: return st::sessionIconOther; + } + Unexpected("Type in IconForType."); +} + +[[nodiscard]] QImage GenerateUserpic(Type type) { + const auto size = st::sessionUserpicSize; + const auto full = size * style::DevicePixelRatio(); + const auto rect = QRect(0, 0, size, size); + + auto result = QImage(full, full, QImage::Format_ARGB32_Premultiplied); + result.fill(Qt::transparent); + result.setDevicePixelRatio(style::DevicePixelRatio()); + + auto p = QPainter(&result); + auto hq = PainterHighQualityEnabler(p); + p.setBrush(ColorForType(type)); + p.setPen(Qt::NoPen); + p.drawEllipse(rect); + IconForType(type).paintInCenter(p, rect); + p.end(); + + return result; +} + } // namespace class SessionsContent : public Ui::RpWidget { @@ -150,20 +302,15 @@ protected: private: struct Entry { Entry() = default; - Entry(const EntryData &entry) - : data(entry) - , incomplete(entry.incomplete) - , activeTime(entry.activeTime) - , name(st::sessionNameStyle, entry.name) - , info(st::sessionInfoStyle, entry.info) - , location(st::sessionInfoStyle, LocationAndDate(entry)) { - }; + explicit Entry(const EntryData &entry); EntryData data; bool incomplete = false; + Type type = Type::Other; TimeId activeTime = 0; Ui::Text::String name, info, location; + QImage userpic; }; struct Full { Entry current; @@ -260,6 +407,17 @@ private: }; +SessionsContent::Entry::Entry(const EntryData &entry) +: data(entry) +, incomplete(entry.incomplete) +, type(TypeFromEntry(entry)) +, activeTime(entry.activeTime) +, name(st::sessionNameStyle, entry.name) +, info(st::sessionInfoStyle, entry.info) +, location(st::sessionInfoStyle, LocationAndDate(entry)) +, userpic(GenerateUserpic(type)) { +}; + SessionsContent::SessionsContent( QWidget*, not_null controller) @@ -475,17 +633,22 @@ void SessionsContent::Inner::setupContent() { Ui::show(Box(RenameBox), Ui::LayerOption::KeepOther); }); - _current = content->add(object_ptr(content)); + _current = content->add( + object_ptr(content), + style::margins{ 0, 0, 0, st::sessionCurrentSkip }); const auto terminateWrap = content->add( object_ptr>( content, object_ptr(content)))->setDuration(0); const auto terminateInner = terminateWrap->entity(); _terminateAll = terminateInner->add( - object_ptr( + CreateButton( terminateInner, tr::lng_sessions_terminate_all(), - st::terminateSessionsButton)); + st::sessionsTerminateAll, + &st::sessionsTerminateAllIcon, + st::sessionsTerminateAllIconLeft, + &st::attentionButtonFg)); AddSkip(terminateInner); AddDividerText(terminateInner, tr::lng_sessions_terminate_all_about()); @@ -494,7 +657,7 @@ void SessionsContent::Inner::setupContent() { content, object_ptr(content)))->setDuration(0); const auto incompleteInner = incompleteWrap->entity(); - AddSkip(incompleteInner); + AddSkip(incompleteInner, st::sessionSubtitleSkip); AddSubsectionTitle(incompleteInner, tr::lng_sessions_incomplete()); _incomplete = incompleteInner->add(object_ptr(incompleteInner)); AddSkip(incompleteInner); @@ -505,19 +668,18 @@ void SessionsContent::Inner::setupContent() { content, object_ptr(content)))->setDuration(0); const auto listInner = listWrap->entity(); - AddSkip(listInner); + AddSkip(listInner, st::sessionSubtitleSkip); AddSubsectionTitle(listInner, tr::lng_sessions_other_header()); _list = listInner->add(object_ptr(listInner)); AddSkip(listInner); + AddDividerText(listInner, tr::lng_sessions_about_apps()); const auto ttlWrap = content->add( object_ptr>( content, object_ptr(content)))->setDuration(0); const auto ttlInner = ttlWrap->entity(); - AddDivider(ttlInner); - AddSkip(ttlInner); - + AddSkip(ttlInner, st::sessionSubtitleSkip); AddSubsectionTitle(ttlInner, tr::lng_settings_terminate_title()); AddButtonWithLabel( @@ -703,19 +865,24 @@ void SessionsContent::List::paintEvent(QPaintEvent *e) { for (auto i = from; i != till; ++i) { const auto &entry = _items[i]; + p.drawImage(st::sessionUserpicPosition, entry.userpic); + const auto nameW = _rowWidth.info; - const auto nameH = entry.name.style()->font->height; const auto infoW = entry.data.hash ? _rowWidth.info : available; - const auto infoH = entry.info.style()->font->height; p.setPen(st::sessionNameFg); entry.name.drawLeftElided(p, x, y, nameW, w); p.setPen(st::boxTextFg); - entry.info.drawLeftElided(p, x, y + nameH, infoW, w); + entry.info.drawLeftElided(p, x, y + st::sessionInfoTop, infoW, w); p.setPen(st::sessionInfoFg); - entry.location.drawLeftElided(p, x, y + nameH + infoH, available, w); + entry.location.drawLeftElided( + p, + x, + y + st::sessionLocationTop, + available, + w); p.translate(0, st::sessionHeight); } diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index a4a00c01d5..93269eba35 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -632,10 +632,6 @@ manageDeleteGroupButton: SettingsCountButton(manageGroupTopButtonWithText) { editPeerSkip: 7px; editPeerHistoryVisibilityMargins: margins(15px, 0px, 20px, 16px); -terminateSessionsButton: SettingsButton(infoBlockButton) { - padding: margins(22px, 12px, 22px, 10px); -} - infoEmptyFg: windowSubTextFg; infoEmptyPhoto: icon {{ "info_media_photo_empty", infoEmptyFg }}; infoEmptyVideo: icon {{ "info_media_video_empty", infoEmptyFg }}; @@ -662,8 +658,6 @@ editPeerTopButtonsLayoutSkipCustomBottom: 11px; editPeerHistoryVisibilityTopSkip: 8px; -editPeerDeleteButtonMargins: margins(25px, 11px, 22px, 16px); -editPeerDeleteButton: sessionTerminateAllButton; editPeerPhotoMargins: margins(22px, 16px, 22px, 8px); editPeerTitle: defaultInputField; editPeerTitleMargins: margins(27px, 21px, 22px, 8px);