From e2d35452f95669eb96ed902e876a9c90fd5ed8f9 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:27:34 +0200 Subject: [PATCH 01/28] Add "unavailable feature" assets. --- .../Images.xcassets/Spaces/Contents.json | 6 +++++ .../Contents.json | 23 ++++++++++++++++++ .../feature_unavaible_artwork.png | Bin 0 -> 2279 bytes .../feature_unavaible_artwork@2x.png | Bin 0 -> 4289 bytes .../feature_unavaible_artwork@3x.png | Bin 0 -> 6562 bytes .../Contents.json | 23 ++++++++++++++++++ .../feature_unavaible_artwork_dark.png | Bin 0 -> 2301 bytes .../feature_unavaible_artwork_dark@2x.png | Bin 0 -> 4381 bytes .../feature_unavaible_artwork_dark@3x.png | Bin 0 -> 6656 bytes Riot/Generated/Images.swift | 2 ++ 10 files changed, 54 insertions(+) create mode 100644 Riot/Assets/Images.xcassets/Spaces/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork.png create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@2x.png create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@3x.png create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/feature_unavaible_artwork_dark.png create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/feature_unavaible_artwork_dark@2x.png create mode 100644 Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/feature_unavaible_artwork_dark@3x.png diff --git a/Riot/Assets/Images.xcassets/Spaces/Contents.json b/Riot/Assets/Images.xcassets/Spaces/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Riot/Assets/Images.xcassets/Spaces/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/Contents.json b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/Contents.json new file mode 100644 index 000000000..89de3f057 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "feature_unavaible_artwork.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "feature_unavaible_artwork@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "feature_unavaible_artwork@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork.png b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..bd404a5e6e7ecf90dbece9da0cba7a68ade41c67 GIT binary patch literal 2279 zcmcImXE+;*8cwRQ1*JW9j2`NkB@VS}QzNLhR+ZR_pjIg2SRqtZX=Ak3Q9ahBFz@A z)I9^;2T0&95#={=DBMGtrbQ~=3SV;(UYU!t&AX=brfOpFJpPJ0J^mV6vZR}!*LlgYLs<=%5k8CO?Z)EWhoa_Uho-s)Jd9Asq^@F*>(y{k{*(tQf%`DJPDb$}0 z;dQMV^cXTz!KIGD&MnZ|roAK9spm1;Bn4ZJv{Ei_UsgUoqI^PwsW!WAFX!tUe@Mav zbEk?+HaD{;HJ)dHIMOUcyV$nG!*m!M`y#$Jx(q72;JdgQ;*evt=+xYik zMb|RZpXc*n_gG^c&rFJz9Q$apthdOhTHOhS*zkm5Jra8Gm3}171m)8}@6CH0KM#tP z_j*qqh5sTRJD=Pe+`0B>nB`b#WGzH%3fo0DabdJ@mF2XeEm zi=TY&=28l@EEKS0Y)7}V=XZ8k4&T&rUZo7BRxa>2FVHCBY;5{w`njHUEPntX{cOX% zjW@)2cuC~n5Q3m)3f>>@y!7mN)1Z8OC$DRVKd1j3yxW=xBv|gmA0caYNSpRMQZ9FKSH2 z_R-y0HxFa*$l6gB36X@=e`Resa3E(dRM1gLaTDPNvA^uWmh*MDSDrFrGkRRI>q^4}NtVh;snS0kOj zXl^(n!dFxKx8=(*eZQtW52BkU<3>uGR`fT5G$TdGDD7l1H@^oH@pm^Fm9{=(jkA>;kk@IlRwi3R22 zn#`6|G4Hqkx~Wxmc+@X?Y8`SQjC5Ftt%X-r=!JyFIuVIv z?}G%;rlz~dv@#+J6^uKEF^A2o&~}g}j9BSm!GKOX2hinqu=PIsK+O*YdoyATeodZH zIgvF#wlyqM#v+onaLT*zY)SFjjRI55pbTdZ^qP8(3`1IbfteFg-RyK+13s%;;yjyX zpV9+8E@bwJyRD*!u|zGysS(zi&ks}u3hrp+$Z&R0SkRNNUM_%A5e@a~Hb1*}ER};sf&s$H);(M5%uLtQ}c&0!$ZKf9Brj;qA?x^ftl<^ZHpZR0C z+W~qRX3#i9t3W$+LsDpw!~Oku^FBHHF&iZAzj>6Y_kS4p|1f-Z;w!MA9&v4)n7RFw z7vl}Z;GCSWu;Q++-qL&!9~e#9pE6b?w$eMbc`?;{2)}4|!TdDNj{gKJnO6ib_>WKeY0b3)lIx+0Bt9iJ7te*tO}fkg($Z_0K|88gnfBGrm>p8--^9 zA^K?!h904LXLYRdK>^XNLWfZ^q_a=QNHhKTD&}1-y_va-kyjGlPv?ANTH6rs&Ki^4 zs;UBSiCy@NZdM#v9eN%UB!eqHBrduHo1Lj47j;~A8jKn0kTCDMqF0#C2c;!c3u;zu zR(3Xg7}tLOeWRW3@h7blq?RISU=TkgvAX({&sk_loXH$d%EVD#llSnb5?SdfgDY%TNExSx_YYqXlNrsGN%)?-C;WGZ~E@0;N{ zr|QuFciTek4u3g0d literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@2x.png b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f2bf7810daedda0d0180a63bf28253a87a1c2d GIT binary patch literal 4289 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 ae_3lSTZgG@wX=U50H#KkhJ@?Lg#Q33o${gp literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@3x.png b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork.imageset/feature_unavaible_artwork@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..12be231e7a9afb74eaff2bd8cb07023f8ef4122c GIT binary patch literal 6562 zcmeHrS5OpDw{;J3Kt*yC85n}7BvCR93aBK>paPPSC?HWB7?MbooRfegi2{-tP=+)T zC4(@MqvSj=+~)fq|EK$K>%QEs>gwuqPVcj8?cQsx?oiEVPp(n2QUU;QP5G&!HUL2W zf~Opm3>?w>+lB=%6wXgyxB>vD#N`Q5N)#~#2O+N7PaXkfeK%IY8~|Jc;`_b6V8kbg2YO;h^!S$GD&Hq)OMjRF)NQjP^A$dd1xY4SW~4BX!E zDDES|(FI~Q*zbt8q7wcZ0y7cs>B2f2iR$rsu9| zo?S3(q{UnFRfTd#9XMNW`CK}cX_%$_)H)sn5c1L|XQbcwbh^w^Hm;&;B z+Oz5^W3&ko0s`2l;^G3Y)MN+w6~xHgb=CYJzzbJc)9XEjv%ZM((pW!EFiOer<}v!l zrkqS$c=!C0o{MUg3ReB$WVI5w`dmtO?H}6U$(texwI_~_clFT?J{^@FE;k@#fTeDW z#m9{pSvuP8&8+bExif01jpmD@#wKjMVASeo8j|k~Z#-Y`9nsS2PMgbmf!4dh0K(FD z@6-SnQ@hZm-8_Te13Jc-d0sjE>dGp0@xZ17#6X|scZ*UtjxD32Si4e^v;ywKfiCvz zf9_D3Q?ddBzao(C$fRHx+J|2w))Vczxa&SgO>`C5*1I^w<>fZ}WTrGEY-`=-7d4hr z3+1-~{92|?yw1i+cCa^-oOk!V4-;plM@PfpP+>qZU9!(Js!90kvSzOQn>y@hA?Im- z;aFY9v1lR%0Q;RvSd-Do(Iu z>DGU!JtUS7%81C?cSCZ-+K8d_1A(B{BJ7}l+kT2EO;|}8n4Y#h;ASUb2DrL5 zyhnKpzr4Ifv)FEK@=cQRa_z(S`v_&_Gwa-3BA(ZjKONUbhbuUcau!KX4HhhF zCG#@+_eJTnHZg$+=u)Q6&#DUDiVCly_;ukdmY*FcO>`*3Csc9uYR%f3T~Tr4Fp6S9 zEvfflb=hGae=wGnl%sX;`|!|!{~uBxvw!j4&0$)1rZgx`R`{aI9St|_R~4j%nZKz&SrVPIH)=8UznhFO@pIsj zb4J%;&5;^DL|;(dYIrY;;7)(H;gIY(T7$W%y>2g_ z3}c>Fd3l-Baf^SYj*hQoYKn`LYY_Mn;Kkr~)l5+}qgh>~0JOLMvwuZ+=e(ZlvN7LK zf%;xShT#;IavYU#^pyws+D3nEkoI{&P+@A}Na>Wf!9E|15^k-*ar9t&bajsvBUVj9 zZ&}5l5%TOrd#uo&oY>716Vx>cb~>}%EjKsK$LP#h z5B}@{^17VLM|KjnvcU1qne*~W0Fi^tZpWK?XB(xC&xeuD(fJv1k3fzIwEQ#h^SZ)4 z&KA6`Fh0B@wEV=tc@#NvMf=fZqx>ZKW^Lp0%s5p&XgPB2qM_}RW1aS-FF&W48ALt^ zX^wf$pQsy@HOkqW5Z;&}8=A189Yh8p^Mi`$48VVddCILIxi;3aAG23&+C|fHfnCPQ zi`EH_N;Jpv{4DD*;J1yYg zeS?bySMB0yEtu{DiV-Qn1WdifqWIR$SaVUDSJ?{qXE{0_2?_)Ywx}kq>n-05jjZys zGd27~&noId=L;l|&2(>n+Y3pfe5&sxCQry&ST#!cff*v1s7j+hcAD^W z<|*Fc?Q0XeP)ZUChS)b^;KtZ8M|KZSeTKS5O>WVRLWUH^i zK0_k-lITsvtbCNoB}m|AqPxb{crTn9mEuCWW7)YtH$&M%?}2T9xRFB zh%XRIWvft#*L5{0Y3%!8;e%JW)Tn!nxwXDFZ(z?xv*TYHFiPt$|9-Qqh9w33Aj!5X zZg+YEm!N?CpdCsfC5zAY#9+oc~jLQ$o?&ZE3 zD@gC}xSWj}7F>O&7q_r_=u^44f{u*}X|~|wkwlJv-QD#Z`);z@ky85hQYzoE6pRI{ zhxGolWuFz0>S%d)6n!$WSc69Q@nhx39|l zGdap@B~|kc&Q2?RBWV{`dvc^Rc#RD#G4uVUmu*X8)OqoLY6w)ec9Q~HKLl+6;4bJH zfamgHt`(P6G=+e*X(a+5@FN8g2CjhH0*qkY|Hl?;3IdvHou9&w);QXw&k`|I)nUnL z?>4pvMKkj|B4}AeUs_@$V{e!U*kP4&I>wI6iM7CN>7S9;Y}A{qY@?TOm9yk0y79kK zUyWW6icq*9i5EvS7fa-oaD)rM_JgA~WzUS#S{k znYKC~kGn`k7-uxivdZ2j6ar=s{UDYalAbl(?h*blcxyf(=Jo!O4}B7ez~U6AMhnX5JAt|->{pw|hcZ=v6!J3ek_ zS>5ez{S0H6%=a@K*E~^HoI1au+|MxnPrcpREZ+WWS`TqT*acsW>!r(=V!_diQVOH(w?tbFXd!joJ;J8%Iwsv=GmC2~>Z}UVX6p+W3$;UI^cy@x6 z(CN`YohlIxj-D$51||}ui=3F2sVILXJh*DRtk&aJEh)wVr4%#cr0uaTCd?Tc81Nko z6`TkacYaF1VpUkKTCYu&AR5Nv}_Wf9UyP0`#L$EhrJ{H3(Ndpq=a?mf2D zqJ!LSS{&X?<}Gpwlio(m0mT?7Ch_OMF!MqBOlVrrurXAqq0 z%c)o3-1>h;U1d!KTuwUAO&RT(-kR^6%?zpCb}hyi#!p`~r^6k@EZxgttxZGn=!b_`yY9JSdlPifA_@A zR7YuK-dA>bA&f$gM4`m0_D<%#Nz$)ujUcR%hG?2iA@t*ttf&bN6iH9Ft({*3U&B7wr&CM-DVC;VFx{`5sO8t$`F)r9+-5~PG_meW%ocg2b;z2D8P zXfBP`Lj3*>ML++L+oPOP^^fa@cMcZ4u8L?P zHF6qLSk9>||Km?&5nF`J>AsUp=?2a2oss|GL!(#XK3Fo>xU`@BSd6PA--z4K{&Kta z5bd%Zb$<7taLGyXunz#SR^EJmzFItTkqsBGtu%h26!^eYA_O3&N$hc@H?l$MRDN=X z#JY3Pv?_r)R4i=V;WprHY7cQz5u-jb2ALCCoJICz$XDL=^`HFc#qWt^D$ z@2D%YnVo+-i%Nlu?k;Y_>q?9O#Y`5`G&(EG#c>xzjrIBSRsM}}|IsF*l+e(MqcwX1 znTQ7J?jCxN1;Y2HP9I1DWv)5b^zwZ@K+<6F)z3 z<~sqJH-zl-Gvg%7?1{xd^^v116LxrcZ^vp`Gys&T6{}Hqx+BphyA!8s9t`etL~<*r=2kM`I{S3{1x0|@}j!K}F(Y=5pw-5|_U`uJ)R=Gs`rETw;EN(Erqj%XZ?59h8qs1NAV)*DzB zw#wmV5?VP?`g;>X6bTS_rM3u`Jo&lAb!3G=K5i1MUH;OI=7+4M!QaQ?zo*^f6hs z*JO+IXBa?yD;f1~dcxqipmM*Q0{QndLh6vJ`ZS3?9xgTTajO5+>8oNNi=f?^#Dyjw z%GeY8F+`9n5Pa-5;xl3KT8bFiX`9*8|6OzNzvxT;Z|na-Be+NlQQ?2+=9S3@;EtS) zSBU@A?Y*0DpT<$CP8!mbndm17b(G>tp_MxP=owV-kazjU1vI?hM5ym=MD9HB*)z-IZ@*aq=hmOf3wc$yd7WY6|8Lkdn3PSuamr_4?vsO zYC99tYL-(tiF2Ge_yPIz{Fdv#r+976G!v1qLmu1c z>FcY=+(h-yOS5@m14#GU85~cU0t}s6+EA-GcIUsaD2K_Fiwn2*86W&_xmPc=2HzuY zZc(>dsXc`29&X|lw$9Or2)x~Ry^hiELIj7wynS+i>EO4E*Hbl48h9^vb@i=tuO~*A z>>Z?HXm7uD-q4^rBv(*Wr0m;RtZXD=`E*33D7OFrMw%cP%E6t`A;|vO?mkSBK7$tcNq-oIsqrGT&+xWv!UFB!PezJ(!U+ z=#BX}TBeG>u}6G*D2-lF3+k0xA94LN$-Kl$hnw0TD`{Ch9e(O#5GO5qLtYB2^M0Sc zdd`j$nlQ}jWM!q)VQT|tn01`0m29~piR~G)exeYFG@H%woi{`{zTDb8RI|tU!F9PN zzDpf?|Kea(?7ltQkOHNs>PSoVZL->#^UbpN{aj91YQc^rmPZGA2PuV2o1qztw6=B` zJg-aS$y^NgdF(xKeCsB~vCaR&r!X%sujdb{;QXnA)yT@ZNIyQ=_q$46p(N3p@d`7- z$yRdy*|O>f?6q2{y7i-YHTe*+0) z)-Z$qdX+Mhiq@7EkLlBhkNl8C_K{!c+LoEheiOF$8aACH&tB5gZLuyYH}7NWgnmZI z3x9;ko-FVpTCElLkHiHnb)G#zkg?X zE3`Z;{aRZ3HF~!wv+(N|%vYHmJ5nfAmP^WMqLN3o_dK{G!#nj|Jq&sCxogX?M%E_I zq|xKNf#c20Sq-4?^(28?2X%3HHAZlHDlsvlpAm+6h1g%3OlI1HpREL6JHPoe;ID}N zS?yi)L`ykpyOb6DuU<+IgF%HKl^;ab`UPx?2IT6cKpuzuj z_*3dP3u{VhSUSa(Y|pnL1x%!}D8rJ8!o7w3NbUL7Z!KL>CzC1jwHjIdhX3T=HAQ?d zA)$hsDn8m9%++g?ii=ur-0N9iQan$~n!L+)^L_fDvwXx2N$n-n=9cA;vy&oG*VXd$ z$?P!ee<{ONnBMu&t{q<{A zK5h0ZhrF95Ebo6vL5RWt_}j_JPouYmPNE4@2!m7P^<;}Dz3$e%r6Ai)QnAypV*9S&+>gG;qjcqY0Fxz(ZN-nPS-^(}4d1(a4oE literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/Contents.json b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/Contents.json new file mode 100644 index 000000000..3de7744a6 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "feature_unavaible_artwork_dark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "feature_unavaible_artwork_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "feature_unavaible_artwork_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/feature_unavaible_artwork_dark.png b/Riot/Assets/Images.xcassets/Spaces/feature_unavaible_artwork_dark.imageset/feature_unavaible_artwork_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f90898c72571543ba9fb507bafe539f593e834c2 GIT binary patch literal 2301 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 Date: Thu, 29 Apr 2021 14:27:58 +0200 Subject: [PATCH 02/28] Add "unavailable feature" strings. --- Riot/Assets/en.lproj/Vector.strings | 8 ++++++++ Riot/Generated/Strings.swift | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 6b58da5c1..6c63c073a 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1615,3 +1615,11 @@ Tap the + to start adding people."; "room_intro_cell_information_dm_sentence2" = "Only the two of you are in this conversation, no one else can join."; "room_intro_cell_information_multiple_dm_sentence2" = "Only you are in this conversation, unless any of you invites someone to join."; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Not available"; +"space_feature_unavailable_instructions" = "Use your computer to open the link. If you do, we’ll let you know when the feature comes to iOS."; +"space_feature_unavailable_invite_info" = "You’re trying to manage a Space invite. Spaces are currently only available in beta on web, or Android"; +"space_feature_unavailable_space_link" = "You’re trying to open a link to a Space. Spaces are currently only available in beta on web, or Android"; +"space_feature_unavailable_share_link_action" = "Share link"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index ab9947434..ff6b7ab08 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -4494,6 +4494,26 @@ internal enum VectorL10n { internal static var socialLoginListTitleSignUp: String { return VectorL10n.tr("Vector", "social_login_list_title_sign_up") } + /// Use your computer to open the link. If you do, we’ll let you know when the feature comes to iOS. + internal static var spaceFeatureUnavailableInstructions: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_instructions") + } + /// You’re trying to manage a Space invite. Spaces are currently only available in beta on web, or Android + internal static var spaceFeatureUnavailableInviteInfo: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_invite_info") + } + /// Share link + internal static var spaceFeatureUnavailableShareLinkAction: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_share_link_action") + } + /// You’re trying to open a link to a Space. Spaces are currently only available in beta on web, or Android + internal static var spaceFeatureUnavailableSpaceLink: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_space_link") + } + /// Not available + internal static var spaceFeatureUnavailableTitle: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_title") + } /// Start internal static var start: String { return VectorL10n.tr("Vector", "start") From ae7c760ac0cf83667809e7bb46fbeafaf07bc94d Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:32:05 +0200 Subject: [PATCH 03/28] Add SpaceFeatureUnaivableViewController. --- ...eFeatureUnaivableViewController.storyboard | 126 ++++++++++++++++ .../SpaceFeatureUnaivableViewController.swift | 138 ++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard create mode 100644 Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift diff --git a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard new file mode 100644 index 000000000..b7ed1bddb --- /dev/null +++ b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift new file mode 100644 index 000000000..5358fd1d2 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift @@ -0,0 +1,138 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +final class SpaceFeatureUnaivableViewController: UIViewController { + + // MARK: - Constants + + private enum Constants { + static let buttonHighlightedAlpha: CGFloat = 0.2 + } + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var artworkImageView: UIImageView! + @IBOutlet private weak var informationLabel: UILabel! + @IBOutlet private weak var instructionsLabel: UILabel! + @IBOutlet private weak var shareButton: CustomRoundedButton! + + // MARK: Private + + private var theme: Theme! + + // MARK: - Setup + + @objc class func instantiate() -> SpaceFeatureUnaivableViewController { + let viewController = StoryboardScene.SpaceFeatureUnaivableViewController.initialScene.instantiate() + viewController.theme = ThemeService.shared().theme + return viewController + } + + // MARK: - Life cycle + + override func viewDidLoad() { + super.viewDidLoad() + + self.setupViews() + + self.registerThemeServiceDidChangeThemeNotification() + self.update(theme: self.theme) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return self.theme.statusBarStyle + } + + // MARK: - Private + + private func registerThemeServiceDidChangeThemeNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil) + } + + @objc private func themeDidChange() { + self.update(theme: ThemeService.shared().theme) + } + + private func setupViews() { + self.title = VectorL10n.spaceFeatureUnavailableTitle + self.instructionsLabel.text = VectorL10n.spaceFeatureUnavailableInstructions + + self.shareButton.titleLabel?.font = UIFont.systemFont(ofSize: 17.0, weight: .medium) + self.shareButton.setTitle(VectorL10n.spaceFeatureUnavailableShareLinkAction, for: .normal) + } + + // MARK: - Public + + func update(theme: Theme) { + self.theme = theme + + self.view.backgroundColor = theme.backgroundColor + + if let navigationBar = self.navigationController?.navigationBar { + theme.applyStyle(onNavigationBar: navigationBar) + } + + self.informationLabel.textColor = theme.textPrimaryColor + self.instructionsLabel.textColor = theme.textSecondaryColor + + // Artwork image view + + let artworkImage = ThemeService.shared().isCurrentThemeDark() ? Asset.Images.featureUnavaibleArtworkDark.image : Asset.Images.featureUnavaibleArtwork.image + + self.artworkImageView.image = artworkImage + + // Share button + + self.shareButton.setTitleColor(theme.baseTextPrimaryColor, for: .normal) + self.shareButton.setTitleColor(theme.baseTextPrimaryColor.withAlphaComponent(Constants.buttonHighlightedAlpha), for: .highlighted) + self.shareButton.vc_setBackgroundColor(theme.tintColor, for: .normal) + + let buttonImage = Asset.Images.shareActionButton.image.vc_tintedImage(usingColor: theme.baseIconPrimaryColor) + + self.shareButton.setImage(buttonImage, for: .normal) + } + + // MARK: - Private + + private func shareWebAppURL() { + guard let webAppURL = URL(string: BuildSettings.applicationWebAppUrlString) else { + return + } + + // Set up activity view controller + let activityItems: [Any] = [ webAppURL ] + let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + + // Configure source view when activity view controller is presented with a popover + if let popoverPresentationController = activityViewController.popoverPresentationController { + popoverPresentationController.sourceView = self.shareButton + popoverPresentationController.sourceRect = self.shareButton.bounds + popoverPresentationController.permittedArrowDirections = [.down, .up] + } + + self.present(activityViewController, animated: true) + } + + // MARK: - Action + + @IBAction private func shareButtonAction(_ sender: UIButton) { + self.shareWebAppURL() + } +} From d5ca0b0c25873484a1f1985fb02691a43a8b326a Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:32:31 +0200 Subject: [PATCH 04/28] Add SpaceFeatureUnavailablePresenter that enables to present modals for unavailable space features. --- .../SpaceFeatureUnavailablePresenter.swift | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift diff --git a/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift b/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift new file mode 100644 index 000000000..617988ac4 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift @@ -0,0 +1,56 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +/// SpaceFeatureUnavailablePresenter enables to present modals for unavailable space features +@objcMembers +final class SpaceFeatureUnavailablePresenter: NSObject { + + // MARK: - Constants + + // MARK: - Properties + + // MARK: Private + + private weak var presentingViewController: UIViewController? + + // MARK: - Public + + func presentUnavailableFeature(with informationText: String, + from presentingViewController: UIViewController, + animated: Bool) { + + let spaceFeatureUnavailableVC = SpaceFeatureUnaivableViewController.instantiate() + + let navigationVC = RiotNavigationController(rootViewController: spaceFeatureUnavailableVC) + + spaceFeatureUnavailableVC.navigationItem.rightBarButtonItem = MXKBarButtonItem(title: Bundle.mxk_localizedString(forKey: "ok"), style: .plain, action: { [weak navigationVC] in + navigationVC?.dismiss(animated: true) + }) + + navigationVC.modalPresentationStyle = .formSheet + presentingViewController.present(navigationVC, animated: animated, completion: nil) + } + + func presentInvitesUnavailable(from presentingViewController: UIViewController, animated: Bool) { + self.presentUnavailableFeature(with: VectorL10n.spaceFeatureUnavailableInviteInfo, from: presentingViewController, animated: animated) + } + + func presentSpaceLinkUnavailable(from presentingViewController: UIViewController, animated: Bool) { + self.presentUnavailableFeature(with: VectorL10n.spaceFeatureUnavailableSpaceLink, from: presentingViewController, animated: animated) + } +} From 7cc9e185b87132b9be3e54b55bc40ee7c91909e7 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:36:13 +0200 Subject: [PATCH 05/28] RecentsViewController: Adverstize that spaces are not supported when tapping on a space invite. --- .../Common/Recents/RecentsViewController.m | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index c396da4ff..4e3c15c9f 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -70,6 +70,8 @@ @property (nonatomic, strong) RoomsDirectoryCoordinatorBridgePresenter *roomsDirectoryCoordinatorBridgePresenter; +@property (nonatomic, strong) SpaceFeatureUnavailablePresenter *spaceFeatureUnavailablePresenter; + @end @implementation RecentsViewController @@ -870,6 +872,16 @@ return recentsDataSource; } +- (void)showSpaceInviteNotAvailable +{ + if (!self.spaceFeatureUnavailablePresenter) + { + self.spaceFeatureUnavailablePresenter = [SpaceFeatureUnavailablePresenter new]; + } + + [self.spaceFeatureUnavailablePresenter presentInvitesUnavailableFrom:self animated:YES]; +} + #pragma mark - MXKDataSourceDelegate - (Class)cellViewClassForCellData:(MXKCellData*)cellData @@ -905,6 +917,13 @@ { // Retrieve the invited room MXRoom *invitedRoom = userInfo[kInviteRecentTableViewCellRoomKey]; + + if (invitedRoom.summary.roomType == MXRoomTypeSpace) + { + // Indicates that spaces are not supported + [self showSpaceInviteNotAvailable]; + return; + } // Display the room preview [self dispayRoomWithRoomId:invitedRoom.roomId inMatrixSession:invitedRoom.mxSession]; @@ -913,6 +932,13 @@ { // Retrieve the invited room MXRoom *invitedRoom = userInfo[kInviteRecentTableViewCellRoomKey]; + + if (invitedRoom.summary.roomType == MXRoomTypeSpace) + { + // Indicates that spaces are not supported + [self showSpaceInviteNotAvailable]; + return; + } // Accept invitation [self joinRoom:invitedRoom completion:nil]; @@ -921,6 +947,13 @@ { // Retrieve the invited room MXRoom *invitedRoom = userInfo[kInviteRecentTableViewCellRoomKey]; + + if (invitedRoom.summary.roomType == MXRoomTypeSpace) + { + // Indicates that spaces are not supported + [self showSpaceInviteNotAvailable]; + return; + } [self cancelEditionMode:isRefreshPending]; @@ -1372,8 +1405,13 @@ // Retrieve the invited room MXRoom* invitedRoom = cellData.roomSummary.room; + if (invitedRoom.summary.roomType == MXRoomTypeSpace) + { + // Indicates that spaces are not supported + [self showSpaceInviteNotAvailable]; + } // Check if can show preview for the invited room - if ([self canShowRoomPreviewFor:invitedRoom]) + else if ([self canShowRoomPreviewFor:invitedRoom]) { // Display the room preview [self dispayRoomWithRoomId:invitedRoom.roomId inMatrixSession:invitedRoom.mxSession]; From e66c34de0aa2e2548ef143872fd11da8f357a77d Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:37:07 +0200 Subject: [PATCH 06/28] LegacyAppDelegate: Adverstize that spaces are not supported when tapping on a space link. --- Riot/Modules/Application/LegacyAppDelegate.m | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 24c19db8d..2e85248c1 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -228,6 +228,8 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni @property (nonatomic, strong) MajorUpdateManager *majorUpdateManager; +@property (nonatomic, strong) SpaceFeatureUnavailablePresenter *spaceFeatureUnavailablePresenter; + @end @implementation LegacyAppDelegate @@ -2740,6 +2742,24 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni - (void)showRoom:(NSString*)roomId andEventId:(NSString*)eventId withMatrixSession:(MXSession*)mxSession restoreInitialDisplay:(BOOL)restoreInitialDisplay completion:(void (^)(void))completion { + if (roomId && mxSession) + { + MXRoom *room = [mxSession roomWithRoomId:roomId]; + + if (room.summary.roomType == MXRoomTypeSpace) + { + // Indicates that spaces are not supported + [self showSpaceLinkNotAvailable]; + + if (completion) + { + completion(); + } + + return; + } + } + void (^selectRoom)(void) = ^() { // Select room to display its details (dispatch this action in order to let TabBarController end its refresh) [self.masterTabBarController selectRoomWithId:roomId andEventId:eventId inMatrixSession:mxSession completion:^{ @@ -4633,4 +4653,16 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni return [authVC continueSSOLoginWithToken:loginToken txnId:txnId]; } +#pragma mark - Spaces + +- (void)showSpaceLinkNotAvailable +{ + if (!self.spaceFeatureUnavailablePresenter) + { + self.spaceFeatureUnavailablePresenter = [SpaceFeatureUnavailablePresenter new]; + } + + [self.spaceFeatureUnavailablePresenter presentSpaceLinkUnavailableFrom:self animated:YES]; +} + @end From 8b4a58768b0421e67a29d552a32145ff8b09699a Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:37:39 +0200 Subject: [PATCH 07/28] Update Storyboards. --- Riot/Generated/Storyboards.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Generated/Storyboards.swift b/Riot/Generated/Storyboards.swift index 0b1492b69..8e7290c1a 100644 --- a/Riot/Generated/Storyboards.swift +++ b/Riot/Generated/Storyboards.swift @@ -229,6 +229,11 @@ internal enum StoryboardScene { internal static let initialScene = InitialSceneType(storyboard: SimpleScreenTemplateViewController.self) } + internal enum SpaceFeatureUnaivableViewController: StoryboardType { + internal static let storyboardName = "SpaceFeatureUnaivableViewController" + + internal static let initialScene = InitialSceneType(storyboard: SpaceFeatureUnaivableViewController.self) + } internal enum TemplateScreenViewController: StoryboardType { internal static let storyboardName = "TemplateScreenViewController" From cc9d66066662015f545b2d5baea955775c26ec5b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 14:47:52 +0200 Subject: [PATCH 08/28] Update changes --- CHANGES.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2de09a9b6..d3f1bda20 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,8 @@ Changes to be released in next version * 🙌 Improvements - * + * Spaces: Show space invites and advertise that they are not available (#4277). + * Advertise that spaces are not available when tapping on a space link or a space invite (#4279). 🐛 Bugfix * RoomVC: Avoid navigation to integration management using integration popup with settings set to integration disabled (#4261). From 8fb3583ac613fb1d38957aa0285bf4efa3160db3 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 15:08:40 +0200 Subject: [PATCH 09/28] EventFormatter: Make temporary space room type visible. --- Riot/Utils/EventFormatter.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Utils/EventFormatter.m b/Riot/Utils/EventFormatter.m index 532d26162..9b66e5a29 100644 --- a/Riot/Utils/EventFormatter.m +++ b/Riot/Utils/EventFormatter.m @@ -374,6 +374,12 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm"; self.encryptedMessagesTextFont = [UIFont italicSystemFontOfSize:15]; self.emojiOnlyTextFont = [UIFont systemFontOfSize:48]; self.editionMentionTextFont = [UIFont systemFontOfSize:12]; + + // Handle space room type, enables to show space in room list + // TODO: Waiting for MSC1772 to be finalized. Be sure to use MXRoomTypeStringSpace before releasing. + defaultRoomSummaryUpdater.showRoomTypeStrings = @[ + MXRoomTypeStringSpaceMSC1772 + ]; } return self; } From e9287782cfe2d1dc3c7fd0cc0defb712ae951047 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 16:38:45 +0200 Subject: [PATCH 10/28] RecentsDataSource: Hide spaces from home and room list but keep space invites. --- .../Common/Recents/DataSources/RecentsDataSource.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 497f80fce..57474d9c8 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -1188,7 +1188,11 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } else { - [conversationCellDataArray addObject:recentCellDataStoring]; + // Hide spaces from home (keep space invites) + if (room.summary.roomType != MXRoomTypeSpace) + { + [conversationCellDataArray addObject:recentCellDataStoring]; + } } } else if (_recentsDataSourceMode == RecentsDataSourceModeFavourites) @@ -1219,12 +1223,12 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou // Consider only non direct rooms. if (!room.isDirect) { - // Keep only the invites, the favourites and the rooms without tag + // Keep only the invites, the favourites and the rooms without tag and room type different from space if (room.summary.membership == MXMembershipInvite) { [invitesCellDataArray addObject:recentCellDataStoring]; } - else if (!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) + else if ((!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) && room.summary.roomType != MXRoomTypeSpace) { [conversationCellDataArray addObject:recentCellDataStoring]; } From 4011a1f90f963828429e0098e98ce2bf0b8fa103 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 29 Apr 2021 16:39:30 +0200 Subject: [PATCH 11/28] Update changes --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2de09a9b6..2f855fa83 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,7 @@ Changes to be released in next version * 🙌 Improvements - * + * Spaces: Hide spaces from room list and home but keep space invites (#4252). 🐛 Bugfix * RoomVC: Avoid navigation to integration management using integration popup with settings set to integration disabled (#4261). From 9c2b032b99160cc02b926cd9ae8a96cc93cf50ce Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Tue, 4 May 2021 10:02:31 +0200 Subject: [PATCH 12/28] SpaceFeatureUnaivableViewController: Use a view data to populate view. --- ...eFeatureUnaivableViewController.storyboard | 22 ++++++++-------- .../SpaceFeatureUnaivableViewController.swift | 25 +++++++++++++------ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard index b7ed1bddb..e02494f31 100644 --- a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard +++ b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard @@ -1,8 +1,6 @@ - - @@ -13,32 +11,32 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 22ee7e35d0f4ff60ce93930e330dcfb87115415f Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 6 May 2021 12:07:20 +0200 Subject: [PATCH 21/28] CloseButton: Update UI. --- Riot/Modules/Common/Buttons/Close/CloseButton.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Common/Buttons/Close/CloseButton.swift b/Riot/Modules/Common/Buttons/Close/CloseButton.swift index adf2b0226..6a04a7eeb 100644 --- a/Riot/Modules/Common/Buttons/Close/CloseButton.swift +++ b/Riot/Modules/Common/Buttons/Close/CloseButton.swift @@ -23,7 +23,7 @@ final class CloseButton: UIButton, Themable { private enum CircleBackgroundConstants { static let height: CGFloat = 30.0 static let highlightedAlha: CGFloat = 0.5 - static let normalAlha: CGFloat = 1.0 + static let normalAlha: CGFloat = 0.8 } // MARK: - Properties @@ -109,6 +109,6 @@ final class CloseButton: UIButton, Themable { func update(theme: Theme) { self.theme = theme - self.circleBackgroundView.backgroundColor = theme.headerTextSecondaryColor + self.circleBackgroundView.backgroundColor = theme.secondaryCircleButtonBackgroundColor } } From c7c6f7701c2c8a7cb0f8d0488a72d955a8a25a6e Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 6 May 2021 12:09:12 +0200 Subject: [PATCH 22/28] GroupsViewController: Add space beta announce cell. --- Riot/Managers/Settings/RiotSettings.swift | 10 +++ .../DataSources/GroupsDataSource.m | 77 +++++++++++++++++++ .../Communities/GroupsViewController.m | 1 + 3 files changed, 88 insertions(+) diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index 1886975aa..ce3ec7bdd 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -73,6 +73,7 @@ final class RiotSettings: NSObject { static let roomScreenAllowFilesAction = "roomScreenAllowFilesAction" static let roomInfoScreenShowIntegrations = "roomInfoScreenShowIntegrations" static let unifiedSearchScreenShowPublicDirectory = "unifiedSearchScreenShowPublicDirectory" + static let hideSpaceBetaAnnounce = "hideSpaceBetaAnnounce" } static let shared = RiotSettings() @@ -634,4 +635,13 @@ final class RiotSettings: NSObject { } } + // MARK: - Beta + + var hideSpaceBetaAnnounce: Bool { + get { + return defaults.bool(forKey: UserDefaultsKeys.hideSpaceBetaAnnounce) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.hideSpaceBetaAnnounce) + } + } } diff --git a/Riot/Modules/Communities/DataSources/GroupsDataSource.m b/Riot/Modules/Communities/DataSources/GroupsDataSource.m index 28a1cabe8..094eba763 100644 --- a/Riot/Modules/Communities/DataSources/GroupsDataSource.m +++ b/Riot/Modules/Communities/DataSources/GroupsDataSource.m @@ -15,9 +15,77 @@ */ #import "GroupsDataSource.h" +#import "Riot-Swift.h" + +@interface GroupsDataSource() + +@property (nonatomic) NSInteger betaAnnounceSection; +@property (nonatomic) BOOL showBetaAnnounce; + +@end @implementation GroupsDataSource +- (instancetype)initWithMatrixSession:(MXSession *)matrixSession +{ + self = [super initWithMatrixSession:matrixSession]; + if (self) + { + _showBetaAnnounce = !RiotSettings.shared.hideSpaceBetaAnnounce; + } + return self; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + NSInteger count = 0; + self.betaAnnounceSection = self.groupInvitesSection = self.joinedGroupsSection = -1; + + // Check whether all data sources are ready before rendering groups. + if (self.state == MXKDataSourceStateReady) + { + if (self.showBetaAnnounce) + { + self.betaAnnounceSection = count++; + } + if (groupsInviteCellDataArray.count) + { + self.groupInvitesSection = count++; + } + if (groupsCellDataArray.count) + { + self.joinedGroupsSection = count++; + } + } + + return count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (indexPath.section == self.betaAnnounceSection) + { + BetaAnnounceCell *cell = [tableView dequeueReusableCellWithIdentifier:BetaAnnounceCell.reuseIdentifier forIndexPath:indexPath]; + [cell vc_hideSeparator]; + [cell updateWithTheme:ThemeService.shared.theme]; + cell.delegate = self; + return cell; + + } + + return [super tableView:tableView cellForRowAtIndexPath:indexPath]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + if (section == self.betaAnnounceSection) + { + return 1; + } + + return [super tableView:tableView numberOfRowsInSection:section]; +} + - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString* sectionTitle = nil; @@ -44,4 +112,13 @@ return (indexPath.section == self.joinedGroupsSection); } +#pragma mark - BetaAnnounceCellDelegate + +- (void)betaAnnounceCellDidTapCloseButton:(BetaAnnounceCell *)cell +{ + self.showBetaAnnounce = NO; + RiotSettings.shared.hideSpaceBetaAnnounce = YES; + [self.delegate dataSource:self didCellChange:nil]; +} + @end diff --git a/Riot/Modules/Communities/GroupsViewController.m b/Riot/Modules/Communities/GroupsViewController.m index dadc807af..afeea1bd4 100644 --- a/Riot/Modules/Communities/GroupsViewController.m +++ b/Riot/Modules/Communities/GroupsViewController.m @@ -79,6 +79,7 @@ //Register here the customized cell view class used to render groups [self.groupsTableView registerNib:GroupTableViewCell.nib forCellReuseIdentifier:GroupTableViewCell.defaultReuseIdentifier]; [self.groupsTableView registerNib:GroupInviteTableViewCell.nib forCellReuseIdentifier:GroupInviteTableViewCell.defaultReuseIdentifier]; + [self.groupsTableView registerNib:BetaAnnounceCell.nib forCellReuseIdentifier:BetaAnnounceCell.reuseIdentifier]; // Hide line separators of empty cells self.groupsTableView.tableFooterView = [[UIView alloc] init]; From ba549d15ff74aa50c3fc3f05c0589d858e81c82c Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 6 May 2021 13:31:49 +0200 Subject: [PATCH 23/28] SpaceFeatureUnaivableViewController: Update UI. --- Riot/Assets/en.lproj/Vector.strings | 9 +-- Riot/Generated/Strings.swift | 26 +++------ Riot/Modules/Application/LegacyAppDelegate.m | 12 +--- .../Common/Recents/RecentsViewController.m | 2 +- ...eFeatureUnaivableViewController.storyboard | 45 ++++---------- .../SpaceFeatureUnaivableViewController.swift | 58 +------------------ .../SpaceFeatureUnavailablePresenter.swift | 36 +----------- 7 files changed, 30 insertions(+), 158 deletions(-) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 0fd0f7060..f705163b5 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1618,12 +1618,9 @@ Tap the + to start adding people."; // Mark: - Spaces -"space_feature_unavailable_title" = "Not available"; -"space_feature_unavailable_general_info" = "Spaces are a beta feature, for now only available on web, desktop and Android.\n\n"; -"space_feature_unavailable_invite_info" = "You’re trying to manage a Space invite. Please use your computer to manage the space invite"; -"space_feature_unavailable_open_space" = "You’re trying to open a Space. Please use your computer to open the space"; -"space_feature_unavailable_space_link_info" = "You’re trying to open a link to a Space. Please use your computer to open the link"; -"space_feature_unavailable_share_link_action" = "Send link"; +"space_feature_unavailable_title" = "Spaces aren’t here yet"; +"space_feature_unavailable_subtitle" = "Spaces aren’t on iOS, but you can use them on the Web, Desktop or Android"; +"space_feature_unavailable_information" = "Spaces are a new way to group rooms and people.\n\nOnce you join a Space, you’ll be able to access rooms from that Space on iOS."; "space_beta_announce_badge" = "BETA"; "space_beta_announce_title" = "Meet Spaces"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index decfcbb94..d639af911 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -4510,27 +4510,15 @@ internal enum VectorL10n { internal static var spaceBetaAnnounceTitle: String { return VectorL10n.tr("Vector", "space_beta_announce_title") } - /// Spaces are a beta feature, for now only available on web, desktop and Android.\n\n - internal static var spaceFeatureUnavailableGeneralInfo: String { - return VectorL10n.tr("Vector", "space_feature_unavailable_general_info") + /// Spaces are a new way to group rooms and people.\n\nOnce you join a Space, you’ll be able to access rooms from that Space on iOS. + internal static var spaceFeatureUnavailableInformation: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_information") } - /// You’re trying to manage a Space invite. Please use your computer to manage the space invite - internal static var spaceFeatureUnavailableInviteInfo: String { - return VectorL10n.tr("Vector", "space_feature_unavailable_invite_info") + /// Spaces aren’t on iOS, but you can use them on the Web, Desktop or Android + internal static var spaceFeatureUnavailableSubtitle: String { + return VectorL10n.tr("Vector", "space_feature_unavailable_subtitle") } - /// You’re trying to open a Space. Please use your computer to open the space - internal static var spaceFeatureUnavailableOpenSpace: String { - return VectorL10n.tr("Vector", "space_feature_unavailable_open_space") - } - /// Send link - internal static var spaceFeatureUnavailableShareLinkAction: String { - return VectorL10n.tr("Vector", "space_feature_unavailable_share_link_action") - } - /// You’re trying to open a link to a Space. Please use your computer to open the link - internal static var spaceFeatureUnavailableSpaceLinkInfo: String { - return VectorL10n.tr("Vector", "space_feature_unavailable_space_link_info") - } - /// Not available + /// Spaces aren’t here yet internal static var spaceFeatureUnavailableTitle: String { return VectorL10n.tr("Vector", "space_feature_unavailable_title") } diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 08c5872f0..c9f33ea5b 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -1353,7 +1353,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni if (room.summary.roomType == MXRoomTypeSpace) { // Indicates that spaces are not supported - [self.spaceFeatureUnavailablePresenter presentSpaceLinkUnavailableWith:universalLinkURL from:self.presentedViewController animated:YES]; + [self.spaceFeatureUnavailablePresenter presentUnavailableFeatureFrom:self.presentedViewController animated:YES]; } else { @@ -2777,14 +2777,8 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // Indicates that spaces are not supported if (room.summary.roomType == MXRoomTypeSpace) { - if (room.summary.membership == MXMembershipInvite) - { - [self.spaceFeatureUnavailablePresenter presentInvitesUnavailableFrom:self.presentedViewController animated:YES]; - } - else - { - [self.spaceFeatureUnavailablePresenter presentOpenSpaceUnavailableFrom:self.presentedViewController animated:YES]; - } + + [self.spaceFeatureUnavailablePresenter presentUnavailableFeatureFrom:self.presentedViewController animated:YES]; if (completion) { diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 3c53345fc..e510c5227 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -879,7 +879,7 @@ self.spaceFeatureUnavailablePresenter = [SpaceFeatureUnavailablePresenter new]; } - [self.spaceFeatureUnavailablePresenter presentInvitesUnavailableFrom:self animated:YES]; + [self.spaceFeatureUnavailablePresenter presentUnavailableFeatureFrom:self animated:YES]; } #pragma mark - MXKDataSourceDelegate diff --git a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard index e02494f31..81f7df433 100644 --- a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard +++ b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.storyboard @@ -1,6 +1,8 @@ + + @@ -11,32 +13,32 @@ - + - + - + - + - + - + - - - - - - + @@ -109,7 +88,6 @@ - @@ -119,6 +97,5 @@ - diff --git a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift index d9c57a6c5..c24ce070f 100644 --- a/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift +++ b/Riot/Modules/Spaces/SpaceFeatureUnaivableViewController.swift @@ -16,19 +16,8 @@ import UIKit -struct SpaceFeatureUnavailableViewData { - let informationText: String - let shareLink: URL -} - final class SpaceFeatureUnaivableViewController: UIViewController { - // MARK: - Constants - - private enum Constants { - static let buttonHighlightedAlpha: CGFloat = 0.2 - } - // MARK: - Properties // MARK: Outlets @@ -36,19 +25,16 @@ final class SpaceFeatureUnaivableViewController: UIViewController { @IBOutlet private weak var artworkImageView: UIImageView! @IBOutlet private weak var informationLabel: UILabel! @IBOutlet private weak var generalInfoLabel: UILabel! - @IBOutlet private weak var shareButton: CustomRoundedButton! // MARK: Private private var theme: Theme! - private var viewData: SpaceFeatureUnavailableViewData! // MARK: - Setup - class func instantiate(with viewData: SpaceFeatureUnavailableViewData) -> SpaceFeatureUnaivableViewController { + class func instantiate() -> SpaceFeatureUnaivableViewController { let viewController = StoryboardScene.SpaceFeatureUnaivableViewController.initialScene.instantiate() viewController.theme = ThemeService.shared().theme - viewController.viewData = viewData return viewController } @@ -80,11 +66,8 @@ final class SpaceFeatureUnaivableViewController: UIViewController { private func setupViews() { self.title = VectorL10n.spaceFeatureUnavailableTitle - self.informationLabel.text = self.viewData.informationText - self.generalInfoLabel.text = VectorL10n.spaceFeatureUnavailableGeneralInfo - - self.shareButton.titleLabel?.font = UIFont.systemFont(ofSize: 17.0, weight: .medium) - self.shareButton.setTitle(VectorL10n.spaceFeatureUnavailableShareLinkAction, for: .normal) + self.informationLabel.text = VectorL10n.spaceFeatureUnavailableSubtitle + self.generalInfoLabel.text = VectorL10n.spaceFeatureUnavailableInformation } // MARK: - Public @@ -106,44 +89,9 @@ final class SpaceFeatureUnaivableViewController: UIViewController { let artworkImage = ThemeService.shared().isCurrentThemeDark() ? Asset.Images.featureUnavaibleArtworkDark.image : Asset.Images.featureUnavaibleArtwork.image self.artworkImageView.image = artworkImage - - // Share button - - self.shareButton.setTitleColor(theme.baseTextPrimaryColor, for: .normal) - self.shareButton.setTitleColor(theme.baseTextPrimaryColor.withAlphaComponent(Constants.buttonHighlightedAlpha), for: .highlighted) - self.shareButton.vc_setBackgroundColor(theme.tintColor, for: .normal) - - let buttonImage = Asset.Images.shareActionButton.image.vc_tintedImage(usingColor: theme.baseIconPrimaryColor) - - self.shareButton.setImage(buttonImage, for: .normal) } func fill(informationText: String, shareLink: URL) { self.informationLabel.text = informationText } - - // MARK: - Private - - private func shareWebAppURL() { - let webAppURL = self.viewData.shareLink - - // Set up activity view controller - let activityItems: [Any] = [ webAppURL ] - let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) - - // Configure source view when activity view controller is presented with a popover - if let popoverPresentationController = activityViewController.popoverPresentationController { - popoverPresentationController.sourceView = self.shareButton - popoverPresentationController.sourceRect = self.shareButton.bounds - popoverPresentationController.permittedArrowDirections = [.down, .up] - } - - self.present(activityViewController, animated: true) - } - - // MARK: - Action - - @IBAction private func shareButtonAction(_ sender: UIButton) { - self.shareWebAppURL() - } } diff --git a/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift b/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift index c167d7054..c7633f06a 100644 --- a/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift +++ b/Riot/Modules/Spaces/SpaceFeatureUnavailablePresenter.swift @@ -23,30 +23,17 @@ final class SpaceFeatureUnavailablePresenter: NSObject { // MARK: - Constants // MARK: - Properties - - private let webAppURL: URL // MARK: Private private weak var presentingViewController: UIViewController? - - // MARK: - Setup - - override init() { - guard let webAppURL = URL(string: BuildSettings.applicationWebAppUrlString) else { - fatalError("webAppURL is invalid") - } - self.webAppURL = webAppURL - super.init() - } // MARK: - Public - func presentUnavailableFeature(with viewData: SpaceFeatureUnavailableViewData, - from presentingViewController: UIViewController, + func presentUnavailableFeature(from presentingViewController: UIViewController, animated: Bool) { - let spaceFeatureUnavailableVC = SpaceFeatureUnaivableViewController.instantiate(with: viewData) + let spaceFeatureUnavailableVC = SpaceFeatureUnaivableViewController.instantiate() let navigationVC = RiotNavigationController(rootViewController: spaceFeatureUnavailableVC) @@ -57,23 +44,4 @@ final class SpaceFeatureUnavailablePresenter: NSObject { navigationVC.modalPresentationStyle = .formSheet presentingViewController.present(navigationVC, animated: animated, completion: nil) } - - func presentInvitesUnavailable(from presentingViewController: UIViewController, animated: Bool) { - let viewData = SpaceFeatureUnavailableViewData(informationText: VectorL10n.spaceFeatureUnavailableInviteInfo, shareLink: self.webAppURL) - - self.presentUnavailableFeature(with: viewData, from: presentingViewController, animated: animated) - } - - func presentSpaceLinkUnavailable(with spaceLinkURL: URL, from presentingViewController: UIViewController, animated: Bool) { - - let viewData = SpaceFeatureUnavailableViewData(informationText: VectorL10n.spaceFeatureUnavailableSpaceLinkInfo, shareLink: spaceLinkURL) - - self.presentUnavailableFeature(with: viewData, from: presentingViewController, animated: animated) - } - - func presentOpenSpaceUnavailable(from presentingViewController: UIViewController, animated: Bool) { - let viewData = SpaceFeatureUnavailableViewData(informationText: VectorL10n.spaceFeatureUnavailableOpenSpace, shareLink: self.webAppURL) - - self.presentUnavailableFeature(with: viewData, from: presentingViewController, animated: animated) - } } From c00556d5037a12ea16f45273f217df562cbf0a5d Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 6 May 2021 15:00:00 +0200 Subject: [PATCH 24/28] EventFormatter: Use stable prefix for Space room type. --- Riot/Utils/EventFormatter.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Riot/Utils/EventFormatter.m b/Riot/Utils/EventFormatter.m index 9b66e5a29..17c6d436c 100644 --- a/Riot/Utils/EventFormatter.m +++ b/Riot/Utils/EventFormatter.m @@ -376,9 +376,8 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm"; self.editionMentionTextFont = [UIFont systemFontOfSize:12]; // Handle space room type, enables to show space in room list - // TODO: Waiting for MSC1772 to be finalized. Be sure to use MXRoomTypeStringSpace before releasing. defaultRoomSummaryUpdater.showRoomTypeStrings = @[ - MXRoomTypeStringSpaceMSC1772 + MXRoomTypeStringSpace ]; } return self; From c9f9764a955d8a3c3d540aade87115dc4cbbb87b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 6 May 2021 15:46:06 +0200 Subject: [PATCH 25/28] BetaAnnounceCell: Update close button. --- Riot/Modules/Common/Buttons/Close/CloseButton.swift | 2 +- Riot/Modules/Spaces/BetaAnnounceCell.xib | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/Common/Buttons/Close/CloseButton.swift b/Riot/Modules/Common/Buttons/Close/CloseButton.swift index 6a04a7eeb..22a0ba8c8 100644 --- a/Riot/Modules/Common/Buttons/Close/CloseButton.swift +++ b/Riot/Modules/Common/Buttons/Close/CloseButton.swift @@ -21,7 +21,7 @@ final class CloseButton: UIButton, Themable { // MARK: - Constants private enum CircleBackgroundConstants { - static let height: CGFloat = 30.0 + static let height: CGFloat = 26.0 static let highlightedAlha: CGFloat = 0.5 static let normalAlha: CGFloat = 0.8 } diff --git a/Riot/Modules/Spaces/BetaAnnounceCell.xib b/Riot/Modules/Spaces/BetaAnnounceCell.xib index 5889319fc..1ecc88ccf 100644 --- a/Riot/Modules/Spaces/BetaAnnounceCell.xib +++ b/Riot/Modules/Spaces/BetaAnnounceCell.xib @@ -40,7 +40,7 @@