From c12297d8cb7a3cf16c6ebefdb32ce2072f0879a3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 1 Aug 2023 19:09:09 +0200 Subject: [PATCH] Implement stealth mode in stories. --- Telegram/CMakeLists.txt | 2 + .../icons/mediaview/download_locked.png | Bin 0 -> 508 bytes .../icons/mediaview/download_locked@2x.png | Bin 0 -> 915 bytes .../icons/mediaview/download_locked@3x.png | Bin 0 -> 1313 bytes .../Resources/icons/menu/download_locked.png | Bin 0 -> 516 bytes .../icons/menu/download_locked@2x.png | Bin 0 -> 870 bytes .../icons/menu/download_locked@3x.png | Bin 0 -> 1226 bytes Telegram/Resources/icons/menu/stealth.png | Bin 0 -> 635 bytes Telegram/Resources/icons/menu/stealth@2x.png | Bin 0 -> 1237 bytes Telegram/Resources/icons/menu/stealth@3x.png | Bin 0 -> 1762 bytes .../Resources/icons/menu/stealth_locked.png | Bin 0 -> 726 bytes .../icons/menu/stealth_locked@2x.png | Bin 0 -> 1457 bytes .../icons/menu/stealth_locked@3x.png | Bin 0 -> 2123 bytes .../stories_next.png => stories/next.png} | Bin .../next@2x.png} | Bin .../next@3x.png} | Bin .../Resources/icons/stories/stealth_25m.png | Bin 0 -> 885 bytes .../icons/stories/stealth_25m@2x.png | Bin 0 -> 1778 bytes .../icons/stories/stealth_25m@3x.png | Bin 0 -> 2566 bytes .../Resources/icons/stories/stealth_5m.png | Bin 0 -> 791 bytes .../Resources/icons/stories/stealth_5m@2x.png | Bin 0 -> 1568 bytes .../Resources/icons/stories/stealth_5m@3x.png | Bin 0 -> 2309 bytes .../Resources/icons/stories/stealth_logo.png | Bin 0 -> 1463 bytes .../icons/stories/stealth_logo@2x.png | Bin 0 -> 2836 bytes .../icons/stories/stealth_logo@3x.png | Bin 0 -> 4385 bytes Telegram/Resources/langs/lang.strings | 18 + Telegram/SourceFiles/api/api_updates.cpp | 5 + Telegram/SourceFiles/data/data_stories.cpp | 33 ++ Telegram/SourceFiles/data/data_stories.h | 15 + .../stories/media_stories_controller.cpp | 12 + .../media/stories/media_stories_controller.h | 3 + .../media/stories/media_stories_stealth.cpp | 407 ++++++++++++++++++ .../media/stories/media_stories_stealth.h | 18 + .../media/stories/media_stories_view.cpp | 8 + .../media/stories/media_stories_view.h | 3 + .../SourceFiles/media/view/media_view.style | 74 +++- .../media/view/media_view_overlay_widget.cpp | 11 +- Telegram/SourceFiles/ui/menu_icons.style | 2 + 38 files changed, 608 insertions(+), 3 deletions(-) create mode 100644 Telegram/Resources/icons/mediaview/download_locked.png create mode 100644 Telegram/Resources/icons/mediaview/download_locked@2x.png create mode 100644 Telegram/Resources/icons/mediaview/download_locked@3x.png create mode 100644 Telegram/Resources/icons/menu/download_locked.png create mode 100644 Telegram/Resources/icons/menu/download_locked@2x.png create mode 100644 Telegram/Resources/icons/menu/download_locked@3x.png create mode 100644 Telegram/Resources/icons/menu/stealth.png create mode 100644 Telegram/Resources/icons/menu/stealth@2x.png create mode 100644 Telegram/Resources/icons/menu/stealth@3x.png create mode 100644 Telegram/Resources/icons/menu/stealth_locked.png create mode 100644 Telegram/Resources/icons/menu/stealth_locked@2x.png create mode 100644 Telegram/Resources/icons/menu/stealth_locked@3x.png rename Telegram/Resources/icons/{mediaview/stories_next.png => stories/next.png} (100%) rename Telegram/Resources/icons/{mediaview/stories_next@2x.png => stories/next@2x.png} (100%) rename Telegram/Resources/icons/{mediaview/stories_next@3x.png => stories/next@3x.png} (100%) create mode 100644 Telegram/Resources/icons/stories/stealth_25m.png create mode 100644 Telegram/Resources/icons/stories/stealth_25m@2x.png create mode 100644 Telegram/Resources/icons/stories/stealth_25m@3x.png create mode 100644 Telegram/Resources/icons/stories/stealth_5m.png create mode 100644 Telegram/Resources/icons/stories/stealth_5m@2x.png create mode 100644 Telegram/Resources/icons/stories/stealth_5m@3x.png create mode 100644 Telegram/Resources/icons/stories/stealth_logo.png create mode 100644 Telegram/Resources/icons/stories/stealth_logo@2x.png create mode 100644 Telegram/Resources/icons/stories/stealth_logo@3x.png create mode 100644 Telegram/SourceFiles/media/stories/media_stories_stealth.cpp create mode 100644 Telegram/SourceFiles/media/stories/media_stories_stealth.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 8fb9e62d1..10b47447d 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -997,6 +997,8 @@ PRIVATE media/stories/media_stories_sibling.h media/stories/media_stories_slider.cpp media/stories/media_stories_slider.h + media/stories/media_stories_stealth.cpp + media/stories/media_stories_stealth.h media/stories/media_stories_view.cpp media/stories/media_stories_view.h media/streaming/media_streaming_audio_track.cpp diff --git a/Telegram/Resources/icons/mediaview/download_locked.png b/Telegram/Resources/icons/mediaview/download_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..206d5893d729884b441805a2d3a6475091642d51 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEX~u!F~mYJ zIYA<)VI~jz%U7?WqN6{5{AgSKjc46l&U1&3&fsS&h}6~94G+H_zCLc|j2RJ;kq3`P zKG2EbS@8En(5X|W)cxn#RDF5z`}=!eU*ATa4xPm23BHMmiHyHGX3mt%XqhlUfL-Fx zkB`hN+Dw{ra&tpNLmO}L@bD;zRa924jo!|8LQTd^fL9oHa0fSoH=uI+F7T|Wlv5_f`#3-32 z1s*$b;sz6&1Dn`ON8Of337VRk%F4=0cdOssv3&B0!&O{mmcl~s2`pM}*Ll4S axyhh%Z~eT<3Ud-bA@Awx=d#Wzp$P!M#;?%; literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/download_locked@2x.png b/Telegram/Resources/icons/mediaview/download_locked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46bac90860ae390508fd44db5db7675920183b35 GIT binary patch literal 915 zcmV;E18n?>P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NE{YgYYR9Fe^SUYPfK@`?|uQ4$X z(G)>QB^GJK!U#bERz3=?EK&sR#KOkPVE%%Qt&%#VFnv_)0s$2pg%r_59n zAosgj7>3o|tZ}!vmz_esIrE)!zCANLGpj-&H@O0^`3lYWn>?h!AA6 z*}PuwLb3=`c7A^DbUJr-cJRbEH#e*_N~JOw460PBLZOh!WGa=))6r7Ar=p4JdyBdw=_4W1k_Li}?TCMy0dtfXnn#o`h1kDGfE!*4M=%Nys zDPn(qeg;NSiG={k1(8ew!7qWl@6qs*I~EYoaj%eH&JRT42&x4`n>guZ9ZsP*9unmX9Y&Ki3*Li|09)c7U7KafU zj`Wk06PlMwrI;ZA+WtK(s6v=8h+yth*fuUNFT>$5e?AStn&|?dONKzx>-DSV6XK6upwVcM#E*}U3?=|w5I_?WO&ktR@@ln8G_e4NKoBRB z@F+T+?(Xi6B?Vm=F(f>Wn9R-1&0H==YeE-BF>@>%3)jNy>uW|60P`uhY!LDJ$Dd97 zxN=0f0{=q=IR76~tJTqHREq5%CrmP##FcHi`kkGf(L0{F7{R&J2)dwgIZI*Z{I*9` pkx#lQlj33Im~sW=3jC85_yfR_5F!Z|4|)Iq002ovPDHLkV1fX3jwb*B literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/download_locked@3x.png b/Telegram/Resources/icons/mediaview/download_locked@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..57752e830b034464a028bd975d7eb3abccd427c3 GIT binary patch literal 1313 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz|!sM;uw;_ z`Zmg2qt;R4`;L3-RXANgbxi%9yfDH;(e+evqV|+c(>86KvgwbycA|6Q;X_SMPiD3X zX}`CboIdY={Qs4ivn;>g+4;Qa{U6ix!r#wkzyJO0`|q@KJB{yK#>M@*BzXZ0f7~}p z*nD%(-o103-p<(?yfD_hud7Q-SJ&6ikB^V<-;W;_*4EMS@%QiDo7VZpE=lESe0;po zhJ@gVh={PTXV0G>zxn?Cdw+lb`}gk`SFL+_cx(NNn>TM(R##US7c)Dib-a1=rmKr< zqG(NUaImzLR85VHLizEY)YR16++0Ds85`%!k@@^oL{RYJwQFJ$5**@BlJfH2J$a&{ zqobp*&%e+^Mnha&yff#=>xS(M`!}Dub0_9i6YEK{mGeZoxVSj9*K9v{@ZjCMcX#jJ z{rK_YlP6C;eVUpS855IZm-$ZN+3VM*A3d9uBR)}BSh$lx>iqfhYYzVT^XK_O6`u)4QQRRUETlE#LJp5-qefreUz|gd5)22zy zr_HjnvyF|6KBWKs^5w{@&NUZ;e7wC^uUofljmw%vYPPnrUtDZWxCFJew2WFZ)*W$U ziT1karkHf`;zcDp$=-#FosPT+j%(w|R<=vHuv)-SZ1w9+YR{_p?n*nJpHcn!?XQge ziN|lOFW-AVS)g6;S0yMuUjpW9UUE4uU=jMFV@=H zT2oUqCm`GCQAB~u%U7R11(j^^;F&6x45nwgn}g@y54pSsrq z7y-bred2TWW<*Taom+=BYZDU}u3D9qnb|4ru#eMg^XAP!Z+`svk#GAUgMGVpSy@>* z?G3EsI6m#hzcXjfC|Fh7+Sw(kxjvsZP3#(v@5N`gO~s}wrO7{MozoiOu;RL(udk_@ z*(NXllVY8W?@pigj*Y$h;e!FUtm?Um6DMA~78aJNcm2wh1lGRZ-iJ16c`vWUg@mxN zvE7*J_GH~Uy{^M4numIRJ!(66cv_XF;+HR90%}5Dyne0x;EiB2qp6xxUEMyRng{_| zS=k*QEfzRCJ6q^<9$DZbp5Bx0pOT^?9W1(Y=gyyR-}W|J8ya4`cki6m#g<7|9om%R zOjjIoIntQL({)KEL*#xW?{ydPmN=0#|i?wn{7=r_>=ypoooMc z=*+{@;?;{Q-1@ujKYX~*(p=)e8RH)@lBSA^iTU~G<;+VC9+>)L-WS)S`NhS-PuP|w z8eW(jF;~{w#zscEewy^G04r&C*Xo=pzkdHNJa?4UacAx1F3Za^O4wkqE}bo9f1R`L z%H6xI_4Lj)XIj|WzJ2@l=<=ldZH!ARYmOXw_uWR7x$Q|c)5={+UG8o7UFxErEn#MC zOHuXil6dt}W1C0+zvi|EMgt>ekG)eYEG$;6UmyNNj#)x7>6Tl%0}4Fwl;;m?KX2QG TZ5~@gK*f`%tDnm{r-UW|QbkN_ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/download_locked.png b/Telegram/Resources/icons/menu/download_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..824ca3707c41a7c4e18e00213dd1d891b59acc66 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEYH)$F~maf zZJ^=mrT~$1B9*#{@ASgF1v)f1FFg=(`M>DvR@)csF3$T8d{;hXzJ=A%nb*pCtJ=C} z7nJ8Uzc0|glNXhdpH*@H%iQ-h_bu-wFa4C2@c)D3-Ms52XRG$gwJCOr^G{0Mc`?H! zu*G<;U%G*W3?F-FXyrV6x&DatlP30`U}t)1Hrw}l>G$7%%Xa5(jdFR;QSGwo>T9FE z#}8a}PQTiv*Y!yH(9@#EoR11sj{EQDZ@;}jqpRub!-5wUd>>w$S$*g@ywOPahu#_+ za}DEGz4ts#i=UW3_K`VWB4H8u?#_u#Yn~Qy{=e~gk5A6_+jISvN3Cu9s^VF5|9nN> zsiR4ZjdAPQU#T+*_+D0zxhnuFEg4Y%nNzxo))5NZ2rBC)V%g9vC;^_Rxyz!%chKE9+Qq$a~ z-c}AbZbN~C+jpdYKV)#mV%@pq?z=l%=Tz^z{&9EtvFcEbCyM0`5$snE9qRA6_OhgG z_uZ_mdScyAi%yEJd}7pby4pr={&{v^kKK3kqi|NgyW*Y4fP$F-(rq6~_jeoy?OW(*b3+7>U5pa1b#M-gBeaDgqiu-r&j9eRbVH4AKF1(qpvist>vmXYo>)?OL4`s%v%>p9sDOi3tOVQaQl;lGcXbC&sR zU$zF%fUJ85SB7+XEUa&OGB=>*K#GxPc=JjQPu67ztcAnvco-U2J}KDA{6C5P+h5tq ze#;L(+~B7C>@M%|6E$}7-A8xKI;qJq-8<&tkx*wB2jRT0n{VbUS38&A-%w%Gw|e=G uSqqj0XcVlxsTrvDl<$P>1nUp;%O9vW%XCgS6>bm?O5>icelF{r5}E+YymW*B literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/download_locked@3x.png b/Telegram/Resources/icons/menu/download_locked@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..69d05e38d61f63b8b90a06ea3acd74de57783b43 GIT binary patch literal 1226 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz+&R*;uw;_ z`Zmf}yUbDI*+K75p&Xj0gagfjA_BxBI$9%s@GlbaR5|7LL|J~~{scv@O_N%Mybc{Z z=e|cygzIO``s-Ip%!}tdpYy!n%;$Z@Vc+i*-~AqQz4qKpqd&CShy`{qr=$u;XXJbLt~tE;P{ zgTwLI!-o$K9XfRP?%W6Bvl5-6C#E?%I{NzhM$BNey>qOmhv&}r@88RXx3NuB%TSNy z8aCMvp+rQu=a?74GoEi88I+-YfPIdlH}`1ttrhf9|(y^uNS z)SB}uXY#^>gDSp#+!9hV8(-U^9@LZOXo*~V| zf2*gnGx6-_&&99W|9<&WQd)X+&c=-!o%C~esr2x@y#DO`jnk*Qd7k-w)}P&VD8-Pm z;@>$NuhWnz5TSog^3&1tXcE!-Mdq#ymp81eB8ZzcUxVt`nGj7cJq5UYXp1#F5bFzE6|rJ z!042fm7Tiz_NScue05dT#Ntzb+`FIc*|B5B?AgixuUz4`E=ar)n7C>}YDx;r>$Zmv z6BT!_Rg0VY^y$;HXMLA^-7UiQQU)1-WTyZCS5hyqK_cCimfMqH?R2E>*R;SM;X8azSoY z)vT=7Z{CR9n8Cq3l4Gv_4)YjVe1|4eK*4fE< zN@%{txibM03?lZHmM1@+l00N{^YZ1x8mA6ja1B)qury>^xN)Q5sU6$5i!(S%%n@l8 zQ0!dfyT(c5{l0y6T0FkDUe}y_lqI@>YvCJzfB(qI(raE8Y<#pz#qP$13j$ZwZZi}V zOpt7DZr&vK%rSgIr{D`d9-b4o9*873-aPW1E4x6ApY88H)}?Y@R`&Mt-d-^VE8=hO zVuHawt%R>%r2V=d*l$|1rbo80$Ry3-pvAq$+%wOfrR{%y@6FQp@83@kcY9aua9AmS zb@UyJqC~^T+YjxV$Hph{sAcZ&?Hzp_ObZe>7KGh5Tyl7sd{~wJkG{8W-`>4bX2^kRg%?vPPK4egVS49o7OPJKu?iH0@M8#F21mWg|k!mB4?|U z$n#|NqT67#uS{btHW=_&&;hNiTzZLB~@?*!8O972y zdpT9~zeq)%xnxnTZ&tc=SHZ#)O9GzlBn9hi}5oGl6k?mggJr!L?m5R8Z6!D&}elF{r G5}E+_x&3?q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stealth@2x.png b/Telegram/Resources/icons/menu/stealth@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..50706a61f276fc95c6e33c38a0e486dff3a26573 GIT binary patch literal 1237 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 Ef{rysi2wiq literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stealth_locked.png b/Telegram/Resources/icons/menu/stealth_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc0cb5e3061ac930b90420f022812bdd872febc GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfyu$s#WBP} z@NS6j>Xm^acKc4cb9nw_K6SudGw-Csq92TQLCezI{xz&z$tXFoQRC-{BL{jKJA<4g zcX+0WFi-hxF}wEM>1x02*1PW7-gv+HdffTX>$ZNo_51DHc~%X$w=Ds4@NY_19lt>uosxxN!H~ z_}<4Kcf_r~zvD`lfy9UZVXIk1GhCGfceyrtEnPH&VQZ8x!~7Z*A{vfb*IZLFr&a{W(qR>+^~6khV&bPlvv4Lh}$~vPKuG_ug`fYqER|xcJuk=?6Vb_F1&YI zvvOg7)m}Ny-`2Vz%%+TgjnCwmSxfaENisBjSz;BVnxUw7P39pFSI3khW{bKlVQa&L zxmrt@qdK@P7sdH+buT_FDI&1)zw83V<(D(}-#^}3b+39&W}ny6O*eCzKHW&H+Zv^7 zCB1f{-|~-M2Il$NQ+l!<+U>P6(AgNl^YTGm*y^h(MxC$w7#p4@7#x_pAc{xob<_Fh z`|Xq~LKBW~Gjm=1HTipY=={VMu6s^xFYROZF#EfxP1RVp#u1dJJYD@<);T3K0RZwc BEII%H literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stealth_locked@2x.png b/Telegram/Resources/icons/menu/stealth_locked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..979e23d5cd0f08ed07d7ad967d61e7af899639a8 GIT binary patch literal 1457 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 LNkvXXu0mjf?Vf(L literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/stories/stealth_25m@2x.png b/Telegram/Resources/icons/stories/stealth_25m@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec9a01f7a9fea5a69b67c02dc457808b57ef4a6 GIT binary patch literal 1778 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/stories/stealth_logo.png b/Telegram/Resources/icons/stories/stealth_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..10a249195359081142f13c54869a6d5821ae580f GIT binary patch literal 1463 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 NDN5fAS*hz9`5)&SPB{Po literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/stories/stealth_logo@3x.png b/Telegram/Resources/icons/stories/stealth_logo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..161618d2026318b47932dcdebc96b91058f15d9e GIT binary patch literal 4385 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 38577fef1..e6dfeeb0a 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3877,6 +3877,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stories_archive_done_many#one" = "{count} story is hidden from your profile."; "lng_stories_archive_done_many#other" = "{count} stories are hidden from your profile."; +"lng_stealth_mode_menu_item" = "Stealth Mode"; +"lng_stealth_mode_title" = "Stealth Mode"; +"lng_stealth_mode_unlock_about" = "Subscribe to Telegram Premium to hide the fact that you viewed peoples' stories from them."; +"lng_stealth_mode_about" = "Turn Stealth Mode on to hide the fact that you viewed peoples' stories from them."; +"lng_stealth_mode_past_title" = "Hide Recent Views"; +"lng_stealth_mode_past_about" = "Hide my views in the last 5 minutes."; +"lng_stealth_mode_next_title" = "Hide Next Views"; +"lng_stealth_mode_next_about" = "Hide my views in the next 25 minutes."; +"lng_stealth_mode_unlock" = "Unlock Stealth Mode"; +"lng_stealth_mode_enable" = "Enable Stealth Mode"; +"lng_stealth_mode_cooldown_in" = "Available in {left}"; +"lng_stealth_mode_cooldown_tip" = "Please wait until the **Stealth Mode** is ready to use again."; +"lng_stealth_mode_enabled_tip_title" = "Stealth Mode On"; +"lng_stealth_mode_enabled_tip" = "The creators of stories you viewed in the last **5 minutes** or will view in the next **25 minutes** won't see you in the viewers' lists."; +"lng_stealth_mode_countdown" = "Stealth Mode active – {left}"; +"lng_stealth_mode_already_title" = "You are in Stealth Mode"; +"lng_stealth_mode_already_about" = "The creators of stories you will view in the next **{left}** won't see you in the viewers' lists."; + "lng_stories_link_invalid" = "This link is broken or has expired."; // Wnd specific diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index c2a1399da..78b286db0 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -2528,6 +2528,11 @@ void Updates::feedUpdate(const MTPUpdate &update) { _session->data().stories().apply(update.c_updateReadStories()); } break; + case mtpc_updateStoriesStealthMode: { + const auto &data = update.c_updateStoriesStealthMode(); + _session->data().stories().apply(data.vstealth_mode()); + } break; + } } diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index 085958ea2..8aa84afd2 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -174,6 +174,14 @@ void Stories::apply(const MTPDupdateReadStories &data) { bumpReadTill(peerFromUser(data.vuser_id()), data.vmax_id().v); } +void Stories::apply(const MTPStoriesStealthMode &stealthMode) { + const auto &data = stealthMode.data(); + _stealthMode = StealthMode{ + .enabledTill = data.vactive_until_date().value_or_empty(), + .cooldownTill = data.vcooldown_until_date().value_or_empty(), + }; +} + void Stories::apply(not_null peer, const MTPUserStories *data) { if (!data) { applyDeletedFromSources(peer->id, StorySourcesList::NotHidden); @@ -536,6 +544,10 @@ void Stories::loadMore(StorySourcesList list) { }, [](const MTPDstories_allStoriesNotModified &) { }); + result.match([&](const auto &data) { + apply(data.vstealth_mode()); + }); + preloadListsMore(); }).fail([=] { _loadMoreRequestId[index] = 0; @@ -719,6 +731,7 @@ void Stories::applyDeleted(FullStoryId id) { } } if (_preloading && _preloading->id() == id) { + _preloading = nullptr; preloadFinished(id); } _owner->refreshStoryItemViews(id); @@ -836,6 +849,26 @@ std::shared_ptr Stories::lookupItem(not_null story) { return j->second.lock(); } +StealthMode Stories::stealthMode() const { + return _stealthMode.current(); +} + +rpl::producer Stories::stealthModeValue() const { + return _stealthMode.value(); +} + +void Stories::activateStealthMode(Fn done) { + const auto api = &session().api(); + using Flag = MTPstories_ActivateStealthMode::Flag; + api->request(MTPstories_ActivateStealthMode( + MTP_flags(Flag::f_past | Flag::f_future) + )).done([=](const MTPBool &result) { + if (done) done(); + }).fail([=] { + if (done) done(); + }).send(); +} + std::shared_ptr Stories::resolveItem(not_null story) { auto &items = _items[story->peer()->id]; auto i = items.find(story->id()); diff --git a/Telegram/SourceFiles/data/data_stories.h b/Telegram/SourceFiles/data/data_stories.h index 48ea79688..545acdfe0 100644 --- a/Telegram/SourceFiles/data/data_stories.h +++ b/Telegram/SourceFiles/data/data_stories.h @@ -116,6 +116,14 @@ struct StoriesContext { friend inline bool operator==(StoriesContext, StoriesContext) = default; }; +struct StealthMode { + TimeId enabledTill = 0; + TimeId cooldownTill = 0; + + friend inline auto operator<=>(StealthMode, StealthMode) = default; + friend inline bool operator==(StealthMode, StealthMode) = default; +}; + inline constexpr auto kStorySourcesListCount = 2; class Stories final : public base::has_weak_ptr { @@ -139,6 +147,7 @@ public: void loadMore(StorySourcesList list); void apply(const MTPDupdateStory &data); void apply(const MTPDupdateReadStories &data); + void apply(const MTPStoriesStealthMode &stealthMode); void apply(not_null peer, const MTPUserStories *data); Story *applyFromWebpage(PeerId peerId, const MTPstoryItem &story); void loadAround(FullStoryId id, StoriesContext context); @@ -227,6 +236,10 @@ public: [[nodiscard]] std::shared_ptr lookupItem( not_null story); + [[nodiscard]] StealthMode stealthMode() const; + [[nodiscard]] rpl::producer stealthModeValue() const; + void activateStealthMode(Fn done = nullptr); + private: struct Saved { StoriesIds ids; @@ -375,6 +388,8 @@ private: base::Timer _pollingTimer; base::Timer _pollingViewsTimer; + rpl::variable _stealthMode; + }; } // namespace Data diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index 237401606..2ee9496dd 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/stories/media_stories_recent_views.h" #include "media/stories/media_stories_reply.h" #include "media/stories/media_stories_share.h" +#include "media/stories/media_stories_stealth.h" #include "media/stories/media_stories_view.h" #include "media/audio/media_audio.h" #include "ui/boxes/confirm_box.h" @@ -1522,6 +1523,17 @@ void Controller::tryProcessKeyInput(not_null e) { _replyArea->tryProcessKeyInput(e); } +bool Controller::allowStealthMode() const { + const auto story = this->story(); + return story + && !story->peer()->isSelf() + && story->peer()->session().premiumPossible(); +} + +void Controller::setupStealthMode() { + SetupStealthMode(uiShow()); +} + rpl::lifetime &Controller::lifetime() { return _lifetime; } diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.h b/Telegram/SourceFiles/media/stories/media_stories_controller.h index 35d82c9b0..a9703c423 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.h +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.h @@ -167,6 +167,9 @@ public: [[nodiscard]] bool ignoreWindowMove(QPoint position) const; void tryProcessKeyInput(not_null e); + [[nodiscard]] bool allowStealthMode() const; + void setupStealthMode(); + [[nodiscard]] rpl::lifetime &lifetime(); private: diff --git a/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp new file mode 100644 index 000000000..b5d441ee1 --- /dev/null +++ b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp @@ -0,0 +1,407 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "media/stories/media_stories_stealth.h" + +#include "base/timer_rpl.h" +#include "base/unixtime.h" +#include "chat_helpers/compose/compose_show.h" +#include "data/data_peer_values.h" +#include "data/data_session.h" +#include "data/data_stories.h" +#include "info/profile/info_profile_icon.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "settings/settings_premium.h" +#include "ui/layers/generic_box.h" +#include "ui/text/text_utilities.h" +#include "ui/toast/toast.h" +#include "ui/widgets/buttons.h" +#include "ui/painter.h" +#include "window/window_controller.h" +#include "window/window_session_controller.h" +#include "styles/style_media_view.h" +#include "styles/style_layers.h" + +namespace Media::Stories { +namespace { + +constexpr auto kAlreadyToastDuration = 4 * crl::time(1000); +constexpr auto kCooldownButtonLabelOpacity = 0.5; + +struct State { + Data::StealthMode mode; + TimeId now = 0; + bool premium = false; +}; + +struct Feature { + const style::icon &icon; + QString title; + TextWithEntities about; +}; + +[[nodiscard]] QString LeftText(int left) { + Expects(left >= 0); + + const auto hours = left / 3600; + const auto minutes = (left % 3600) / 60; + const auto seconds = left % 60; + const auto zero = QChar('0'); + if (hours) { + return u"%1:%2:%3"_q + .arg(hours) + .arg(minutes, 2, 10, zero) + .arg(seconds, 2, 10, zero); + } else if (minutes) { + return u"%1:%2"_q.arg(minutes).arg(seconds, 2, 10, zero); + } + return u"0:%1"_q.arg(left, 2, 10, zero); +} + +[[nodiscard]] Ui::Toast::Config ToastAlready(TimeId left) { + return { + .title = tr::lng_stealth_mode_already_title(tr::now), + .text = tr::lng_stealth_mode_already_about( + tr::now, + lt_left, + TextWithEntities{ LeftText(left) }, + Ui::Text::RichLangValue), + .st = &st::storiesStealthToast, + .duration = kAlreadyToastDuration, + .adaptive = true, + }; +} + +[[nodiscard]] Ui::Toast::Config ToastActivated() { + return { + .title = tr::lng_stealth_mode_enabled_tip_title(tr::now), + .text = tr::lng_stealth_mode_enabled_tip( + tr::now, + Ui::Text::RichLangValue), + .st = &st::storiesStealthToast, + .duration = kAlreadyToastDuration, + .adaptive = true, + }; +} + +[[nodiscard]] Ui::Toast::Config ToastCooldown() { + return { + .text = tr::lng_stealth_mode_cooldown_tip( + tr::now, + Ui::Text::RichLangValue), + .st = &st::storiesStealthToast, + .duration = kAlreadyToastDuration, + .adaptive = true, + }; +} + +[[nodiscard]] rpl::producer StateValue( + not_null session) { + return rpl::combine( + session->data().stories().stealthModeValue(), + Data::AmPremiumValue(session) + ) | rpl::map([](Data::StealthMode mode, bool premium) { + return rpl::make_producer([=](auto consumer) { + struct Info { + base::Timer timer; + bool firstSent = false; + bool enabledSent = false; + bool cooldownSent = false; + }; + auto lifetime = rpl::lifetime(); + const auto info = lifetime.make_state(); + const auto check = [=] { + auto send = !info->firstSent; + const auto now = base::unixtime::now(); + const auto left1 = (mode.enabledTill - now); + const auto left2 = (mode.cooldownTill - now); + info->firstSent = true; + if (!info->enabledSent && left1 <= 0) { + send = true; + info->enabledSent = true; + } + if (!info->cooldownSent && left2 <= 0) { + send = true; + info->cooldownSent = true; + } + const auto left = (left1 <= 0) + ? left2 + : (left2 <= 0) + ? left1 + : std::min(left1, left2); + if (left > 0) { + info->timer.callOnce(left * crl::time(1000)); + } + if (send) { + consumer.put_next(State{ mode, now, premium }); + } + if (left <= 0) { + consumer.put_done(); + } + }; + info->timer.setCallback(check); + check(); + return lifetime; + }); + }) | rpl::flatten_latest(); +} + +[[nodiscard]] Feature FeaturePast() { + return { + .icon = st::storiesStealthFeaturePastIcon, + .title = tr::lng_stealth_mode_past_title(tr::now), + .about = tr::lng_stealth_mode_past_about(tr::now), + }; +} + +[[nodiscard]] Feature FeatureNext() { + return { + .icon = st::storiesStealthFeatureNextIcon, + .title = tr::lng_stealth_mode_next_title(tr::now), + .about = tr::lng_stealth_mode_next_about(tr::now), + }; +} + +[[nodiscard]] object_ptr MakeLogo(QWidget *parent) { + const auto add = st::storiesStealthLogoAdd; + const auto icon = &st::storiesStealthLogoIcon; + const auto size = QSize(2 * add, 2 * add) + icon->size(); + auto result = object_ptr>( + parent, + object_ptr(parent), + st::storiesStealthLogoMargin); + const auto inner = result->entity(); + inner->resize(size); + inner->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(inner); + auto hq = PainterHighQualityEnabler(p); + p.setBrush(st::storiesComposeBlue); + p.setPen(Qt::NoPen); + const auto left = (inner->width() - size.width()) / 2; + const auto top = (inner->height() - size.height()) / 2; + const auto rect = QRect(QPoint(left, top), size); + p.drawEllipse(rect); + icon->paintInCenter(p, rect); + }, inner->lifetime()); + return result; +} + +[[nodiscard]] object_ptr MakeTitle(QWidget *parent) { + return object_ptr>( + parent, + object_ptr( + parent, + tr::lng_stealth_mode_title(tr::now), + st::storiesStealthBox.title), + st::storiesStealthTitleMargin); +} + +[[nodiscard]] object_ptr MakeAbout( + QWidget *parent, + rpl::producer state) { + auto text = std::move(state) | rpl::map([](const State &state) { + return state.premium + ? tr::lng_stealth_mode_about(tr::now) + : tr::lng_stealth_mode_unlock_about(tr::now); + }); + return object_ptr>( + parent, + object_ptr( + parent, + std::move(text), + st::storiesStealthAbout), + st::storiesStealthAboutMargin); +} + +[[nodiscard]] object_ptr MakeFeature( + QWidget *parent, + Feature feature) { + auto result = object_ptr>( + parent, + object_ptr(parent), + st::storiesStealthFeatureMargin); + const auto widget = result->entity(); + const auto icon = Ui::CreateChild( + widget, + feature.icon, + st::storiesStealthFeatureIconPosition); + const auto title = Ui::CreateChild( + widget, + feature.title, + st::storiesStealthFeatureTitle); + const auto about = Ui::CreateChild( + widget, + rpl::single(feature.about), + st::storiesStealthFeatureAbout); + icon->show(); + title->show(); + about->show(); + widget->widthValue( + ) | rpl::start_with_next([=](int width) { + const auto left = st::storiesStealthFeatureLabelLeft; + const auto available = width - left; + title->resizeToWidth(available); + about->resizeToWidth(available); + auto top = 0; + title->move(left, top); + top += title->height() + st::storiesStealthFeatureSkip; + about->move(left, top); + top += about->height(); + widget->resize(width, top); + }, widget->lifetime()); + return result; +} + +[[nodiscard]] object_ptr MakeButton( + QWidget *parent, + rpl::producer state) { + auto text = rpl::duplicate(state) | rpl::map([](const State &state) { + if (!state.premium) { + return tr::lng_stealth_mode_unlock(); + } else if (state.mode.cooldownTill <= state.now) { + return tr::lng_stealth_mode_enable(); + } + return rpl::single( + rpl::empty + ) | rpl::then( + base::timer_each(250) + ) | rpl::map([=] { + const auto now = base::unixtime::now(); + const auto left = std::max(state.mode.cooldownTill - now, 1); + return tr::lng_stealth_mode_cooldown_in( + tr::now, + lt_left, + LeftText(left)); + }) | rpl::type_erased(); + }) | rpl::flatten_latest(); + + auto result = object_ptr( + parent, + rpl::single(QString()), + st::storiesStealthBox.button); + const auto raw = result.data(); + + const auto label = Ui::CreateChild( + raw, + std::move(text), + st::storiesStealthButtonLabel); + label->setAttribute(Qt::WA_TransparentForMouseEvents); + label->show(); + + const auto lock = Ui::CreateChild(raw); + lock->setAttribute(Qt::WA_TransparentForMouseEvents); + lock->resize(st::storiesStealthLockIcon.size()); + lock->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(lock); + st::storiesStealthLockIcon.paintInCenter(p, lock->rect()); + }, lock->lifetime()); + + const auto lockLeft = -st::storiesStealthButtonLabel.style.font->height; + const auto updateLabelLockGeometry = [=] { + const auto outer = raw->width(); + const auto added = -st::storiesStealthBox.button.width; + const auto skip = lock->isHidden() ? 0 : (lockLeft + lock->width()); + const auto width = outer - added - skip; + const auto top = st::storiesStealthBox.button.textTop; + label->resizeToWidth(width); + label->move(added / 2, top); + const auto inner = std::min(label->textMaxWidth(), width); + const auto right = (added / 2) + (width - inner) / 2 + inner; + const auto lockTop = (label->height() - lock->height()) / 2; + lock->move(right + lockLeft, top + lockTop); + }; + + std::move(state) | rpl::start_with_next([=](const State &state) { + const auto cooldown = state.premium + && (state.mode.cooldownTill > state.now); + label->setOpacity(cooldown ? kCooldownButtonLabelOpacity : 1.); + lock->setVisible(!state.premium); + updateLabelLockGeometry(); + }, label->lifetime()); + + raw->widthValue( + ) | rpl::start_with_next(updateLabelLockGeometry, label->lifetime()); + + return result; +} + +[[nodiscard]] object_ptr StealthModeBox( + std::shared_ptr show) { + return Box([=](not_null box) { + struct Data { + rpl::variable state; + bool requested = false; + }; + const auto data = box->lifetime().make_state(); + data->state = StateValue(&show->session()); + box->setWidth(st::boxWideWidth); + box->setStyle(st::storiesStealthBox); + box->addRow(MakeLogo(box)); + box->addRow(MakeTitle(box)); + box->addRow(MakeAbout(box, data->state.value())); + box->addRow(MakeFeature(box, FeaturePast())); + box->addRow( + MakeFeature(box, FeatureNext()), + (st::boxRowPadding + + QMargins(0, 0, 0, st::storiesStealthBoxBottom))); + box->setNoContentMargin(true); + box->addTopButton(st::storiesStealthBoxClose, [=] { + box->closeBox(); + }); + const auto button = box->addButton( + MakeButton(box, data->state.value())); + button->resizeToWidth(st::boxWideWidth + - st::storiesStealthBox.buttonPadding.left() + - st::storiesStealthBox.buttonPadding.right()); + button->setClickedCallback([=] { + const auto now = data->state.current(); + if (now.mode.enabledTill > now.now) { + show->showToast(ToastActivated()); + box->closeBox(); + } else if (!now.premium) { + data->requested = false; + const auto usage = ChatHelpers::WindowUsage::PremiumPromo; + if (const auto window = show->resolveWindow(usage)) { + Settings::ShowPremium( + window, + u"stories_stealth_mode"_q); + window->window().activate(); + } + } else if (now.mode.cooldownTill > now.now) { + show->showToast(ToastCooldown()); + box->closeBox(); + } else if (!data->requested) { + data->requested = true; + show->session().data().stories().activateStealthMode( + crl::guard(box, [=] { data->requested = false; })); + } + }); + data->state.value() | rpl::filter([](const State &state) { + return state.mode.enabledTill > state.now; + }) | rpl::start_with_next([=] { + box->closeBox(); + show->showToast(ToastActivated()); + }, box->lifetime()); + }); +} + +} // namespace + +void SetupStealthMode(std::shared_ptr show) { + const auto now = base::unixtime::now(); + const auto mode = show->session().data().stories().stealthMode(); + if (const auto left = mode.enabledTill - now; left > 0) { + show->showToast(ToastAlready(left)); + } else { + show->show(StealthModeBox(show)); + } +} + +} // namespace Media::Stories diff --git a/Telegram/SourceFiles/media/stories/media_stories_stealth.h b/Telegram/SourceFiles/media/stories/media_stories_stealth.h new file mode 100644 index 000000000..d4ccae4b6 --- /dev/null +++ b/Telegram/SourceFiles/media/stories/media_stories_stealth.h @@ -0,0 +1,18 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace ChatHelpers { +class Show; +} // namespace ChatHelpers + +namespace Media::Stories { + +void SetupStealthMode(std::shared_ptr show); + +} // namespace Media::Stories diff --git a/Telegram/SourceFiles/media/stories/media_stories_view.cpp b/Telegram/SourceFiles/media/stories/media_stories_view.cpp index dfbab352b..c3cdbd01b 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_view.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_view.cpp @@ -111,6 +111,14 @@ void View::tryProcessKeyInput(not_null e) { _controller->tryProcessKeyInput(e); } +bool View::allowStealthMode() const { + return _controller->allowStealthMode(); +} + +void View::setupStealthMode() { + _controller->setupStealthMode(); +} + SiblingView View::sibling(SiblingType type) const { return _controller->sibling(type); } diff --git a/Telegram/SourceFiles/media/stories/media_stories_view.h b/Telegram/SourceFiles/media/stories/media_stories_view.h index 4d6cdac1e..b3dee4aa5 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_view.h +++ b/Telegram/SourceFiles/media/stories/media_stories_view.h @@ -91,6 +91,9 @@ public: [[nodiscard]] bool ignoreWindowMove(QPoint position) const; void tryProcessKeyInput(not_null e); + [[nodiscard]] bool allowStealthMode() const; + void setupStealthMode(); + [[nodiscard]] rpl::lifetime &lifetime(); private: diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index adf770688..e291abe45 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -413,8 +413,8 @@ storiesSiblingWidthMin: 200px; // Try making sibling not less than this. storiesMaxNameFontSize: 17px; storiesRadius: 8px; storiesControlSize: 64px; -storiesLeft: icon {{ "mediaview/stories_next-flip_horizontal", mediaviewControlFg }}; -storiesRight: icon {{ "mediaview/stories_next", mediaviewControlFg }}; +storiesLeft: icon {{ "stories/next-flip_horizontal", mediaviewControlFg }}; +storiesRight: icon {{ "stories/next", mediaviewControlFg }}; storiesSliderWidth: 2px; storiesSliderMargin: margins(8px, 7px, 8px, 6px); storiesSliderSkip: 4px; @@ -911,3 +911,73 @@ storiesInfoTooltipMaxWidth: 360px; storiesCaptionPullThreshold: 50px; storiesShowMorePadding: margins(6px, 4px, 6px, 4px); storiesShowMoreFont: semiboldFont; + +storiesStealthLogoIcon: icon{{ "stories/stealth_logo", storiesComposeWhiteText }}; +storiesStealthLogoAdd: 12px; +storiesStealthLogoMargin: margins(0px, 28px, 0px, 7px); +storiesStealthBox: Box(defaultBox) { + buttonPadding: margins(10px, 10px, 10px, 10px); + buttonHeight: 42px; + button: RoundButton(defaultBoxButton) { + height: 42px; + textTop: 12px; + font: font(13px semibold); + + textFg: storiesComposeWhiteText; + textFgOver: storiesComposeWhiteText; + numbersTextFg: storiesComposeWhiteText; + numbersTextFgOver: storiesComposeWhiteText; + textBg: storiesComposeBlue; + textBgOver: storiesComposeBlue; + + ripple: universalRippleAnimation; + } + margin: margins(0px, 56px, 0px, 10px); + bg: groupCallMembersBg; + title: FlatLabel(boxTitle) { + textFg: groupCallMembersFg; + align: align(top); + } + titleAdditionalFg: groupCallMemberNotJoinedStatus; +} +storiesStealthButtonLabel: FlatLabel(defaultFlatLabel) { + style: semiboldTextStyle; + textFg: storiesComposeWhiteText; + align: align(top); + minWidth: 20px; + maxHeight: 20px; +} +storiesStealthLockIcon: icon {{ "dialogs/dialogs_lock_on", storiesComposeWhiteText }}; +storiesStealthTitleMargin: margins(0px, 10px, 0px, 0px); +storiesStealthBoxClose: IconButton(defaultIconButton) { + width: boxTitleHeight; + height: boxTitleHeight; + + icon: icon {{ "box_button_close", storiesComposeGrayIcon }}; + iconOver: icon {{ "box_button_close", storiesComposeGrayIcon }}; + + rippleAreaPosition: point(4px, 4px); + rippleAreaSize: 40px; + ripple: storiesComposeRippleLight; +} +storiesStealthAbout: FlatLabel(defaultFlatLabel) { + textFg: storiesComposeGrayText; + align: align(top); + minWidth: 20px; +} +storiesStealthAboutMargin: margins(0px, 5px, 0px, 15px); +storiesStealthFeatureTitle: storiesHeaderName; +storiesStealthFeatureAbout: FlatLabel(defaultFlatLabel) { + textFg: storiesComposeGrayText; + minWidth: 20px; +} +storiesStealthFeaturePastIcon: icon{{ "stories/stealth_5m", storiesComposeBlue }}; +storiesStealthFeatureNextIcon: icon{{ "stories/stealth_25m", storiesComposeBlue }}; +storiesStealthFeatureIconPosition: point(3px, 7px); +storiesStealthFeatureMargin: margins(0px, 8px, 0px, 6px); +storiesStealthFeatureLabelLeft: 46px; +storiesStealthFeatureSkip: 2px; +storiesStealthBoxBottom: 11px; +storiesStealthToast: Toast(defaultMultilineToast) { + maxWidth: 340px; +} diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index fb30c3b4d..ee6b3bd53 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1631,6 +1631,15 @@ void OverlayWidget::fillContextMenuActions(const MenuCallback &addAction) { } }, &st::mediaMenuIconReport); }(); + if (_stories && _stories->allowStealthMode()) { + const auto now = base::unixtime::now(); + const auto stealth = _session->data().stories().stealthMode(); + addAction(tr::lng_stealth_mode_menu_item(tr::now), [=] { + _stories->setupStealthMode(); + }, ((_session->premium() || (stealth.enabledTill > now)) + ? &st::mediaMenuIconStealth + : &st::mediaMenuIconStealthLocked)); + } if (story && story->canReport()) { addAction(tr::lng_profile_report(tr::now), [=] { _stories->reportRequested(); @@ -5249,6 +5258,7 @@ void OverlayWidget::setContext( { story->peer->id, story->id }); if (maybeStory) { _stories->show(*maybeStory, story->within); + _dropdown->raise(); } } else { _message = nullptr; @@ -5289,7 +5299,6 @@ void OverlayWidget::setStoriesPeer(PeerData *peer) { updateControlsGeometry(); }, _stories->lifetime()); _storiesChanged.fire({}); - _dropdown->raise(); } } diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index f1b1a2029..dfe5430b2 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -134,6 +134,8 @@ mediaMenuIconProfile: icon {{ "menu/profile", mediaviewMenuFg }}; mediaMenuIconReport: icon {{ "menu/report", mediaviewMenuFg }}; mediaMenuIconSaveStory: icon {{ "menu/stories_save", mediaviewMenuFg }}; mediaMenuIconArchiveStory: icon {{ "menu/stories_archive", mediaviewMenuFg }}; +mediaMenuIconStealthLocked: icon {{ "menu/stealth_locked", mediaviewMenuFg }}; +mediaMenuIconStealth: icon {{ "menu/stealth", mediaviewMenuFg }}; menuIconDeleteAttention: icon {{ "menu/delete", menuIconAttentionColor }}; menuIconLeaveAttention: icon {{ "menu/leave", menuIconAttentionColor }};