From 9e739433c5361a6828c27d1ae74955dbb5f6f988 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Jan 2017 17:29:47 -0500 Subject: [PATCH] Start work on video. // FREEBIE --- .../Contents.json | 2 +- .../mute-selected-wide.png | Bin 0 -> 24179 bytes .../Contents.json | 2 +- .../mute-unselected-wide.png | Bin 0 -> 20266 bytes .../video-active.imageset/video-active.png | Bin 7746 -> 0 bytes .../video-inactive.png | Bin 11829 -> 0 bytes Signal/src/AppDelegate.m | 8 +++- Signal/src/call/CallService.swift | 44 +++++++++++++++--- Signal/src/call/NonCallKitCallUIAdaptee.swift | 14 ++++-- Signal/src/call/PeerConnectionClient.swift | 9 ++-- Signal/src/call/SignalCall.swift | 8 +++- .../call/Speakerbox/CallKitCallManager.swift | 7 +-- .../Speakerbox/CallKitCallUIAdaptee.swift | 26 ++++++++--- .../call/UserInterface/CallUIAdapter.swift | 16 +++++-- .../view controllers/CallViewController.swift | 37 ++++++++++++--- 15 files changed, 133 insertions(+), 40 deletions(-) rename Signal/Images.xcassets/{video-active.imageset => mute-selected-wide.imageset}/Contents.json (85%) create mode 100644 Signal/Images.xcassets/mute-selected-wide.imageset/mute-selected-wide.png rename Signal/Images.xcassets/{video-inactive.imageset => mute-unselected-wide.imageset}/Contents.json (84%) create mode 100644 Signal/Images.xcassets/mute-unselected-wide.imageset/mute-unselected-wide.png delete mode 100644 Signal/Images.xcassets/video-active.imageset/video-active.png delete mode 100644 Signal/Images.xcassets/video-inactive.imageset/video-inactive.png diff --git a/Signal/Images.xcassets/video-active.imageset/Contents.json b/Signal/Images.xcassets/mute-selected-wide.imageset/Contents.json similarity index 85% rename from Signal/Images.xcassets/video-active.imageset/Contents.json rename to Signal/Images.xcassets/mute-selected-wide.imageset/Contents.json index f1da728b4..b23e910c5 100644 --- a/Signal/Images.xcassets/video-active.imageset/Contents.json +++ b/Signal/Images.xcassets/mute-selected-wide.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "video-active.png", + "filename" : "mute-selected-wide.png", "scale" : "1x" }, { diff --git a/Signal/Images.xcassets/mute-selected-wide.imageset/mute-selected-wide.png b/Signal/Images.xcassets/mute-selected-wide.imageset/mute-selected-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5d3d6515673e85e0433c60091684331e4122d1 GIT binary patch literal 24179 zcmZ^~1yo$kvM7uUFgOHvw;+QD5AG1$-Q5Z9?rwuS1OfyI?(QxDf_n(=!T!m2&b#mY zXWhqIv)H?LRd-i)mv=`gDN3Ot5h6iBL7~b>i>p9EK`Z?I0pTGnp%;P!kbeM65d{$_ zsBa0#&&F_&cSI*?ZC5BL7OKBLXwTA*pCK@`)@oXAS_<-frjGV3#%7Kt<}9A}P7r7) zC;?AC$fLcvn=!eky`6(ApQj+@KM;J7=fBM$O7ed|+-wCYwG@=d#T;GC$+=iKSy(BB zkjTl&1zgN5_*BFt|BViL6Qs0qb93SYfjm4sSUfmb99=9yY`na@AXat|J3BK3g4xx} z!Ohr{*};|SU!DA)e#FgPOcn|Z+NZ$JB$zqE9<{8{v>WuO$74Wc^EQ|7nHDtq>Aq%>SbUgpkxzG^e1TgrQ`_Mbtc@PjeAE z)CO;dCHUw&5wO+j3g{!5331xl2;~OozuhCz-<u7m?dAQ4GD~issV5#u5Jphbh5S z5KJk-Cmn$P5HLO7^>V)EVR=5$>EUsHmiOpualetpVLA1D@YA(?GmcxO97qon9Y|>u zC(LXsOQQy$6gN8i*&6r3?#E1pNCMJpbWy z|5d%)4b$!L^5@pJK)V$Jlond+ee$(A{r+^#LqF7nfl;Cd51I?yg~1Sn3WG%}U(vpw zuKNnVI>~C6%j$i~=3@WoD5pi_%jnDD>)HptG9)5fHI@$u8-3@=vK@eV-+ck{CtY?$ z%-2>{X2a69XmVKBv07w+Da24JCP3<%lNGR-$mHYyT_>igO;G^;mcOs7Z2wOh;R4UHUWb`#F+uI0$T&{7{54LyA9Zw+rF28)bkBFd zWmLlt+@g~7!2KM=c81hzSDn)QOVNjFnH1W2;2MT8_t+O8WMpkX8h#UyN-DnEZ$<>+ zG_v;xmVpoLD}VUD?$I$@$z1Lm;A7s&<^KLYnN3XNj4fBkvkhmzsg@J*!E}DN^?IAT z$1u-X*o6tb$F6ruFr)MtoI%3nbFkfTjAixBOFFZzEV8;jB1M5@gZO)&*&+$SBNx*5 zd6aLshN( zid{6`@eXm0KBt5&y#UB3q^)(!lhsBP6_CvG zj2=eQCR-)h5a<@DvCo1(%Hj1R{?O2}9l7ERrAQ@>Xk#cLlgoA~X1(3R(6(TH3m?J} z4#~7_nrQi>I#4^Av&jFUk%1 z_Io^_KQsE6F1@kD>|{suId~zU4^OEH=ec%JsX8g3gLp*waoU~t=6h@Hw79I`V?-Be zc>~5=^zQ>bpGC^1wpQT0-q$95di^kr z*B4{OZQeq(LT0zo(c0m=FbD;a7q*H}h>UXobemWBv>nui4?-{+n0@K%e+u(7dk&89 zx(bFv?)tU*{RGT|bV8;2l}0W-l42b?WHsdKW=rQ4?&${!U$EVH(g_7CS@`AiY`Gm_ zt~q3PSP*Q<|Hg_i$w8ld6sVgUj1AkR(2pf2y8x}hy|sJa{sOIjxBURZ?K4-792l?S z*S;wd`f|7Jm^H|xuRXp}G`(|fwB#3TYf_p351Hod*3kgXH{gql4)0+S>-oAkspv|p ziWfbc{>kO<^4Dk|!F2=-|Hu7|rrTeOYbkACewHV&oys_EWOyoD7ANkmmMLVvW(2tN zibHl6T5p-$kDQ2e73^0^(yk%ii8dXLz3$ZK&7$^uz6ixwlW(`xHUMu^aihE6D{+J$ z9DX9etn>%a^Een&Pl*8BAK%@2GOyoFyC&vZK*QK@x)#7A)IJ+K{7X<>=(O z4)=3Kbx6%7`})n5$dKI}&zDmkieejw%k#Ly>arC?1fF+2k5~KG5U`iM*-PPW>z$6%3>a_gMmF0JYWm?o-USpp1gY3aE z^+m60pS+6THLg3H?UVLo0Shv)Vs-+iqA$7T;hO-b*hPH@jb%K-LH8bSvctVJTGRuB zC4sHvB1R(m@VCWVbd=$dZHBpbljg{38k{KRFy{x{_NyZk?QOun8=E4tFPa0#r#{4z zC&Oh-Ns%~QrOW;L6T6SjJ^LZRrCfe*#*#KAo;-<(aV`H%Pte14+}8V=UmqEC7BlMvvCjd;}#zLByo!QpDUJ0a&5( zowbO4%M_v6C;Y(6=bmr_Yj!G#C~^pOeY*-9%JtZ2{TS`V{56uc3$YK&SHgg5#pLc5Sz;0a4Clg|Vt#8I!T89%q`(RaJ~5riia9;m)K*C9C|1 zO6xY9uz~5BG$itj+a}4D4PkXiZ~>_T;q{STI#9}7GSC!>_)n=dJ^`_oO>`K;MY@)i z2Ca=w?iO)Lz)k?#CJRluyk!M$jr#IiE!iV(y;o5K7d8)4sK zYQ|T(+a{Aa5;>-}qhz+dSDJZ^r(tKNRpw#-xc<|GEWE^!nl2a@XNAQ#xNm6W= z3+Wc&t2wO3qU#RpZR=1`Zi7^sw4}ij4-`zIT@k9G8fF+0#n?fzfFDg>JbbR5_-#xg zSEN|+0kd(K7H*4Hgmogk&62$N;=Dct(l7}9nkai1sjm1wVHt21C5Uo3(7fn3R&Lj{ z&r8Z7f&MIE<*}u2{5BhdJ)o;4Rkpxj(Y&x7`HA4((9`gMZyGg3NW5C87Hn2>24i(W z4o|N0WeRK1er@<<$CYPCeyYzYzApQ0ymqu8npo$u)j9b};vtsoZ*W(}!SV8l@q6zE z)B8F8m@+l6v*1J}j+KyOZnd;&5NmqChM&nJVH`)J-F)T~NDySO`B-H^o+5=AZ9w6_|=A1h6zSag<&@adne8B?qq!t4VXb6w0K(=0w2Tp&v z;I+EX;VU6>5rDrgjzlfX(e!#6OJi&vG7_5lPB_sQU|^yTL+jXOROa^)<>xmb;l9S` zpNX2cT<2Fz6vTxDE+8*PO^GhJzM@&P*1*Gv=}9Vzi+MbX{)~XQjC#Tx=(kDW6E^f!FSy+(Kc{xPX{-w9kuOp3x2v`sx zXXTz36|{yfhPQ&NmzS}D0_{6ycKo`M*pA^Tc?bVKv`=GHI_$oz{gUjAUoA}H;tlQV zcmw`@QbKB_D!?Qp&{rfdjc}P_hTK<8mv(j1K2YXUKg_xj=KY< zT})LKW`*|;qVIJq@Tk1BjaWa18GgjRTJuyZmn{UENeU|-i5i}ZJ5Eo^Ta%5uUW|QF zuX@#c-@Z!8MtXN~5TSB6Z^9Z;Nbf-x|Bo`BPOu+Pkht(sLaix>-3BMY%}LR|6;aXeN=T)tWEEqX*X9zd0!LC zd#*Cx_b`|gtd1KUpKni=1MrLK=!PRcH}VARtnkEU-Gan8V%S28xWQ4m?`jLN+r`xo zKS-&*ucV<)tZp0ld2 z^Keba?wnk69j{|menh?;Hf5EH*e^ZC3F4t5Uw7|XWC`bphD{i^wz}DE#q^ihFUrJ@ z!XbC#YBOQoj2SWVmmNH>hUd^wukJHL41ySh2?(RUFok#11vCA+B7V)L@u!pOVboxX z{!%J~XX?|2KSybY2R-(-r&WD@i+u}BRKtaffQn1-2fla^lEsN4C7^CNLF?Z>iC#r1 zToti_>&GLI{9!jKsoPE}_e4rt<|(Khz#StPTUo1FOFN9%jBZq+q-*;(Kg{YYxAc|q z6^2-SR9a10GZn;^M&75(-^ z>8pF6!<)CxY*=G{X)pJQheE|HX4F5OD&-|b^w$quZ0H`Ph{3JRm4vNCIfP6kJCfE@ zZb}fCvDL6>p(B>ig8TuQ+n-JqdR;rUJH2lWviLn5 zOdX>=!*D}q&7%6Op?uu&k17@lV+Zwc!z0Sn0oXxcU>$)O3hF!F1yA=$t#*vObAt(W z0d-*hRHWa1PS6f)mURjVqOlP0)J8NjmL#P}?=UH!d{{k^KAZ%R;dT$veT+oP}sH+SFRqE|fQq=cos*=&_ z?w!AYto)28S+?-efzZ&g8!|^*RN@HVLG=$WM&a`t+-6D3TLocbO*8DOukU)^D6Ay$ zQbE&$uf{##X@P@;dYumj zPZJ&3SNJ-%}^vW+(S_i#hpxA8DkQ3ZMEHN}A;2rW-?RUyM zTARU|?n5*CCJ(n)QBzA!w#*0<)>>pF#G##tG)7HQmi+gqW5t1U3alfmVNUuCMo>~A zt|3sSIraNj+Xb!02%oLjn!etYne3Y^3YN=s!wHY_SX`6S8?)l2G?{ftD0=Az&vSO* z8Pq#C*j{Af0OS;kf#N|up@>+&AOZWW`wi>GHy8Yk2CLTiNYOlc&w(MUsT|%03db^Z zhJ|=&jnI)%AR zQxARgo!$Q(r(a=t@$-{1{QOmH)WB)5vUYxg3uQJj2D4njRFB7K5z1!I6I+Kbio9-t zHh_=bHhlAQnZwXFtY0;%{vW*QM;Vdpg!lRzaR<+j*K5nQhHuD7*f%$~ct1{EQI1RZ zmFv;Myup3Z=*;uRyW8+7dc+++{@TAR zpe)oJHs#4j0t-dEJ#vHVNnNqYNwG^HZ4eYH4*3C`;5BrL%}*oxz$@JEv9WUTawgA=Af3b z9*PJ`p_YLrhzbMif9R*Ld$uwo67S&{6G;j-hG;B>;TH9#nnd?z)U-9GF7D$6q1rB0 z^WtEdg+(-^IPgg}SGo3KAiAv1l{g(<3vUvM8(=>xFInckqqb)#g9d5e^Pz&)-p%J$ zo2U96H_TH#pKUWfZw!0f7c&PwI3_uNa+(>u@Ty_rZh3~rG(e*t(ps_^pOI5svN^0S zm1*w43TvYQ(hF34y!hTGe9{)Yr-@?C3P7fhn6UC`RR9w2;22}x0XYYaSW7E(ck{)% zZN}r;o+$!neZst3J{AC;*csfsdm5)kT`V|{(>JF>Iw~7NiR{%x!2Z4)*UM1Wa)P5F zP#0;?p}Wd+f+)^;y)%ZQ17w0!$RCuJoYHY>9tNp+zbeeu3hz$*NT;Z8XT`JH8?a(A z=y;$l8g5mvM&Lca<0Xa*hvkd2pK_Ml zCO}DUxmCYbPDUBI!N=>?NstfS)z6?Tyi-l2!0VOOyIK(T82w3O&m7uTSim#`#oQaY zFpmSclzqX0;(Xlu5wng`uul4HpEnVG9!}?j9yR_z5kB!LJ))K_JxQQR{_O&)aaL!(1&GO*ywXn4IDjX z-@*4C@7Uhh@N-jTvv=TR!(wxAwlvP!pRHJPzm3rnz9)yuR8zvTCmbJ(7MA*QGALku zbr=g}Wj2Me1?1)R+q@~7rXC*3snAG|BA3=HkyKS=>x09&Vqd|;D8T>^p+ch=lyPO$ zuNp_v4AT`p%_KL?jNE}ZgJQHda2Pf8LbmnZ6~qRZv^Whz9mmR0k~D8)7h`#mlW`na z#N$tcCpsr)39-0f=#5A`$25hTZ?~9FcJB&UKHf!E;R483)Nc@lRP?{3%e*@91@%rp zjvKftNA_)z%eCGi6cms znfFfAjXAPiNSd;iGYMaTV0;g{V~!Cvzs?=v;F$|?66Wdy%%U=^C-)WTE6?Lue)*FM zjMXz*7_>Z{C6C3Z(d00oRv*re%G6*K6i2YiFpJ3)>QhU)_5?z^++-7bZtc-OV|~^6 z{%43G>77(G)a{)hibDC=2$Oe~dHB8P;ZOJay<8AG7x+wkQ-0wtk}Du@8Pd5Ap7wXbKhr6tXOooM1dt zU6dM@{q!{WUnb#DO^1TwE;?T#{aMN*)@1I!BQPsgq|+*xt$g+fwLJj7CKAePF4W5< z7$<(u!rR{89AB5|T)d5zMh%(v_{m>eDz}f>V9VPhrjLTz^PqqD9`{cx;;Y@VTjfn* zENv{yQ2UkEbid|AgkZ^zuF^7n3e(G<2$3U)(6zi$FOEi66kjA}9yiD886-XWEB20i zw5B~(O|Ro3Lr(Lt)E+?!&5(@LgyW|J0W&%}*xw+7g>Ujcbyva+rV+ajV5*Vq`PA7#aOC!rlJev7tI^2~7WFLg%1`FT^1UVfW>nDf8{ayeXax_Pb^CP=1tS`HD>T50YGksHE3gS`tp zJ5H9gc1?h~r8dn-ximPzHlJ|)kb2hbpWG{z9y)TE0eg~VNXi@OD66f&d`@gutNlRH z^Ha7!@c3dqoCB1zjEi7nOy{45H}#M!+d{iGC==%x9&u=D;7fX~5Aq&IhjC(TwV}NQGJ1+tSQ9Ced_V=gd zXNL?<*=$2VMMI7B1X;RM2MigvBIhBGv zUX+zR>F~gfbOz@XvjTv>chQJ)#)dQ}pcPow_$U?Vo&GfivNESp4ePMJ=#8q^hLmXq zT9}E`dq$>aQs5M^;as1|DM=1#TI>Vf>PM6EIeKS3j6|*sSJb|natCt+CCP}XkyrP5 zeCwe`!b;!|O5rN!P-c4^lD5{5<8;jxZOxA!?BIz^M+I8`HCDw^M3u~i8}HnYfC@)~ zgo#Gb3k%Wl)-|D9?dr_?I7$pa5Tt$><=^V?MVQMrcPlwRWwu1!IS1LbkY-Zt&a3ML ztaxl1)`KN&s^jW~@9tYy+K4Ac$8r4&J7@&+XukXtoIKfQ^VnH8oue}|PUAB>PMO`G zW}lfG=PdD{e<>|lSgdCF47(P)-aYgRelo{J`E;ojABF60W$d? zgYX{K6r;#3g4fzatn4{Y7Aj3AIVHB1*P0zae%vutTe_q zT+w%xu*o!Fgu$e`h-CbDGuIa5V9$x!w_OTOw8U$jOCORF`AQhBA&F%%+=c}8 zQf0r|c)8B}F0ht%lnMsFL*AA}BER~xU+*E671_9{GUo}UWFTT8d8ZyDzoj{+wczsx z&Ss!!yG8MhmoQWa-O09me%Ax@AD5z1EltsKkcM1c>I7-fVwGlhFlkNWr(R{fn=48c)oY(4wp*y^UbBhdhNqgHh2vqG&uyX6-Hv ztL2(?q$}>uA8{syDG`KJSeRXs4Uigqgs|>-g0jx@_}|268g5xLTp-j?4Rlw0eg!?m zrV(2dJfUv8z;wi=xMyGKQ@BS9mjDZf6%m}N+0h+2M}K69OPQW<%UQnR2}7Kt`CG&xTZSCrp33AREsyk)bx0c`}JgYK%<| z!NOz=;r+P%<6S48egE8%mmE zNE6(HVD;?=n$9~pN=L0Y(RsE4*NrKe(edt$GaZrI%}N@z#R>>=_T8w6?(xMTVjEH1 z*aXt&g&XCRw4sWaqlYm7@^r_3^CIwBCWxbzi({v~OHR~wJ-k&m@a1GW2j+zLo*dJ` zAssXysN9vV#U}ZS8EA~BJ)6yWN)#YL-*7|buXl0}|h>yt17VV?oyE^C9Q8V{~?9vZK9L%Nv5B$pf@ny^T` zrzz)v{xi}*jK-24 z8tY6{%}RWdKh!A}ybxhEkcWc2J!EEcTJK%qxZvJ+yMeX5r0Qp=)9th#>~JNH{TQb* zPgIZB}c(seiP1NRiMdE$n41xg3!`#d1Z@Ydob7OMGpp1aHG^_fJnt#d zgAP4)mm4$XcP^EI3u274A=cPinG@IcDWjS4jA8ALCl&N|k)(`c!Uc>~oTvMTiA1D} zx`qWQ4oNG}QLD?rqs>dMvdItHreO&Iz0>D7)#5OwO37c;LoJrELoKplu-Qm`yXZ&XTtHb$d?&p1Id#Tj za-XTLWi~J(Hfc3){Sl*)58Dh%CFBLOK>28)C!|aD&lEYR_;_{hxy<8yWB+yMy#yvD z`LJb{#mIaNe=O8Iczm9%i>poK7)8mbn{Dof+PfC0CI%(w$_`F$G3fMOv@_u<9?hWp zfH|(ijF+EHF8WZnaMUMiguz$Wnm=-sR^6JKD{7!f8)7#sy%}*Q1EM7?145iDZG9`}s2g{i}jC zv)+zW`DL^)AIwq4$@u3OHPS^LFl)+(&X{Zvf^QqO(rS_9mbY6)m?0vYCnQ2!C`vtR zg$xH0erhuGC#(gQP_R;+3hgrgS=FN*t&03Ypg^f_IhD&^JEry)gA2`;`9UZBEPn=K z2T9{D*O!w&1sutnmZUSKR;Ob0Otm&~e%Nt67=<_IDkdl>J<* z65UP;^N5=`x{gYw9i2McE7df#o{=O?g%gAg(E7|twZHT$xmJ~yC{?C-)cRCGxyKA^ zAzT$B#=c+E8i^2knJeQHzAR(-y`Gq!w-W(0@*M1~0VXT?*3Tcia0c^MCNgUT?5ywz z-+oA15Gu<9f5#+~*lLrnC^yat^WzI~o0i1LylKLsqiO)YP}I5Xj}a`w{B~H?NTSgN z6SpOyR7c-DNfjRcnYHpArDO%XK$gTS1)3&7_7owP<(asVLqUL#cI)9b; z$rDa4^iX@`BazmD1y&Gp52Q}<-pfo~u4Ld^#WMxH+3Q?7j;>u_3Qbdj1 zW$u4+nKE|Cs&NAKree5wPpsbKfb6tgd1o-r*(LeVNIwxhSk+M`MhB*xib|#2v8~L7 zW}p91wuyI{bRf64E(l?U=_l*8a6RDli&l2){Zh6T<_m zPGwhz)rwb`;wm>!!|ykI9FxeBhB5?ThD|Q+n#4ugmQPR`T|Spj;vdV;ZQ5)VLde5` zQDjzd16h-$NTz)7W3P+0EeptGnoX!Q7nR;s!En-ceQZv3tIU8HIWHUG@DqxGmrM!+ zNLge#y^J_r9}?rFw3``GPMuGWsywmHKNLwCNy&Pon%N@ zS))4ecSH?|s{8JB0KsLMLu$^tHHYMT_-n#^U(U7x4B*_{o@dJ+7}Yr|7kyq1vl#tE zd3!HL{aGp}gg?7a$p?c>5Z-LUB(u#CF(r9pw1Jqc)2aa&Mjwh@<*@v!sb;9-XrUD) zQyQnT(uMV{Fi$a#P_lmi{O0T-Yz7HixQCkC$*|mXhosH7JNP6D-a+fcO$qM5C(7ak zJGrofS)HcTPUJA9MYfPo42DyErsZzr+Ya%3Bpn))Iv(wZrH4hIVuKRkGw@+VbpHA& zY256KR%HfHqLF?4BwzQ&l@Mi7p|he=bNRc_`X2?vO;JOiies8gOXk|R;*tn|*g7Rq zl6RuhMUZN&j;M(p4*=kAb6nI+BnoI@0*1Cu)j57}h^Lchxv5Q^H4;#zIlP|c{p6}E z!2p_c&wP`8LAK*GR^m-jQ<1hcZU_n-2ai9Y!njfBS*+Usw8wZc6RY4Hj1k5t9_6ue zFOI@=J9V&?Yw&b`pFwjXV_~Uf;YspW!$aiY6uKO&T1HSZtGRBaVx_t~ zjD^nRo+vNqWon6G-af)&2e;63iQ=b$j29{YMMa&3qwdK zRyjN8cABS|$E<0hW$WA!(-YLlozOTTYB8?B#|ZI6W0S^28eIw^+TMvly*M=)szb<< z!lqGE-y%bD3H>@oAWF}g z6Pk{|3KmBPo9{1JFBPb6JGclG%G2KG<#4ew!PKC3!Ko9_>Volm48OqGzbVr%$J%Q%=90jq z!OoMGCgmmP(cRZ5?J+hP5853OuAo8nR$ZE%OJMfAj%&Sa7DApLAVY!tH-vc z${M_PDa**k`x-70+mp#=`fFy(_E#VG;@=KU!H@`M$yzESHjUc_ATRdbUi9F`e&j}( zHpB0@3u#J>Tq|<>#sy;UKJ{*O0#a%_GkHV5f0zlk?p{A2+5{RjLBKV*F{#ruE#EWz0CWM9`kAQvw--JDnaz{dl3(%<0m^I8+swcS zr7tq z>wA{wb1}WMWb*Mw_w9fT1yZ9cZntRyEA!YJH;AWlu?Pr#4BkgOM!~vQoX!l2faC?B z_?K6>c)innr@jzOE&z$jMA)1E+2EON#ez94B^bpB?8=wUvP#4(=#rc9b=cw-u+b;=NMr1$#$n{FZUYt@7S8U`rF{a=_cm{b*sG4aAE6nWYIx{WANr)wN%d zuf?pgkqeVmFtpPqnJ=tkM?9Bkr|_uaywC5(1%9WbwzWE0>E?U&FWQ(lm(}Eq>?52C zt=P_9 zlQ{nTq3`^DM_S+lS4QRKVMyFLzO@ZZ#!0C0=49fKnjyRkYCIwIukr?}X`9b%jkDCQ z%4Y75Vm+MN6b;R5@HjEe-|%xhg3G2&+NzYj=T-8|nnt>liH^&Bcu&|=Y6ozQ+lA+6 zLKHR1D`sz?Xf;J32NbIk93E;`6jBbK7M}i+UTvYQim0#*G$Oplnzgkx`}*rB#v|i48U79@ zj|Z@YaPoT!-6w93X$c4Hk;b!WEv7juy!A-MJ1S3SW?H=YlF2Az>cD%xx%?Q9RTCoG zPZ5pH1wIPTM+_mq-8k$AQ`zR$UOagQ@+}Jdpm~=FA-zfgl@MwqU2TdG@>1(0<*;a; z*$HgDFwJs$lD{XfP+i0ZxjFuFvlYuxXN{(1E{XUW=_+wtaeL5~vserKAuwnFe8tVOqFl~Jn8XE%(CAuOadb%ELwv1ZT)|HK$u#(;ITe%> z_`a>DI{Es8Jeh&PuvO$uG?-q6LstUd>ne zW3Oc`N=Q)8ZM*av0hrMWM0=@WxsfFjgu#caY&b;8`BWY+8plufa3A(YC`S5-)MVf) zLm)}DhYT+QQ3YyZIgYFkpF@uTu-m(P%>Bf_t{{F1|Gpz9!#w=^AC=z`{SqLjC`NxI zwmnl`1XB1^W?!Q?FZC{5i${X$6chRT#MpEqv@Ph6Hx$C(EFK=>lL)Vpv_09jjum6~ zJCB3B^L+p_n}YhT`rmER(q>a>kIUmHY?rGvK{uI+rg^e?;ZU*^rV05aaGL9ANX8gn zJV%r!KDMwae4#$Ra$<|UTD%^|dkhFXK!eR4$G1*~du-Z0m@pH*jX4~>9{wfboq+%_ z16rVG_*O1wovt{nM&ffy+|q-VY+^Z?PmRuq%EQ#x(W=^J-kvGyoVNQ;XLP;b^>WHdZaBe^lHIO8 z51mzRb{F*34D~Be06FTI12yAHG!<^WkOaw-LViyvmZ#PB-Pf*Ic8Vt?APWb^BF!_4 zm|mRG)mnPbysh{%Xp7|P&kRO+FRyqYj*tkUd*0`nc`L{@ByY4a@^yT?=BJS)D%*BQ zKzxL`MWK(rOoWnif<>y0oYVm+Gfqg$=AL;g+Ob`0a|LsW3I#NQ3*kcsKdg_a=wUsoCERgx<03c# zNP~hjY_~!=YhoAID#6!YUhnoBa%nn&A`0-EcfS>_^-yl=Oy1B-gK{sCf5}o z*xty%&5Q&W&FdK~p!5Jj>QmX4#v=QllNghV6ikPIex>?!PEf(bT7DLnYIefjF7EPs z@@B!}AXEUCO-W)EmJAlMzyk}YO)+<^L+HCHo-xJr3XHC@#rj?@%Xe%ic;HP41(JxN ze3Q*x*c{|g8w2+DDLHltNX!kq$>9MW3eZ4&p`Mquw-^*O9 za6;HtP*U~}-38fB`L^RgRSY7`O(42EPMBr?x>a(N+ob@4CdsqH}#-vr%v8!c)aXXb zkZV2u8MxKWUgCj#Df~63<4U7j9+6d^LiT*2TC%3aJz8 zIbi=geH3VI8#Ty5*{pbzNfQIwT_^RSGcU@9SOs-ZkW#g2XCD_+H&6-0UhL-q&*1+l z$89m&qJZJ9BAdRT(WX-`pzin=PNDIoSb<_LUjPz$+POe{?W|s-)vOkKI!kiQ(^oC8 z41jDl2LL{KK8C<$EuzJP4egYD2HPGRgqsD$`kl6PEw8fFps@wpsyE&>ZOu_Y_2H3l z5|T2mK7b}X$@F3d5BibJ(|e&|^w5uZ77(XDIfwr?L$MOL?Q(|)o5Xtu_xYL8Zy9g7 zL{cb*mf8XACV{A;G5ZnSYc#zASNWx;hrP5#k3H$j`YZ)_9h6 z&gx1F+j;}QBwZml zxTcflto=x$n;G-(PW7myP$S`B7N#iyN%jf5>_F;LfNe4cR2y412Z&86#BT(T| za6JS5vKtEeX0dfvlF_v!?npzj0TRkxW0+K<_Nx(Me`-If3>^3k{*$!NF}HX_^elu7 zPM8hKV`CI;8f=Y5Nhe@WYT#e{YvvPxOxpEk$ZqY;#XuZJ&6?Dq!rBIQa336;*J_3? zA$0H?FSE3xX*iTSwf^nLo%}1zuLzfO`WfqN3Vv2Gl!SKvh2+abNb{ji+Ib}`{*aUp ziQAuCG!j0oQ|bn8u$^}Rsoi_M3z1{*ISJ7Br6^?aZv~}!OFQPjT`+{^S>^3_Km!3G z$+x@RNp&DjFSVq)%AhcTRQe{ntwCOs1BR81oK`%1+VT!2~ zIp&)nhoJoVZWL6sD_!#FHoVK#CtAAkBvL6d+AVX@N^;_QhuAmdKK~H1@$bK(#*TWZ zll_hfIA%viFbZrpBKWSqE;pi#6HNP3Fi&{e+H;1%_GzJ}mhCS&{;fyN_1$on0hNYL zG3_m%BXB8^)~oRIqaLs>+?nR~asaJ_yC8B?YqnS9Za4!-y=U-=kJXE$NE0P=&ICuS z8ltC_G^ZffVNKl{EGBW+qR%;LK54cS5N(;~4BI+7lnHz)E&U@+3lkTE2ScCiHV7I- zA6i?w*RwJodd#Ok_jo>BR1Vk2*fQ%tq2c5Jx&rIFj3L$7{wl@~hC7{gnFAi8pws-0%A&G!94NLHSpKVkXo4bBv=z?u(FgP3ZH`~(Ru7c75t5&w#Vm<&;TgEbOApSd})t2OxW%53*J76r=l$$SlHi5 zz~{Tng-jdx*;qhz%JTc?Anf?11NBC3iIr-Su_j_@ewwz2rQ=jqf1px^NspO{IaHVX zGxbfHbnK1O^9w$2xwG^b%k+fQgZ`z#nUQDLF+|_3hy`jK#5iT#4lTvE<%o+ZhUe$x z%x7BQShlUQ{{Vf3vyGs%5B@mJ7xZoj7y6eofkE4^+>7$A2`cD;s0b(U->eKIDfE4^o%=#%9zn!zBR| zJ!0XgESv+@PM9Z79o)E zGB-Jpe(v?msu=yAf*7RyaCk{pP+q2C{Qm`J8kyx_xhSVh2FbXrOb(^Hr37>(Ul}u1 zmqi5T%$d`=apT56l7)1TGThlwTEj;*v%f{8Wb@CjT$wQC1p+qGaR`E++1I(9{RU>xp|`7q=#4O2-=H}Jz5hw{Z)1{!S_ zfUoF`lVdFNC|2>vY@6EEM0|KPeB#J<+5J3NBLR9vqd$~O^ zs{OnoG%Oqf(#iz;t6aHIAJc{pAO4bSx>Wj5MpGEAS+nMD{??{4wYjFirtu(~a@x+yBg$?7)`$5HW`7OXTy0z_hQfJQ8lE}07am{5I~ogA@Y?5vFj5))DWk^4hSq< zxUdOW4{}ISMY@V_0Nq=46Xrh>qnQw(EQla%vLDPCLzHp^5ku1`0#P9F2uvmz7#&H& zLMJ~B;MfN9Y2J%5nk{VUtLQlQ;&1KSx1V2iALc(YW5vL%e63Js5?$R60|pE@%{7tI zD*|ytfQMNY(o5ITw4i=C&xr0z4_I;Y=g;pzQs-7Cm@lW5d0W72Yb1-zXbNYn`8E8R z6sAVzRRQctzfqdqRrmU@2ox#;7|suo{c(f*+Yx@gAx?vR5U5wL-mT#4yb^&lciVnx z(no~K=tzww3r6L%n-^>{PNQi{H~p_^VS1|w6e;bAnyps znGCWw-pifAGqRIcgof2bfW}lmUPQaqjL94V#*1jg-IbZjJvMTqDI!q7GX5&$+QpIX z2;E-kf|%0A6#;a44YFNqkWZdF(_(l-lF|&8h3sH?Ymm}oG;im-WU>@2QkNB@$zdGd zBJcx2B&C~v&$MaNWL=v&MWCP&;9-A>0=#J`#P4`U{%nZT-~<9JWS8MS*;VD_z;*^} zz@tOh|bhf-edn@irU;a&>@onnV$ZBLV{u%GB$+ooA#`9EFa9Oc=eMG@?wc z^^78d>!n?~bXlE|C}3pPj3(9mm;|7q@xDJ>8g>Gnw6!8v@*+5f?O^iV!ikzmjte~ zSv8s>49(;>d6T~4Dp-R4CdM^3513YyDFSgq;GYOH(IC*#JR|!V;z}-j~f&hpEX|Br*q&h{Qpb3m%#{EXa>8lK7k%O_4Tn=B8=QnqPsoV_$our17)U(6oD)ufF8dH>$eQ-_n~3Y*AQ1s!L?W&^DqVK7_d;XCUZ={w1Jc5 z+-QoVbkj$n6psXyx=r1>b)TIwWr`dnr%n+lWCUdAifLc^5S|g|wTguV2CYolLi)#m zGXKoZpFmyufcYhp<;7@9?rYbsy$Gc+oi~^i(CdP?^zI!ycFf800_Zwx4vY?VBbR_2m`=|d&Uo6&6Dy7jL}-Vbkj(`GCf z3U?0cx=zVRq>+k1{1Lbg5f>Q5yo`p07|)_|vdfR>_umvMsQnp&!5o_}P=X2_iM)x~ z^y@<~yPr2!&}9lCvel%DKr{$oJfyW`Ito#`=S8(*M3xQG!hD``2U?HHOXSn3Q>R`N z4f?^ji#fB-sN68q9= z++0j6^VFc2V zG6*7z-Oo0}6+|%Om`5Y%kPyPYz=>%iLZpu@X|2dOMZk!K>(X=&d}sl0q8k_|y*2_- zN|pr}HlgsQZGPFtWp6Ur!6TE2gnj4{o{OMC=wwztn~*L%*molA8@$*4>xG1OLzYG9 z>EeFRb1mO2m-Uo^mQaDqcl1Vkvm-E2Z!~IrVr4X?i%pAhECBBjqM)bJgnuMN`jSqH zg0=^M*(D7^^};tnA7!OSP8|5lB!_8o^l!*=K~4mTC=(`XyU->72zG6Pumq147|h+} z)8IkUXCqCljHVP&cKg(;SMO6U+XgIfIa{j^r78b*!1N`ZOpRuZ>d&><XFcyF#67 zNV3sJG6C`%45#VS86HXU7lgrVj=}r@3APC;1^ReAy+_lqMNqb((#2v-GqnV*TD6+R zo24&df!1%5t}aUT93N)$>gJ_prPqo;><~bAWhlV3)1@wPU1KM-hd_y?MY2^ijKLfh zH-jlfjh)dHp_mvN#~bD{xenq`yry;P)EUieUAG|VHH{*WPXy$pPyX+C$gq~MZ#}|e z6(nb4(w%-5p=69Ys2j(J83WsZpqbjFi>1*N!Fj_B!*GUamP_~kZD#E{3qN&=K!G73 zXV1<_k$FAW{V}LAArxCTa^%R`oQ)}m35Pk2Y&NH%^_34Z#<8HW8`De$Y39tC4Vl!D ziJ@In!(Fa1yg#td{da8J)X5DC;J|BB$gZ*=Eftb7^iPg*%ekX2T9E0V@$&yVa(tR| zA>1;o#Z37l$a#`mvj3;1%q#HwFeee)vc}qI3Y2r_&TZ4MVZ)E8h%WyRt@G8_D^{%7 zr+xeO1u=l`Tslpl2*dz^uuBFh!aDp>G?ZSBL2-;C#I}20C9!;6uDrbbFy204PBhuJ zQKLq0(p7I(#aI6o0YxA>1ehrwLc=ET8f%e+XIyst#M)qroUu2WA|x~FU$czpC@y6n zJdmS8cVhX&m^pLiv<}2T6Db0UfF}a9Fo*JNnP&Vw)1(JtFlDCv-t_P|-WP~yeuuzJG@&A(2vj0aR#vt#D^wojxf&P}k{5;z8y3pwhRok7 zdF;nD(@Vo!?OG~naC*4QJ;wJ3TCV#i_Po0!Ra!+r5deWPW5(3!)vK3G`t%C}2+!gt z7~Xwz{hgmMG8dfDl)_>-@1e57ZYTR0R{JxCGBpf=+I$77$&(+TaZQ*kZLjT{1D?Pr-lUVmx_vt16hbWIV2xVt_YL_0*PgSa)|ID zVG2wO^E;LT?#)ub)U~K#SmrEk!Hj99A+q7FyY4yz;76u~yWY0t^P%ryfcJMzsPu|J zsUaZC|LB>GiNIj~#8&D33(;Uoofm3Lvr=DWyH?k(U7w>84-cupauC8MdfnW0;YRHmNC znKxC`jN^&`>znssDC`BEvF2f9t8UI4^f7CVamaCwFG}aoVQ2Xmaiy`rW95T zC)+Lm6Ge*?cJJbkp}W3Nc&k$cN)Q3rM}7^@)8GioKA#rmK`ikzeLOCLEON)9XpE*n zmguTKLq&%ju#o=;S2nD3%blrsety zhWK9ja8!C;dano+5(0F`k7GyN=g1t1!Q?r6f^C)u7PG;W`YrmFW|b1NKzCodAF^jQ z)B@cqe*AyMGKv#eMj=Y4P7x>=1UMRTQ$CY@FV8~Y&r+lp7K3>s4U}ur!;A60WQ?X% z9$Ue-WhsU19_kWNWv)S4u0&bxg5QRScq$u3AZrM)8e|W2_HmwpEh5T9wjiI)n&v1b zULz7IyKIWSd!7oPEPY^rdUurOlhp7K*Y#1pp>)^fQyQCx;G;&fK3 zs0=30(Ne}Qe_u)lQ!1&XjHVP=zB$B4*7{K4avoqL4kbK*uKyI2vcH^W9SKuqq6kEU z0Fym?a{lEc^i;afwWDCm^D~VlMSC)S`BoJC3W-NabG zAj%G+wh?kJN3m|5H*elevP&sKzRF4wutI>b%RfMPKfa??0z0Dh=ye%m_%}jcvSauq zZ!|?$m>~KM6GXCSeGfa`v8MWlF`o-du?u63kP=3U0NWrtvF`E?bh&Soj4_t7?(zf- zrko~L(oV7uVY8i3n^iGsR;NYkoaEDV080Xh$DZ7X9b4Utvm+ zAacNq4MX1KyHTbmP|z*2Q8pA*4mrMtH~MSY;IBN32LW1^TcU^8;rmglZ1fUkhuh`o z;@$8s+1YVFjZvfNhY<0J^=@*^+$k31fk;r+kMP&%OnV^siaL?(He*?wEKENcpN(FR z;5V7Y>it-IIazMhnGsNq-4GW)&o*@y~4aZz<^@{2%ez)Uok=zvoOjlc6+_ji!`pGy~!&W1Seze~^6pfGlj2 z&0#iQ#+V)~_Hznt0Vzg0SxwQufBz#{VKE53ih7epHOOdL{z`zH&UGLEI(AtN9se6O zn*JCWDJD#qP?v3zSD@rqLsZ{L7(oPzz8p3WGw$>t>pZ7Kz*1Sn00CaUEfC{G{DtUI zRwf%$i-{h+f)1UF4*i@OuGjVmsL`~?%1DXgcO`NtN-z6;v+hv*56Nr9^5x5)?$Dvb z%B*Lo8AOf%lRNv+syvf=JO<`j{|W#)^F2M5K`e25G4jHc7(+Fh5mq=$LJs0V7zWGj zB4lf1#e*O_i=N8Uk{72JSF=9aV<1Vb(J9X8bi8i1(Qx|%|Bb_Q zb>{GSVr%YyoKtE7YXsD2T0<3%kWUV5&pC&K;c^r{FSuhozbEh4#q-IJu{wza62V<9 z#;|*m{7_nyhw{HWK9WyK1Q6+KT9((*vV4}bx`ZeIfG$b$^6{zs03j_(*&Wt4pP*2G(sLL* zY}l|TS?4KZnCfzXfEvvlfb5lpERH9oUt2T<05euN*-^?1fZKWg2&wJd@z zNhhaV9eCh@J$S+G2>^RiPhu=P#sLiK=X>P2`O{B7eXLKPJ{570sgz_;qnYR0ruDJ| ztryu}d_1CLYkzT&Qm*6S`~tcDEB}m@$@OGr=9dIv7UwkbdE55w+iycX^q{OgD5rG0 zcjteTILVD{AJQwhWBBmlFKWv&e>I~x*(D|g0s!T4-P8Fs+;fOs2xu9gCM%9bHey4^Cd za|hoS{~!aMM&$?rHJUjB+BTcSy1p}@AHV~h&C`@@MY5v9fUZQ|8T?Nt!3?gaW0+*C z-U7lFa=l>X%9RVVaSFJsjoo(JZCh|Eek<~AiI@L&bges+e;4xa%zYQGTj2}EtwQcc z5O%1pdWct*snLvAeI%txoE(1$5Br$}9){29TF;~)5no^kWZUOL@sv%*QRQf|HC$Kz z%RSd}7;ZWLwfUDl{q?x6&$SF+)aSY$*Ru9eHV=rAY|4MJ=(4onNAQw)ycmZoF8kmV%dShZ0}J#bbV>1 z9Drm+(S45(!da7K3U&50b@nt9J5#fki!#m{0%|m~25s&bvsJStV_-+~ARdR`mz?vp zGbMM0E})z+lHVfk)0|^DQqMvypo%kysz%cQOrZwL@na1dG&lz1DJSdfOF43VSVW;h z7p2_T$qkcW_!=*>XPD6WJWA%uE58V+(abOYSGBPv@1o7W)H09ypgF_iMn z`btANYSgHYb??3{bcIc)MzgT%FO2lH7A{=4og6@c@vPcky+s&?#hexcDceWon7zuq z`Fv{RlWZ*1FJ=sjrEF?6i=`$bC1;ZQ8W@ zty;B`12fuUsM=zv#E7=yUQTanj=_@uCd4)3x)J{k`In_pb-0!_rd3|L!xhBI;mGTV zlRfEjFv!ZpzZkqFT+4W)%w8|zdLH@x!bwK+SQj~$ZuL^a)hPmsfFhs>C<2OrBA^H; g0*Zhl5OW0n57u#AN>${IqW}N^07*qoM6N<$g6(G=v;Y7A literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/video-inactive.imageset/Contents.json b/Signal/Images.xcassets/mute-unselected-wide.imageset/Contents.json similarity index 84% rename from Signal/Images.xcassets/video-inactive.imageset/Contents.json rename to Signal/Images.xcassets/mute-unselected-wide.imageset/Contents.json index e4fb17f90..33353ef80 100644 --- a/Signal/Images.xcassets/video-inactive.imageset/Contents.json +++ b/Signal/Images.xcassets/mute-unselected-wide.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "video-inactive.png", + "filename" : "mute-unselected-wide.png", "scale" : "1x" }, { diff --git a/Signal/Images.xcassets/mute-unselected-wide.imageset/mute-unselected-wide.png b/Signal/Images.xcassets/mute-unselected-wide.imageset/mute-unselected-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cb2cda31aeb8a4ed382e6aeec1e578830717de GIT binary patch literal 20266 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 I%Q^c00076l3jhEB diff --git a/Signal/Images.xcassets/video-inactive.imageset/video-inactive.png b/Signal/Images.xcassets/video-inactive.imageset/video-inactive.png deleted file mode 100644 index b33b2e3fca06b5945b0090d71eb4774791674c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11829 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 diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 1bcaaa5bf..326d75cd6 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -317,7 +317,13 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; */ - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler { - DDLogWarn(@"%@ called %s with userActivity: %@, but not yet supported.", self.tag, __PRETTY_FUNCTION__, userActivity); + if ([userActivity.activityType isEqualToString:@"INStartVideoCallIntent"]) { + [[Environment getCurrent].callService handleCallKitStartVideo]; + } else { + DDLogWarn( + @"%@ called %s with userActivity: %@, but not yet supported.", self.tag, __PRETTY_FUNCTION__, userActivity); + } + // TODO Something like... // *phoneNumber = [[[[[[userActivity interaction] intent] contacts] firstObject] personHandle] value] // thread = blah diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index fe74cf6d6..3d553d39a 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -1,14 +1,16 @@ -// Created by Michael Kirk on 11/11/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation import PromiseKit import WebRTC /** - * `CallService` manages the state of a WebRTC backed Signal Call (as opposed to the legacy "RedPhone Call"). + * `CallService` is a global singleton that manages the state of WebRTC-backed Signal Calls + * (as opposed to legacy "RedPhone Calls"). * - * It serves as connection from the `CallUIAdapater` to the `PeerConnectionClient`. + * It serves as a connection between the `CallUIAdapter` and the `PeerConnectionClient`. * * ## Signaling * @@ -119,7 +121,7 @@ fileprivate let timeoutSeconds = 60 var incomingCallPromise: Promise? // Used to coordinate promises across delegate methods - var fulfillCallConnectedPromise: (()->())? + var fulfillCallConnectedPromise: (() -> Void)? required init(accountManager: AccountManager, contactsManager: OWSContactsManager, messageSender: MessageSender, notificationsAdapter: CallNotificationsAdapter) { self.accountManager = accountManager @@ -608,7 +610,7 @@ fileprivate let timeoutSeconds = 60 call.state = .connected // We don't risk transmitting any media until the remote client has admitted to being connected. - peerConnectionClient.setAudioEnabled(enabled: true) + peerConnectionClient.setAudioEnabled(enabled: !call.isMuted) peerConnectionClient.setVideoEnabled(enabled: call.hasVideo) } @@ -713,7 +715,7 @@ fileprivate let timeoutSeconds = 60 * * Can be used for Incoming and Outgoing calls. */ - func handleToggledMute(isMuted: Bool) { + func setIsMuted(isMuted: Bool) { assertOnSignalingQueue() guard let peerConnectionClient = self.peerConnectionClient else { @@ -730,6 +732,34 @@ fileprivate let timeoutSeconds = 60 peerConnectionClient.setAudioEnabled(enabled: !isMuted) } + /** + * Local user toggled video. + * + * Can be used for Incoming and Outgoing calls. + */ + func setHasVideo(hasVideo: Bool) { + assertOnSignalingQueue() + + guard let peerConnectionClient = self.peerConnectionClient else { + handleFailedCall(error: .assertionError(description:"\(TAG) peerConnectionClient unexpectedly nil in \(#function)")) + return + } + + guard let call = self.call else { + handleFailedCall(error: .assertionError(description:"\(TAG) call unexpectedly nil in \(#function)")) + return + } + + call.hasVideo = hasVideo + peerConnectionClient.setVideoEnabled(enabled: hasVideo) + } + + func handleCallKitStartVideo() { + CallService.signalingQueue.async { + self.setHasVideo(hasVideo:true) + } + } + /** * Local client received a message on the WebRTC data channel. * diff --git a/Signal/src/call/NonCallKitCallUIAdaptee.swift b/Signal/src/call/NonCallKitCallUIAdaptee.swift index 462821e55..3f5a39742 100644 --- a/Signal/src/call/NonCallKitCallUIAdaptee.swift +++ b/Signal/src/call/NonCallKitCallUIAdaptee.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 1/3/17. -// Copyright © 2017 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation @@ -70,10 +71,15 @@ class NonCallKitCallUIAdaptee: CallUIAdaptee { } } - func toggleMute(call: SignalCall, isMuted: Bool) { + func setIsMuted(call: SignalCall, isMuted: Bool) { CallService.signalingQueue.async { - self.callService.handleToggledMute(isMuted: isMuted) + self.callService.setIsMuted(isMuted: isMuted) } } + func setHasVideo(call: SignalCall, hasVideo: Bool) { + CallService.signalingQueue.async { + self.callService.setHasVideo(hasVideo: hasVideo) + } + } } diff --git a/Signal/src/call/PeerConnectionClient.swift b/Signal/src/call/PeerConnectionClient.swift index 6d8dcd004..f264d69a0 100644 --- a/Signal/src/call/PeerConnectionClient.swift +++ b/Signal/src/call/PeerConnectionClient.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 11/29/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation import PromiseKit @@ -154,7 +155,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD public func setVideoEnabled(enabled: Bool) { guard let videoTrack = self.videoTrack else { let action = enabled ? "enable" : "disable" - Logger.error("\(TAG)) trying to \(action) videoTack which doesn't exist") + Logger.error("\(TAG)) trying to \(action) videoTrack which doesn't exist") return } @@ -198,7 +199,7 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD var defaultOfferConstraints: RTCMediaConstraints { let mandatoryConstraints = [ "OfferToReceiveAudio": "true", - "OfferToReceiveVideo" : "true" + "OfferToReceiveVideo": "true" ] return RTCMediaConstraints(mandatoryConstraints:mandatoryConstraints, optionalConstraints:nil) } diff --git a/Signal/src/call/SignalCall.swift b/Signal/src/call/SignalCall.swift index 18343b78f..98bb18b56 100644 --- a/Signal/src/call/SignalCall.swift +++ b/Signal/src/call/SignalCall.swift @@ -19,6 +19,7 @@ enum CallState: String { protocol CallDelegate: class { func stateDidChange(call: SignalCall, state: CallState) + func hasVideoDidChange(call: SignalCall, hasVideo: Bool) func muteDidChange(call: SignalCall, isMuted: Bool) } @@ -37,7 +38,12 @@ protocol CallDelegate: class { // Distinguishes between calls locally, e.g. in CallKit let localId: UUID - var hasVideo = false + var hasVideo = false { + didSet { + Logger.debug("\(TAG) hasVideo changed: \(oldValue) -> \(hasVideo)") + delegate?.hasVideoDidChange(call: self, hasVideo: hasVideo) + } + } var state: CallState { didSet { Logger.debug("\(TAG) state changed: \(oldValue) -> \(state)") diff --git a/Signal/src/call/Speakerbox/CallKitCallManager.swift b/Signal/src/call/Speakerbox/CallKitCallManager.swift index ee8f9165c..ff75d6af9 100644 --- a/Signal/src/call/Speakerbox/CallKitCallManager.swift +++ b/Signal/src/call/Speakerbox/CallKitCallManager.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 12/13/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import UIKit import CallKit @@ -48,7 +49,7 @@ final class CallKitCallManager: NSObject { requestTransaction(transaction) } - func toggleMute(call: SignalCall, isMuted: Bool) { + func setIsMuted(call: SignalCall, isMuted: Bool) { let muteCallAction = CXSetMutedCallAction(call: call.localId, muted: isMuted) let transaction = CXTransaction() transaction.addAction(muteCallAction) diff --git a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift index f12c847dd..ad8d7a9b8 100644 --- a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift +++ b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 12/23/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation import UIKit @@ -99,8 +100,21 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { callManager.end(call: call) } - func toggleMute(call: SignalCall, isMuted: Bool) { - callManager.toggleMute(call: call, isMuted: isMuted) + func setIsMuted(call: SignalCall, isMuted: Bool) { + callManager.setIsMuted(call: call, isMuted: isMuted) + } + + func setHasVideo(call: SignalCall, hasVideo: Bool) { + let update = CXCallUpdate() + update.remoteHandle = CXHandle(type: .phoneNumber, value: call.remotePhoneNumber) + update.hasVideo = hasVideo + + // Update the CallKit UI. + provider.reportCall(with: call.localId, updated: update) + + CallService.signalingQueue.async { + self.callService.setHasVideo(hasVideo: hasVideo) + } } // MARK: CXProviderDelegate @@ -139,7 +153,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { CallService.signalingQueue.async { self.callService.handleOutgoingCall(call).then { action.fulfill() - }.catch { error in + }.catch { _ in self.callManager.removeCall(call) action.fail() } @@ -243,7 +257,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { } CallService.signalingQueue.async { - self.callService.handleToggledMute(isMuted: action.isMuted) + self.callService.setIsMuted(isMuted: action.isMuted) action.fulfill() } } diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index f3cb002ba..05cc90651 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 12/13/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation import PromiseKit @@ -15,7 +16,8 @@ protocol CallUIAdaptee { func declineCall(_ call: SignalCall) func recipientAcceptedCall(_ call: SignalCall) func endCall(_ call: SignalCall) - func toggleMute(call: SignalCall, isMuted: Bool) + func setIsMuted(call: SignalCall, isMuted: Bool) + func setHasVideo(call: SignalCall, hasVideo: Bool) } // Shared default implementations @@ -93,7 +95,11 @@ class CallUIAdapter { adaptee.showCall(call) } - internal func toggleMute(call: SignalCall, isMuted: Bool) { - adaptee.toggleMute(call: call, isMuted: isMuted) + internal func setIsMuted(call: SignalCall, isMuted: Bool) { + adaptee.setIsMuted(call: call, isMuted: isMuted) + } + + internal func setHasVideo(call: SignalCall, hasVideo: Bool) { + adaptee.setHasVideo(call: call, hasVideo: hasVideo) } } diff --git a/Signal/src/view controllers/CallViewController.swift b/Signal/src/view controllers/CallViewController.swift index a4034f679..87bbb70de 100644 --- a/Signal/src/view controllers/CallViewController.swift +++ b/Signal/src/view controllers/CallViewController.swift @@ -281,15 +281,23 @@ class CallViewController: UIViewController, CallDelegate { textMessageButton = createButton(imageName:"message-active-wide", action:#selector(didPressTextMessage)) - muteButton = createButton(imageName:"mute-active-wide", + muteButton = createButton(imageName:"mute-unselected-wide", action:#selector(didPressMute)) speakerPhoneButton = createButton(imageName:"speaker-active-wide", action:#selector(didPressSpeakerphone)) - videoButton = createButton(imageName:"video-active-wide", + videoButton = createButton(imageName:"video-inactive-wide", action:#selector(didPressVideo)) hangUpButton = createButton(imageName:"hangup-active-wide", action:#selector(didPressHangup)) + let muteSelectedImage = UIImage(named:"mute-selected-wide") + assert(muteSelectedImage != nil) + muteButton.setImage(muteSelectedImage, for:.selected) + + let videoSelectedImage = UIImage(named:"video-active-wide") + assert(videoSelectedImage != nil) + videoButton.setImage(videoSelectedImage, for:.selected) + ongoingCallView = createContainerForCallControls(controlGroups : [ [textMessageButton, videoButton], [muteButton, speakerPhoneButton ], @@ -335,6 +343,7 @@ class CallViewController: UIViewController, CallDelegate { func createButton(imageName: String, action: Selector) -> UIButton { let image = UIImage(named:imageName) + assert(image != nil) let button = UIButton() button.setImage(image, for:.normal) button.imageEdgeInsets = UIEdgeInsets(top: buttonInset(), @@ -513,6 +522,9 @@ class CallViewController: UIViewController, CallDelegate { assert(Thread.isMainThread) updateCallStatusLabel(callState: callState) + videoButton.isSelected = call.hasVideo + muteButton.isSelected = call.isMuted + // Show Incoming vs. Ongoing call controls let isRinging = callState == .localRinging incomingCallView.isHidden = !isRinging @@ -573,7 +585,7 @@ class CallViewController: UIViewController, CallDelegate { Logger.info("\(TAG) called \(#function)") muteButton.isSelected = !muteButton.isSelected if let call = self.call { - callUIAdapter.toggleMute(call: call, isMuted: muteButton.isSelected) + callUIAdapter.setIsMuted(call: call, isMuted: muteButton.isSelected) } else { Logger.warn("\(TAG) pressed mute, but call was unexpectedly nil") } @@ -608,8 +620,12 @@ class CallViewController: UIViewController, CallDelegate { func didPressVideo(sender: UIButton) { Logger.info("\(TAG) called \(#function)") - - // TODO: + videoButton.isSelected = !videoButton.isSelected + if let call = self.call { + callUIAdapter.setHasVideo(call: call, hasVideo: videoButton.isSelected) + } else { + Logger.warn("\(TAG) pressed video, but call was unexpectedly nil") + } } /** @@ -627,18 +643,25 @@ class CallViewController: UIViewController, CallDelegate { self.dismiss(animated: true) } - // MARK: - Call Delegate + // MARK: - CallDelegate internal func stateDidChange(call: SignalCall, state: CallState) { DispatchQueue.main.async { self.updateCallUI(callState: state) + Logger.info("\(self.TAG) new call status: \(call.state)") } self.audioService.handleState(state) } + internal func hasVideoDidChange(call: SignalCall, hasVideo: Bool) { + DispatchQueue.main.async { + self.updateCallUI(callState: call.state) + } + } + internal func muteDidChange(call: SignalCall, isMuted: Bool) { DispatchQueue.main.async { - self.muteButton.isSelected = call.isMuted + self.updateCallUI(callState: call.state) } } }