From 1c833119f91ba98fcd3bca7d4cb945e3542017a5 Mon Sep 17 00:00:00 2001 From: Rodrigo Azevedo Date: Thu, 1 Nov 2018 00:51:44 -0300 Subject: [PATCH] Recovery Docs and rename to Wiki --- README.md | 12 +-- wiki/accounts.md | 80 ++++++++++++++++ wiki/android_notification_example.png | Bin 0 -> 21311 bytes wiki/android_sip_background.md | 79 ++++++++++++++++ wiki/calls.md | 122 +++++++++++++++++++++++++ wiki/installation_android.md | 62 +++++++++++++ wiki/installation_ios.md | 66 +++++++++++++ wiki/ios_push_notifications_callkit.md | 55 +++++++++++ wiki/settings.md | 32 +++++++ wiki/startup.md | 19 ++++ 10 files changed, 521 insertions(+), 6 deletions(-) create mode 100644 wiki/accounts.md create mode 100644 wiki/android_notification_example.png create mode 100644 wiki/android_sip_background.md create mode 100644 wiki/calls.md create mode 100644 wiki/installation_android.md create mode 100644 wiki/installation_ios.md create mode 100644 wiki/ios_push_notifications_callkit.md create mode 100644 wiki/settings.md create mode 100644 wiki/startup.md diff --git a/README.md b/README.md index 2b26e10e..11807a61 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ A [PJSIP](http://www.pjsip.org/) module for React Native. ## Installation -- [iOS](https://github.com/datso/react-native-pjsip/blob/master/docs/installation_ios.md) -- [Android](https://github.com/datso/react-native-pjsip/blob/master/docs/installation_android.md) +- [iOS](/wiki/installation_ios.md) +- [Android](/wiki/installation_android.md) ## Usage @@ -92,10 +92,10 @@ endpoint.addListener("call_terminated", (newCall) => { ## API -1. [Startup](https://github.com/datso/react-native-pjsip/blob/master/docs/startup.md) -2. [Accounts](https://github.com/datso/react-native-pjsip/blob/master/docs/accounts.md) -3. [Calls](https://github.com/datso/react-native-pjsip/blob/master/docs/calls.md) -4. [Settings](https://github.com/datso/react-native-pjsip/blob/master/docs/settings.md) +1. [Startup](/wiki/startup.md) +2. [Accounts](/wiki/accounts.md) +3. [Calls](/wiki/calls.md) +4. [Settings](/wiki/settings.md) ## Demo The demo project is https://github.com/datso/react-native-pjsip-app. And you will need a SIP server. diff --git a/wiki/accounts.md b/wiki/accounts.md new file mode 100644 index 00000000..d50b484f --- /dev/null +++ b/wiki/accounts.md @@ -0,0 +1,80 @@ + +# Events + +All interaction from javascript to pjsip module is asynchromius. +So for each action, promise will be returned. + +# Create account + +``` +let configuration = { + "name": "John", + "username": "sip_username", + "domain": "pbx.carusto.com", + "password": "****", + "proxy": null, + "transport": null, // Default TCP + "regServer": null, // Default wildcard + "regTimeout": null // Default 3600 + "regHeaders": { + "X-Custom-Header": "Value" + }, + "regContactParams": ";unique-device-token-id=XXXXXXXXX", + "regOnAdd": false, // Default true, use false for manual REGISTRATION +}; + +let endpoint = new Endpoint(); +let state = await endpoint.start(); +let account = await endpoint.createAccont(configuration); + +// Do smth with account. For example wait until registration complete and make a call. +``` + +* There is no change account method. But this functionality is easy to implement by calling delete and create account methods. + + +# Remove account + +TODO: Description + +``` +let account = ...; +await endpoint.deleteAccont(account); + +await endpoint.deleteAccont(account); // There should be exception, bcs account already removed. +``` + + +# Events + + +## registration_changed + +TODO: Answer how much times it will be executed during lifetime, with examples. + +``` + +``` + + +Example: Forbidden + +Example: Invalid host + + + +.then((account) => { + console.log("Account: ", account); + + setTimeout(() => { + endpoint.registerAccount(account, true); + }, 10000); + + setTimeout(() => { + endpoint.registerAccount(account, false); + }, 20000); + }); + + + + diff --git a/wiki/android_notification_example.png b/wiki/android_notification_example.png new file mode 100644 index 0000000000000000000000000000000000000000..77a3e29f114a8d355faa1aa7aacb57dfd1ad0273 GIT binary patch literal 21311 zcmaHT1yogEw=dEif`BxLgmibOG}0~7Al)q`ASof;-O?S>NOyO4cfG~``@VbM8{^)m z4n3T+_da{CHP@WKn9E=VISCX*JVXcx2$YYKqMsljAZ5YpE_g`rclU;3H2CMOgP6L5 zlC`mev%Z}Xgpi^27bB97mii_}pN#YkU2Xe}cp)I5D9n`A9n@uIxDBi=>GfZZp?9&g z0cS%%@Cvxt=o?rVIgorYGBLB_BRg(vB_lC2EDCKq6vo zXGFqA&qim!$jn5-!9~x+#>T$ zKZ%O}`@6tTd}O8$4mR8j49?EZ^v*2w)^;WgOk7-C42;YS%*=G)2s(RLD+hfSIxG8k z|G9#wk-dSPnT>;)wH3+B74^SZJ38=@fjj-zBUsw}*JZ8j|2<4#z!+TgZ5Wv78DAdh zKL^Un{{IiPwEVB5?HxWD{rCO;j~BLAcC|5L_+(^n?PzBJCeHZX%U9WOi`W_IJ6PK( zTU&qq&nPOGT02NB0@||VjM!Oq9Wq#qO6Rf>?~X?Vyyo;SJc|T(bCAu;XmgZ{`a|H zivE{#U&6uC27I%qk)4^7k)gPqwI#_vkIilNKimr&D+i|tD-$EQ9@qbTFaJ8%@PEIT zmvjH;=U@Og!|*b>|JP*y=PeLHFE9Tqbioh*75qk4AmZ&nXzQ=EPC-D(mwgl!Qg)d; zNP%-v5xeUi7eOqjiiDP=%7BJvBfVG>d*!1dTAm&R`JpI(zoE3D^o`;{5Q%D=O5(Q* z$>U~!IY@s&cyfP#tefYi%GBq@c{^)6>%D9K$n6C#`&;le92= zj&Q#SfhU)Ce*`%vu|QP9T-l_lQk};6TI=VFad~;()6N{}xMTuYJ-y{PUANs)3F6D^ z>sH(K?wN7}99ngo{i%|*Y>ig0M{t<9nAp#i&S1>eyS<_>6jbQ&(C-mUOiZk;kLCGq z$+@{T>lvQh+}zg2e=+EV+aE2|SH{JuSy|EN!MD0y?v=GZX;vB!ws_t*G&bU3VMRjb z1=TwrFKwr~hr<)pTFyHSC37VtB+%2-!*Vs$*VAd$9NccFZ3}+LsUmlMn;B8p|YYtxt+TDjE?i-WS)FlZ?9zH z$<66HL+is?lk5491dIUh!|G`gu0-?8y~$;d^RUQdK@zItHWRDm7SFqjT{twN&ODVO z)e^-l@f(|V2Hhr?jozQ3p~wrgA`gAhl=g+a+A6dHdQ-*U(UV!tqPU$L9gRfWs36)6 zzC}hxo*dRLXBL%e*MBKHFrUb0az0wv8cd?me9yosA4W~D*Mi(^`%9J9n4XA;NZEX6 zB!hsGf}-W59f`wwDTYUs1U*KtP2JViH3XaPZY_i%M!q{BHz&t(scBXaa%+3rdcMZ; zZwz$={~gt9$ho2eUbsPMXlUHP4%eV%Fvzx_m;VHnm6i1o{ERZh!Ntw@cd}(P?2XJz z^TMmi!jwtoJZlh|m7@=HYx84WAwP@qXUA^$ivlmO$hFblEdF z6nvDV~ImuG*!eRSjn#`}8N`+2U~0yaD6krh4=@2BU<7iDE-b@lkzx3PbD^WJ-0&6*Ud z6MJ6#^i(R2{mjaSw~M z02T$WSgST1i;6v1FzuhgutTgiUIWk3Rl;VqfNS}A-vQ^;{pz6J^ZrVs(ijE~uCbvZ z3jT?miOF_*D5dckr_t$fuGRZF$-1S0p4P7XkPD8}X=EE5^`8A%vPFgs$#%HZ{jdwntxsI4zrjlrf$cRr2i-ohy3DwF3*890liIT5P`4rvD%sV_;iAMcXmwo8ITbX@1E|D zW21OHZfw9RIONRsi3YIL>+zaELuadFk<(W)(`uTD-FbxX8N@7iu`nGnRE z7|bUNjgld!r%JSN5;>;X9v>d+rm{t^E-uJ%p77E#>F-pO{DkO`M7{aWSLny&3pK0F zp?}5lNRZ?kX8!iKcc5`*ciT>JcDvYl72>crQ6S_8i~Ncpk+2=h6)}a;e|Ib=BvxAT zb5LHY+g>=&QMwrQYWBzIgZF&RO--=KxQxaFxcO_{VfaMc3cX;6^qO3L!Y4OeFS%D% zR-T`qzu8oP?G}xs_vNId>=9m@DA%gB8cgB{%p{4WOm+D(oXU5H{Fg*zSBDNgh1>Pa z(9Z!k#q;rU`oZ&jkYn=w-M9EO_oI4{rkK1fWdwM`6x6FPp95)v#6|v+xw}B ztP;#a1OZnRX;(i(Ym@D|_?uD(%ByFP13{H3629npE46Ank|$4mBhSu^2+f{xvozqc z`y*if_swjqK&nAxsYg*`qkFaaq!funm{f`OyNelvi00F7{9fA5ah74;^F`<7StGOj zc2JK_FF_4)v$Lx}oNe_MfbrYozuS3N6^0%8L zXw;{t>sFCNSd-CD${QQ>`A+6XXSP$KRF;5DJY$CA{uB~6EvNHQGGeRKAzm%YI%#x~R=J3{I4o4|&d!c_ z7#<;)ohWad;OF)_d}I|T(kd_a^pWhVT-yU=Ss*Ec*Iku;i} zX6P_P68qEB)sq;6h7z~KPGnphhe0>;zS=yd01Zw5?y%+Jl!?Sfz5VtX4l$gTx_1VJ z#sFKq7h2tVIM35nZ7T*QcLK;b#Tu0dl6LVlyu2PD63u^ndS#_mZT=>7ti{vaKkHP* z#p4E|ku-Zp9@~Xp56YNgEwo;mvcsNgGwe6R}Y#!RN#dU`0?*|AUIlH?Lu zgBwHqm}{LhNT{OQ_L(Ig_w}Cth8cKFuMp#Y;lEk&Gshabxv!qq6$!(&cB9w=Yb@3C zO5<{gVaEont~v_8S!ua?Q2F&*UShS2x<;Bhu~;^VT?7CZeh*Fq^ZhiLPnI4z6)~H6 zvfou4ZT~n%t@r+Xhh#+S2@MNt9{PpL*u&$2rmX2xqm$(WL-O4pIO3U~8-f6L*xB1h zM@3!4d4355Nv-8(Ed*SY*;&6tvpS#u_218kqZIkq*r4gOfxX;rP?l4nrXSC7Q}k1% zS5*?L2aEsDVuMR@8?l#wu1^GVoIXq7|llb0QKX= zs$E*jMH;n}nkl^i6E!$9Gc)YW)fj=t3#A2aE460-@uPX7lirCr7i*|rhBh&YiRR&X ztK?EJu2|c#X4!s_B6gR%<8Vf|ZBS@UAmyOov$Nu)u|J;mGl&Qa{|?3LVHAJM_!*+4 z#-Ilk%9k8+od_g)RsxSu#+-`7x#~*o>;}hu{>up^gE2cGcoydyN(%N@=*yCXUm2zfy_82o(jTE9VNNx)Cm> zK@A$~{`mHd;`A*Wf#-*F06yDA5D*ajU{UNwvVCHih&@jJV7wF0*N46v>*;|*V6$Fo zS}U$6p*B71KojuqD%b+Z?YQ}RiCQU__pJBbmP{?kU*mc5*E^$779BJtTD8U_f+SHB zpFj8sla)k%Q;$gN|3&A%7EJm3VXZ6VGOi&V<{2!N0u%R87iD?%28RL|x}pfH#fH&W zUU$2BEG9!I_I*+BPppoYnoR~1-?s>oN zz^gGpw^0n-*f8WYo~trbSJ%o_WF1K1!FdJO$Hf2bl8Is+_M)hMQcxe@^vnH22@3H0;-~-;{Ek;o&j!?ka#n@bx z#c~6QGqK?UZC^h>rB9y}^4SLskf0$)?WZ6G*zC7tpkL`8pY{-&1nKO+o(B@SnO^LS z0=PXpJ9}f5RM8;@fD~eepI?z$8PR~lFyFO$>JL#vUJwyCwxv3i#$olf2~B5zX+U{s zkI2#ibm2WswHO9K5GouT9P4kMd+|(@JlKMf5vVT_NQDlksHTPW84JIeMH=B^eqiPj zDKe&b8=g)Zh(`Rh8K=jLl^zMeHi)c@SHqVFv*Xj#I7VfbT!N(;XN?ZK!ibuzu;O~2 zm$90!q_ap4iq-N>tuFNu|FV3YVN?Bot0b>n1&Eu?ZcRWw6MDtBqSj|X{_}ktx={Wk$jg6H6iEsil8z+GM z6{rb5`T_){IjUuR`OQ5;unNVt1+}sU^7X*OrpXdRwlUx}C{N zg*aR+j1Cnksm~I#=?F=Z?%Q|h@S?-B>E%S87oz|!>ovC`rs6Ui_C~#z2GIKZyZ-)u zr6L-9Hgi^o9R=9+8|Nncme;jbiM2Y~tcXmz_58ORn6F8*0A~Raf7ZTCr`yE&{=FFA zrQ-bA3pm4=D%Qa4`C;w~pmrRCo>em5Ux+J}QeqB1LAd>*GToylhuu&6ZzjVDdAOYp zf}BQ67WxCC(#p;R!sp8&(%wq*l z0QT%17k_5;do?LjAUnPSDU=h?mlONz9X_09Laxr$L(CKZX=i6ASUm*JSAdU*Fb2Kh zm8(I8$4Dlu^0!jZ_O(c5GUx`MYbQJUjpxd~Q_3#|s61b!`wSGnj%%T!J$FpTQnywz z7{T*qkW05Hs;LU+HX!D9Khq3$a7>*O#B|l`rCg>Ri?=JtCE!^Afcn-Z;$0pue0? z{UL$$LYHcLG%I6b6<=&{d?WU=_qTq>3aLHQPtltZR6_2Fd_^cFJX-p^x9OjFSAb-| zz5kgR(R42_^Z0G)}7^ILf6$6&f#Lcfi1@NDb5a`eWq)gCRJu zq7R|hX_zS0xi9Y_ddJ{bY?cM8{)d2C=VM(_qA$HGcIKiYpOfSCyfogiNS0g9*BDxk zaQrSwlw-C=m8WiXCZj=R{(g9A2q1iU1H(ld%i-|E`N8pPM-oh0#jGOBPlNDbD`|p`7DOj*wTFie zhXu+cbJfxU?(g=?3KAVe!I}A?yl{O+CMMn|f8gZYh%ZYeN3uU?^BWJugIU3`=P|?( zf4x!kC#{R;jPE2=`z9p z$yuW!tp|{kntvpjOZf{1K5vF$BmD7t9}+9qL%RyL8b`>}nJRJZE~hqkwm>_L+^ zB12%mSHGR=M|V=cM@tHO+$8bS2HT{>p&QU-We>5}9|+eey}NhSho;F-o<3mULJlb? z3$q0k4MyRy~#Gt|+)$XJHU8gZkAN8@>iU-}j=jG$+g}|#G zQ~9p1nzN=BE!`t)^P&)p3!c}Dd7|;LFzjy!eF?wH_DJ!}m=nJQCA^!Q-sBsfjbsOV z&mH{t!4tkR{S`8@rv$*I z0CD<7W=TYtV`%H>px7-pyI+5M1*Pm!oht150Q3bQGC6bxVZ3lkwX#$paf)$Lo^=l; zC8dwiHe@$RErT$;R+!pXoB3yYoDg@hWckI30G0^dVZa6XfhDMdK zm(c{y{*rCBf;op89sY-)-5$%P*b0}4fPldL*@FErpUJJTqhN4`u}RWi-)4hM-`w)@ za_*)_A{i6^8yuWK5rzvL@><8|kJ}NV$&=QyncOh2&{QzSp033adSY-%W6x=BqXXXN zHV5L)AyE&M_9;Y{3SW@eVUxJ?!hlk(!8cdI`Vj_n1xCK-9Q`!#a1 z9Z(Vm6WLA|Z!B0*q;eDxNm)#AwnIZL6q?4Le=SjLF=`O?|4v;UnA(>gpKq92)}9ih z;Ce}Y`Z4X?F#?pdmRnql)z2!b4X(_2WZq_k94N$8iq&7bet;2)?+@2T-kJSY`}};6 zwn-xvU#vDNLkB|fjsLdroP#P_;6XrP_5QC%^SsTarK;zkOQV*QpQ`kU=M|`P^3@YL z#jhxS;md)9{~Vm(`|pBs@{-K|mrMBkzaRdq0;Q9+mrO{bW3A{h(6VOAsmqLa zTWX1Ngy!!bZT(7!b>x44=`dEGMJb;m#qUggDD^j|O4`h9nz^i>(heG%(daK0ldx+i zVAt=&(Uk>LkuI+HF^K0|-Q%{x@L}L!UFsSw@*X@qAMtM3tA&=(#1aoscS%$yV zXdieHI#9ViRJK@UIpmx6(|OGQWt6Dwd2xt7?dJrq^Hf_yh0UsJbJXq$`8-&RH_bx5 zJGxtIyrr3X_S#wq_+XMG4qIJy*p~fWO+!hT3<=S%k+9DD*_e< z#`ClbCyoIpfDNokz(vOaK7CDNV`{nsz^JFEXEpjjQfzE&R21ZNDz~GQ6)DKuSBhi2 z+v|syZHvyXZZ0!SvS`lNS4?z?9N}*F;|$)~6}0DWsI*-sI`!sjae+who-b@#~%A=QDQ}xnwSy5(}J#I$HyP?_qsfT3YzruacRK5Tk}B zCmlyK#opw$0OzQ$ukWW54uDQF9bH|wQ*@QWelWHYc>?!Z&^L=ZC^#})$D04NH#{igupwBBwd{g^O(dU^u& zL-+URS1Oe<=P5kSaxyZ!fR$&MMWr+2oZ>L((q0Fo`<^F9)J`{xz?MkPxNI%B+S?|l zr06VaTP{i~K#TeZHb0*sF*I=<&g`-nc|)?0kfZ~j%GTC)baWIrN4m0a6{1K2(;yUESOOU2OqUe(Teng@S?t$b3NQv;7!U34FJ& zOHD5j0SK5~v|P&5;A+5Z>+0!A<8?g)vi}@414G$&6#SaWKlAfEEG+hbLNz)ce@B(w z0$Teba7G*tW|%lRZ$RQ#2bv+2Xp8H)aWES+d0;Y5g zNB#~uoo3Za+qZ43XFvkNrbZ$4W!*I6=yf`y5kK$`gGKSsA1M^E>@DA3Lx`Oz#03LW zEA`z)Q;Z|w;UwO><=OUc4s-KP7WndL3Ryg$b0Nn?MMWhgA8Jpn!aB-^G^N9J*WWw;42Mr=+99C@d|5&Q1v zh_H3Z=7r@j6FG)O>?%mj3F96o#2pNt{Tn+ZR>}(0E~N&IQN8yj<=-yWOj zww4O)ITI`_F5Efnx@_DOptU4w8J8UI?cKE_F(AKXHU!=hL(2_WD&g9n)o?sEb6^Ww zH(#pi>H_*!gzSLUeHW|FR+%BkYg@;4$sBeKiFmMW# z>MATCGUiUzE9gO!sZc8PLNc+v##N1WASl+Z|8(m%gJX1Xd^{`< z$rgeE&v3V&9uxMXtk+NQ3v=&?@=vKiX-Pc+YWv;z0kwdW@sAv6eUUI2-PCjy(N^6m zt;vy?c?vpr6FK44H=3LXg@Qk1SHliPppA$h3lsdgcz}0}#^X_zuB(2img>c<&M~~M zH#sak;Hy;|MXx3cxaEc6&3A75pZBea23RCBIT!UU)VkxdF6Wtx6jpS>8ww zyqErE+64LH0THChk&v>M{y;-3a7bs0BGc&Kjqg{>5`n2uTHX7cgGyjiB3{bK5lgm^ z`1W(C;K$_9T+6USgWDY5Ex;~gq+jap^Zf?GD(UlOmp&;Q-LTdXmkZ~uuvD;0*^j&) zrHBQ+Rx6j;Dt?b|u)+%)TU&U^i7Y0l8(5f_N@coyk0&uPF$pXtcssvAX-F^nm%d?{ zj`I<&f=QA9V`X#GsI2D$rvhldIV`8yINaL00->{liSngXuhk29m7oBcWS0r!aabX5 zTQ0W{eqjkherw)LoOChhnfjrIO=i)Q);I0&H$%Mcw z@3G&>7HV$jt~JXEs4~@-wC49_y1W;YMv^kz`;_6e$o&rP`ug|&kV7L0H+N#vGmx!a zpx3tzfwY?D{lw*44EQ94#MGT2xlV&auwP^(Iuz{P)x33BrJR(Mug1G~?+!mJ(6yAfcexPPa*-DvPBV>%_?= zEvuVGggqG5;rwIRIePWz2qiX((7FT@pDLRg#)JUm_DNS(DBiZeY!{Y5-8(+Kd}eu# zLbiA3;%>CqTeE`sT=~_gwKRpN#!`iOJlLwV^s&+L$x*hw6e{p<%!#K;b#hmJ7P!KnaVN-nG6|(KaBl9!LI(-N z0e)Dq24Iy>XLWU)Y@Q|%L)^RAad=9Nu`YnVhln_KyYJEtx7uRsj&5CWj+l1mUgFhk zSuh7=>X@dvVx2nyy!Lk3G1zjR>df1CvRy>je7e~7ASTCT==TbewVeCoY~QJ+R(*ZL zFTwXB=E}#*&Gs7W^&qEdI(bLJnOy2InCZ<}_`!JuD=77c*x2;4SqlBwMU9Nj$y9_O zCMH&1Oc(MSD0$!op5~KQk5v5L$q*3jRA`H^4GVX9kWNz^ELcO?e*KcOJyY3L*YjGN zE>M!-v#TV!;I=>OC%1ULOtSD2D0bcUsi{QQOI-Os^76bs+oXGI7yasyPbqKGemuBE zdiHo;-zM_THp%0}>9Nl1$XVjcUoIy0Zi!6Pbds?iY*6wnP&QTso)i+!)4f^tJh!^B zf}d1|2C>@?DU#u@*7@VfzoRP_`8c2@J( zXhsGoiV6L36Ou}Nj+Ns1W}D^AE#2W^cx=AfTqhS7%9t7ENUv67{wO(5TSV+AdyGxD z56%jaP?_*LU$=QFUZS+_ipU?&GFi>e`S}S)_s2CYle^aaBuGlgKsxM0;$6Z;RnqGn4>!2l!7J( zMLc?d<^%+Y3-;F5zC`sRNMx)Xk+Pc)svI31sfQvFY7S*85_vTh?Qg5Pe8Zh1ws7qs!UB?ek-bKc)SirDl>Jq0xR@ zj_TDi4j!KQrwWJtDHQAlV8tXH^4*M3rg<>a&{zO<=f@lnCLKY0186@17I2=u`(3@vk}A>7 zoiygS@OqDGo4Y7+%?~4nVlv%o-#lei69`O(lFdAV$r#sdqEG*sPggA4_wZ8mWV{0# z1rP$Q7=CwJ&ntBL{Z}~4Zr*<_tS#s2=QFhS&7t9HBg~EzEI>{Fg+ISRleITpModJM znwVIK5Qj-Ax55T*Li?50gpZF8L}SLqg+t>(loK@W?`2Q{LuY}YfHqtp_@T~Zm`Lu$ zh%~dXK^Q}c{TB63&e)j3Hv+0^5qNsq-P7x{dj(~?>5tjLio!woxP&32N2>JFOmPgW z>~vqt*;)dmzanz{{%49x^=gN7Rd{9dcGed1qaLmT zKrkld8UcpA(YbvtI?D#D*%yx!`PRuu*!h5oz|;-Kl$k(4W9Ba|thoV#Euy$ZXQ7N_HA?=s9g|H> zEw1Odbz5+)+|vC@>zS99WxsnZ)`G)onay~HaB-c7)eK#+Yka(=+7e5nOjmv9bUggd za2NpW&lS4OZa|ROuN>y@|NB?C0+`(4xJ;0ql|YsPSbh)R5PVu`GAzDEt662*9r_j^ z{qO7(MI^`d+eFaB!7+Cd8j6~C?lOZ9?DSDx^>P!I`$GOa2ukmVG`pE~C-HOx$vk?ad5A61JCiy_;qC z!7=tzO^x&R4TwZB|3D2dlU&(+4Z1oxQ_G%Hf{rUSJx?|k7EIOsneuf|>{sc4G{nJC z3tobrntM)9pg%nVQzsa<2>8P81fVPJ{^kaq_^&_Z-}a7rP#lL+?w6hYKSYVgkOTQ@ z01%v_zRN&8??*=`rzN=FAOkFrsf|n*X6kWMy%XxMOQa7uUl|MH4yxVJQ zpQ_DOzQf}VZtyz;&i|WeXtjLNvaxN}_2yeknVjob<8PhrTNs%6>m%=jTeYzeR-xmq zJy6+8L~5{{OTGS zUJL)lq1R?iFtD*Qf-96 zq8_{MQ~f``e=~N&0XL3x79dUrorW0N{BT)m!#tS;GH1vCNGzO?pqqyMJh>>OKiWV- z-pwYos7Ph_>a~2T*X|;k6ESD9(ga#C=`K;DwQ`^;ors8eL*pCi`Bf%?g!_*9w81fK zK5pM_=p6V}u2n7{!0WUhJIKDqY5<&MF_-TXd+G-TwKm`BqH-$JU_(l?FOI=prZd>9 zUhBGF(|m7lXEjx*J2*Yx*qd}%cVaHSRc7(}tLLAs5{tN;#u%i|o}Lhlzwbcv3%NKt zC*+HynXt{fut-#IA{s=88SK^4!ZeuJSsm_U9G=Rl;vdJk+~CM_X*U<%49EU;*^%zt zts|&mOVwRd$Wd;YPCF{iIw=+N*MLlr~yZXzGvcb1Rc!Os3<=MT@=0T zqZV`hW8vlHHFk@XH(+_Ci|SbLv{5 zq{((6KY!T11S;_iN0sUzrb!eta~aMmO8+buhkUB6=FNO!a#H^RID*eY69Ud4sm~6fNy3|;seMAh(MeUs>5sC0*&PkF?U7OE>8N_!O z|0sd0T$MJ?_N~@Cgkri!rkeA&cU2a%yzIGRE{B@babxs(dGm>qe@e9SqJ|C^oYRe~ z%`qI?X%z^y@4B4N&t*KLv|QxCu=;N&FDz&uAIxLU8eWe@8u#ah1)?0RZ>nr=BxKXh z3rITMO5J4`^k}gLBNixj5R9kDabGVoNS`4Y>VYKCmXG$TL!(Wi*XOIw%JwXn+kLWnuuHX-6iDtnU&fKurvnWY zl?e0##ePuvq@+Z6fpL&|l3W>WA3_oKC6Uc`0jEtTIR)zRk-OGnyij929pX78ZmiVE zSkwEqtEwt=V1IGlKu4BORJ+z_zF~0wt7mJ@KO;PYqpzj8Q`Rc%ty1~YfaGEEhH|mN^I~IHbFzpn#N1S{ zJKnDAE{x}jxQXr`kv9hpHyaogKr(VMla~iDt+%PE2^ipu6^{WLs4HBQd69UNjgF?r zyQ_+jH8%E+C>PhqvjrkRpo}Zk7MjPnh#^62&~MOmb#+00 zmzR+#294K(g5N?ykg5QfO8iHN{Gz9#CYpMFc6LC7gTHdD_C?(GR%Cv1XQEWLI=yY8 ziYBfUtA&JRU);$s<%9x-?DDYMoZBs#vM>{^0W6 zVcy4KZ|m9SY2PN5q@JHvc*7VK+ao{w)y4=lh2OUc+#j&eb%Lfv3eoKsT<7crI*luq zktR>}7V7OcGpjc7KrsR05+$QGd8-XHemCOG|I(<_yG*e#M*w)F3W=X>IGDBPi+mHaG z*p)JzP3%LJxu$C|ty4MdrvNtpzg;solDEQlC051eaXv9@ziPV+A%)CV&o-a=5qy_` zhz??o+xbZQVFS>s!xq$>AUD)xE@!LzrAN<3rw?>2lcg%>U6jP02LWnB3En8IR(HL@ zN>J_&Dgv1DDf}J}q6IPR3=C*BB9k!C&@1TY&)QOc$00#Mf_pHquv=SOx!Ku3?c4^s z=-o8XA8kpYh_xB*PJq@*p3{1P;CE2L31U8>aY_zqZJCYkaFHa15fLIdoe z>4?W_+NJ?Xts*0XTu`D>*}Wh_@pmEnBW9ua#tZj|2R(KB*LLEtxOo6_Vu9A_Kp`k< z1LzXQJp{77zy?tXiTk^|u^sXX_iHO7!_qD{e*#_?1?j1djx69#A`_LXeEJksK`Mfd zDB`0co*fx`xg24p&<^ZZ0v;#ib09Vol{W%qx3g1}jn;Cpfz2{oN>Y|O!zn`;u-!xs z>mijYl00R7DoTO%wY6THM%x#CI{UZXrWAdK5O7cAM6%AS9L%SRKXUsk&4D+V?J^Hp z5hQcmu8(9L>k7fb>=hL@O$2D2$F#miP{GiK13+Xs*ALw6UdCWSxd=!^YLB|ob8sAo zMVMS2O#CT{=?;z0v-Ru!)7;>B`sfSE!oaaQwB&u0e`UXQeO_j=NLAvb5)Qjvv>aK* zYVg+5C0xEoWH5n6f(b4Kf>;)eu`prL|x~t=xx#a5hw!}EF$7oX5KZql5 zl%5hWfe4g)Th+8O4aWEh>?KHiofFAQysIGhMv@HdI(h=FTe!l()^B168RrZHBal9E zFvGcU!Tkg?fSSx}@ANeG<{j*ny(3-9@GrNzMh=UKk?HyQcKS0=ZQt~KU97a;P4pkj zFf=h)AQ-~I=(f>{{&Ld^xEKqg9`G1|7Hhf-7AYpmR+4}>|LBPZr=B``S}zGb zD?qR?AFSBXE|h3-6ixw_2W%ypqm1Sel}Nts4PnP$e?Rfgg?!I#>m(IAW4?B?{nU*| zpdj4c6iFp2$<~KTSS-J)9(woE%NPU4o#(EAp=l3@@|qTm5gfAMZf$7PB-QfdWNdlC zI<_Oue(+G{vZ`~41;9;y!Y}!@94dl}tFL}$b5am+6TN-i?!LBvy7C}4Z#i2b_8zABC#n_FFzWE_%}u_J zswv59A7z_;bV_Ox)rt4{Ob^ta@IJnjDn26+8cIabO2v#yHAkD7H%ehSD`Gc-n=mxd zI7Gi7qcJjH)k@#8A*Jy+qjDKp5yLE{L6UrzM6@iVddt&x@teXcO;hP}MHW4JeBu?k z?B9swHO&ny0TpxY7O)#D`qxK z&%0gpKguWHkD^=SQ!Zp%5PWDqGnhj&y%Vf<7%4+1|M)Z9*gW1HSdBkgZ>1|7-h3bn zS5e3nU+jf7EA zX^&{NIM=e>_T92ks^T->7tS}#kM-W`;+sF80-gh zY#-W5Sb4POYuGkdY<8sAm}@D5(#H3&oFaoDT|Mq9EBv zzXq9rhTJ^KLf+)AGhArWeA(xA`+V{D$GD#q7{mfK^*Q_B8)geEOIG0Z6+oUxyGON; zAbyB!f7vl6HL%;D$4;03GrBwOVbWLw3C7U}%N81JIhYvB$Y-Sq$Sz`}7$H+4f1Dbg z@)3&VR252q>sJCw6wXE*LYO4w8%o;mZ7uMu}|Zw zG~0BH49F&oeFKq_vR3=i<+h~dFB{Fk$Y?-?TLGJUfgjmiMG|lapjb5l7_lBmxWHq+ z>GQljbcB|K(peVNp7ql6uM;~^*-b#wq^T_5}OJQLP4%+sosJ8n>)z7%;Ee@ zOyvNpMZyuy=0*$_HiedyV0|wsx;4Y;Pf@8iUg!M4lSEL<%#4TnreAif#!{<#M{!at zHu=7%j`TAI)F%#z&hzyMfx;LJ6=0a`j$}YJ*nmfwlS%+RtUaBbpKUZFM`78%bQTVN z(6XjC=(pH(UcjG(fec&&Fb-_>?0>Ohr%OxR?39%!z*f*|m(wrbn-aAQOlN=z4{Qjl zzE~QyqnYw|%iU-}*m2unU1?UB>oor!p(MsVJUUWsH}%We>UPZO02g^O?A2D zZ#H4h2Ychno&V_tM5(J4D48RWWo`qrtplT|?doveqJvmCpCskmpYY8%?RR&X$G4tm(h@$}DdN1boxH!d+^fFN0c&(0IYSqRurYH=L_ic|MxsO^FL?`>Y znfr<=X+nnuROW7?yShFjb?M4Aq}YoJ;sLkhJ7co1@x^#28zvm&IOMHa6Aup?+a++s zF36KNT4eYx$Q-xP~gRiB32t-Upy%HE%{)9@Bek!QJ9t~K&yH%|C?2Bnc1n5oFg{?Zy ze7Wa(W{#nJ#jLgU^{lL{Nko22$nQer2CDJHxzk@}OxF0>4*xdl4JFtFyTlxZ5Zj*-IIyAulU*l^nZq5 z=ZlM+D7`@12sad2-C-&fCX%04vW>n!VYL+x)bN`sTm7dyg0o}7~Bb5j|&PU|$Iti|0y)H=+ z_QcjK=c*Ll*JG4@{VvrSZT5`s#VOvI>hdv@%N7gu2uc;^e1sIb&Eby!db-x-A|{(-dyMv$ zd1J}_Sfw%%1P`B%4%gcUL$J;A6!|@e_3d-A$3bWRvDeL$Kx#y>l5j{oz|}K#25PBc znAJI)js=5k)Z5i&;}mn?|5vaB9hBz5LV|)2Py3)So9A#IsULd#?p0J))?+h^{7ruo zV<0wQxlo6(9QZm@Yed?{gL5Bj&0deiGk-_O6~#~c2|86yQnIa5LQG6iGAa}K;o|c0 z{X#DEE?sbN@NY?=K;$E+b)e74yS!0ggXM+gf3+Fw$HimbmggHx{3 zl#3rESjiH;2tIOY?Nz&7nw$Hlybuxnbdh2S_y-9?d(3w8?kFv94%bO2eqn?%0(=q+)+SS763Eqw&n zcC6j*Sq&c?cU3sT#kKuKrEP^)xmQQA>oawN@$aWbUa-X5m*2Xl4GhTeQWx9oO;BGd zGHG*J5qiU2j~GY39q_@-=9(_R4qQDyZbx}rsoHmBqC)#eb4DAS}$IE zmi-F!<+YUo)0%%^ph#H2&^<;ND=F-u7-b=m{b1=q=vD{A*Wa#0HX0Sba8suQ}+E>sKqn~9TbCOQTM1}h< zZ$tMC_J02c>tX7x2OI=NmTpyIAr9AA_=d24Og4oDv+vwx00}}AKU7R2w}LQp4p+Jf z=ST1F*hzxPRU~h1e>F|~Wzt;U9rh#vg2bvF^IVN3KJ|Df!T8&Wc?c4NgO4)RwNXyl z8GSGorWQPJ1xP>k$sJlL```xZZeMI8X+!%~ARm3vj&=(P=qB0YYIZZ~1QerQsg4aK zc8Tp;J5+?QRRW^<#c-Ie%PNbvj|(?}^Q_ie3WYrOM-TCR!zohSYQpx}Ca660wwj9b zj3y`MqML;iay&Er$u(^~s~=C-JDKtvIeEYq=1kACKFYiMwjU5PczL0i65i^!Kb`H< zl_$cjMEcm`EFsA9;S@P-1Ff#|bQeAw3N;VB>F!h*om6SAhF4NRTHlVTN{^b}(@5_V zt#cgRAIUZ!Bh0C* z)&t5ZVhS!28k#j|rvoj7F|Z0ORG@b)nZ+c0F3rHx{3LmCi|%sUo?hpp9`ICwf8n5< z^&yq$N>-pXeWfu#+GO}%-b%NRFQL+IsRG%zT!0UDa=F%8kGm(4&4SkY0}g089ScZo z;r4pC0dXG{9X)B`$$9g5y&Q7#h4Fq^>xqG~v8%g^K)_hJpF&Z^aeweY*v^98%F}2r zG#lyt-P7e+(Kb*tzoQWoVPO1>j;;jzvHbm^XRY49Y>*(x+`izt1#Y|rhqW|!oG&U0 zQi00Aam4oK=CD@9L&|Uqt$q~Ew3{4?iChYIHIN~Irtp6{IrDfZ+cl2AN%lktsgPwX z8GBV2( zd;UHDKF`d3U(YkoJ&PZUy1CG!; zQ$t>(*}*6HO8Z_9S#LpQz~@pKx!C z>~Q|o1-;+D^z?gb$C?Hb?iXu=|5&`C$0{}(bW#05Z1ekqR9Np9A0!;Pd| zu`z&+fqLim{4Y?01rU^_aa9qpYX9BwL625idnl)UQqlSil`8L;FHL%#lb6>P_U)6w zbKr~d;+R?q*#W>&&jVcyZv(Q<9r9ZcBb5)GV5OHa$9 z^g3@DIHBNCTN*+MV=3dG+mj0x0dL8+pedYY+fcu|;;mdak9r@Hkc?Mk zC+rP#!x!Jx73U9L?ux{jnQ^gCi2)FF>gcxgDuY(dILhKns}dp{ys*@#(8U-8HX4vY zPgyB+{VzIabNK1kC*KkNjtHNOqLAqgn(|d35>~WT+ct7BE~nH5aAnOyq<+}odI4w( zcJlKev(Bd{5|+y`UNIrR)o3fW-xgc3t`)}R7r^#7Sp$w*@~zOCsqjAGL}d7{g-Y>t z%G;36WG`7v^cX~$pKRnUTUWiwKo9UQIsrgv_D))tF*_}$EkaWm`LkryH&`M>YxiiD zlfhp%*6lx~=XW66>|R#HRfV(_UrP2=s_=kf29@Q~i@5CB2X4;X@zqq0<9=iv@AO@R z;=Cz;YF=7%5TbC^ZOA`1D5igWMP730M!)Ou;Y|hqdnbhosy-c9{+_~HYKU9bC2j$) zG)g+C&*<*Nv~$$TB4>(jfPAZsg9IFCTGM+iH=d6Mj6Ee@m?`P3?zG>GWww9emVZYu z$nJb6E)i_EbZP{*+|Y-P+zCk)j}fWxfMbF^F6MBwCUoGmBu?(E$(1zfJcBtzr*Xc} zl^(DpEx4R{Z;5gVBU|5$NV`Dq3X7 zl?Tgo4hp@9@!+sWdrs4Z z$I>Vw$fnC4>^oZz?m)6}18W*re5(E4ZM8<562H~$a+bw6?K0XTEz42y+)CLP^ZxL6 z9>Qt|p-?FKHf81ZEIF=LQqMg7g)KCw8=dKoJXW9RC{nU?HtWvpn6nH`eodBjK;>c0 zkI?!N-IqV(DZ%si=91q&TMt-45X^HOxqZ&-^X^HBEg)UVL)*-#ftoT~a_Qy&dx{FnA zbYr{->BLrh_$#nU_IXIDy=oLZ-$dJ$nc?KV``YON@AB!_q7Os=8dris5w%JoBL#IZ zVR2p5H`TAh|&-~;wbOG=8FYhu4S5ow;r8^(&L zJmZ&7L%%M~up?%r^IHFl0qpSX*zm0G){q-jo&tEG=1Chi&BLY=J0Dy%%P;kocoami zm7ij@8`kfhEZ~9gUq{$-ztBCRv-*dzts<()re&g=Rfo9he5iYtM!~EkHF!bDUlg@T zj3VbXAhcHd_ct@}4GWcV?U8Q6{+vSOz|@?j%c9eso9#kG*dT6JDv@AUUKyjq&k-`B zWYM~oL?|!ppJ^iYwq>uj@NT0E?L|52Nh` zWut%8DvWGy&Mz(hU{aexOlN!?{xpf*QwtpUwYkaZrp3#oKse{zM>}NWtO^cfpCdeS zQtx(yVkq2CCsRbH?Yz7#k8M3p3FzJl%_uOG5*zTfupryY^Hwkf@FO^(-)xoX^pE34 z*=p*ylG?}o`d>O9Ynhnt0<;ONCiP)PhGaPT^t17g-h9R1@+T6j#^=>t9Mfz*QLbL{8)_Rx|?#SYIMuhr$aW#UuYa~#VFQOs`p1eGn#WH84FDbY7(;zL#&$I zwyo14z?3mvPqZGd%yXQzO1$V}rs9Kq_1dS|-QZ92gGCh!3Pm+}mbUy;bb8TxxrWzt zY{>6^&RKYm_z@8W+GM?-yVlNU7a62bFWM1>A_%!SksL@A8|0e88+Dzf4VGEBzE`~E zx*fsrLn&)iM_GCmcEbA{_f7j$4qBis4tEFmYd}sA>Y;Vrab)R@Ff~`0WD?2myNBhzGT+Sn* zk0atu`8^xp*CC^M`ym(+yNs}iUfbnd;dA*bV;1FbH%P>heJ9d$(V;m8XERbyBjIFo zBlRRl<0yi8L$pxXJg0yX{PU#m&A-zrQ-y4<~NW;8IduYTmb3XmysA}pZ^^8C-%lFi= z24>9lqS%9Nq=cZ-dfF#J)r|c^W-t+C26a@zM*?_g5h#9wE}sXVT=nmM!pzxrmIvOM ztw~%=tL>-?3?dtxGvdO+oU*W7&(V_Uz0G#J0v%zE-rYTbVcPmjB7@5dZuX?1*@1>VMG;GfIF1BAS#E#6cb6>%rQ+7rU()sAMgTb zRHizfoc$2$W49laKHF|@XPxH^CdR8ngG>;_4H?%+$l>y&;SNbIs;+Bst+MYtxmaa1 zHjbW$r1x~`9e0!nM@ZZtWC~2%OWGC%KCarts-}T93Iqz}7d@x3qtX5O9G3--y?p;z zhmK@>KUK`L=^H<%0HKN2sic>2@+BE@qiHu>;mSLD= zyBTTWaGT{>8mAeXT7bOVq0Hcs^F;p4>iDXmHjl(Af$SG5<`xn+*{7hrCSJ4~~ zzK66!aTkq={YE~T5yJc|F19B;P!g_BL|5oKL%jL5SoR>#{wSq>)eJYO=x4UHykv|p JA{)5I{u^k&n3(_o literal 0 HcmV?d00001 diff --git a/wiki/android_sip_background.md b/wiki/android_sip_background.md new file mode 100644 index 00000000..b3fa4f03 --- /dev/null +++ b/wiki/android_sip_background.md @@ -0,0 +1,79 @@ +# Android background service + +In order to accept incoming calls while applicaiton in background you should set `notifications` property to `true` (true by default). +This will make PJSIP service run in the *foreground*, supplying the ongoing notification to be shown to the user while in this state. +Without foreground notification, Android could kill PJSIP service to reclaim more memory. + +![Android Pending Intent PjSip](android_notification_example.png) + +```javascript +let configuration = { + service: { + ua: Platform.select({ios: "Reachify iOS", android: "Reachify Android"}), // Default: React Native PjSip (version) + notifications: true, // Creates peding notification that will allow service work while your app in background + notifications: false, // Disables pending notification + notifications: { + account: true, + call: false // Disables only call notification + }, + notifications: { + account: { + title: "My cool react native app", // Default: account name + text: "Here we go", // Default: account registration status + info: null, + ticker: null, + smallIcon: null, + largeIcon: null + }, + call: { + title: "Active call", // Default: "Call in Progress - %Account Name%" + text: "John Doe", // Default: "%Caller Name% (%Number%)" + info: null, + ticker: null, // Default: "Call in Progress" + smallIcon: "icon_call", // Default: R.drawable.stat_sys_phone_call + largeIcon: null + } + } + }, + network: { + useAnyway: false, // Default: true + useWifi: true, // Default: true + use3g: true, // Default: false + useEdge: false, // Default: false + useGprs: false, // Default: false + useInRoaming: false, // Default: false + useOtherNetworks: true // Default: false + } +}; +let endpoint = new Endpoint(); +let state = await endpoint.start(configuration); +// ... +``` + +### smallIcon & largeIcon +To use own images for nofitications, copy them into `android/app/src/main/res/mipmap-XXXX/` and set thier names into `smallIcon` and `largeIcon` without extension. +For more info: [ui_guidelines/icon_design_status_bar](https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar.html) + +### Handle clicks to call notifications + +Typically you should contain code that will change "route" in react-native app depending on result of `endpoint.start` command +```javascript +let state = await endpoint.start(configuration); +let calls = state.calls; // A list of active calls + +if (state.hasOwnProperty("notificationCallId")) { + for (let c of calls) { + if (c.getId() == state['notificationCallId']) { + route = {name:'call', call: c}; + break; + } + } +} + +//... + +// If true you should use slider instead of buttons for incoming call, because device was in sleep when this call comes. +if (state.notificationIsFromForeground) { + //... +} +``` diff --git a/wiki/calls.md b/wiki/calls.md new file mode 100644 index 00000000..f7d54d67 --- /dev/null +++ b/wiki/calls.md @@ -0,0 +1,122 @@ +TODO: Introduction + links to other sections. + +# Events + +All interaction from javascript to pjsip module is asynchronous. +So for each action, promise will be returned. + +## call_received + +TODO: Description + +## call_changed + +TODO: Description + +## call_terminated + +TODO: Description + + +# Actions + +## Initiate a call +To be able to make a call first of all you should createAccount, and pass account instance into Endpoint.makeCall function. +This function will return a promise that will be resolved when PjSIP initializes the call. + +``` +let options = { + headers: { + "P-Assserted-Identity": "Header example", + "X-UA": "React native" + } +} + +let call = await endpoint.makeCall(account, destination, options); +call.getId() // Use this id to detect changes and make actions + +endpoint.addListener("call_changed", (newCall) => { + if (call.getId() === newCall.getId()) { + // Our call changed, do smth. + } +} +endpoint.addListener("call_terminated", (newCall) => { + if (call.getId() === newCall.getId()) { + // Our call terminated + } +} +``` + +## Answer the call + +After answer there will be event "call_changed" that reflect the changes. +If there is already active call, it will be placed on hold (so expect "call_changed" event) + +``` +let options = {}; +let call = ...; +let promise = endpoint.answerCall(call, options); +promise.then(() => { + // Answer complete, expect that "call_changed" will be fired. +})); + +promise.catch(() => { + // Answer failed, show error +}); +``` + +## Hangup +Use this function when you have active call, and Decline for unanswered incoming calls. +After successul hangup, Endpoint should fire "call_terminated" event, use it to how final call duration and status. + +``` +let options = {}; +let call = ...; +await endpoint.hangupCall(call, options); +``` + +## Decline +Use this function when you have unanswered incoming call. +After successul decline, Endpoint should fire "call_terminated" event. + +``` +let options = {}; +let call = ...; +await endpoint.declineCall(call, options); +``` + +## Hold/Unhold + +TODO: Description +After successul hold/unhold, Endpoint should fire "call_changed" event, where `isHeld` should be false or true. + +``` +let options = {}; +let call = ...; + +await endpoint.holdCall(call, options); +await endpoint.unholdCall(call, options); +``` + +## Transfer + +TODO: Description + +``` +let options = {}; +let call = ...; + +await endpoint.xferCall(call, destination, options); +``` + +## DTMF + +TODO: Description + +``` +let options = {}; +let call = ...; +let key = "3"; + +await endpoint.dtmfCall(call, key, options); +``` diff --git a/wiki/installation_android.md b/wiki/installation_android.md new file mode 100644 index 00000000..ca9e94e4 --- /dev/null +++ b/wiki/installation_android.md @@ -0,0 +1,62 @@ +# Android installation + +## Step 1 +Add permissions & service to `android/app/src/main/AndroidManifest.xml` + +```xml + + + + + + + + + + + + +``` + +```xml + + ... + + ... + +``` + +## Step 2 +```bash +react-native link +``` + +## Additional step: Ability to answer incoming call without Lock Screen + +In `android/app/src/main/java/com/xxx/MainActivity.java` + +```java +import android.view.Window; +import android.view.WindowManager; +import android.os.Bundle; +... + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Window w = getWindow(); + w.setFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + ); + } +``` + +## If Android targetSdk >= 23 + +If your Android targetSdk is 23 or above you should grant `android.permission.RECORD_AUDIO` at runtime before making/receiving an audio call. + +To check and request Android permissions, please check out [react-native-android-permissions](https://github.com/lucasferreira/react-native-android-permissions). diff --git a/wiki/installation_ios.md b/wiki/installation_ios.md new file mode 100644 index 00000000..9269e1d4 --- /dev/null +++ b/wiki/installation_ios.md @@ -0,0 +1,66 @@ +# iOS installation + +## Step 1 +Link library + +```bash +react-native link +``` + +## Step 2 +Open project in xcode. +1. In the project build settings, make sure you have enabled All settings to be visible. +2. The Build Options are the 4th section down. Select *No* for the Enable Bitcode option. + +## Step 3 +Add permissions and capabilities to use microphone and camera by adding following lines to `ios/%PROJECT_NAME%/Info.plist` + +```xml +NSCameraUsageDescription +Video calls +NSMicrophoneUsageDescription +Audio calls +UIBackgroundModes + + audio + fetch + voip + +``` + +# PushNotifications + +To be able to receive incoming call when app in background you have to use PushKit. +This is the only way to receive information and wake up application to perform some action like use CallKit to show incoming call dialog. + +## How it works +1. Your application registers for receiving VoIP notifications +2. After a successful registration your application adds *device token* to Contact header when REGISTER. +3. Your SIP server should parse those headers and when someone calling to those user, server should also send push notification for those device(s). +4. When iOS application receives this PushNotificaiton it should show incoming call dialog via callkit, and register on server. +5. Server should send INVITE to new registration from this iOS device. +6. When user press Answer button via callkit, iOS application answers those SIP call. + +## Client side +When application starts, it should send REGISTER with additional attributes of `Contact` header and use a long term *registration timeout*. +In example bellow we use one month as regTimeout to be sure that our registration will not be expired when application goes to background. + +Your configuration might looks like this +```javascript +endpoint.createAccount({ + "username":"****", + "domain":"****", + "password":"****", + "regTimeout": 2592000, // one month + "regContactParams": ";app-id=****;pn-voip-tok=XXXXXXXXX;pn-im-tok=XXXXXXXXXX" +}) +``` + +## Server side +Your SIP server should support ability to send PushNotifications and also have addtional logic that re-send's INVITE messages during calling to user when new registration is available. +For example an working module for freeswitch consider using *mod_apn*. + +# CallKit + +Ensure that the Push Notification Capability is ON +TODO: Example \ No newline at end of file diff --git a/wiki/ios_push_notifications_callkit.md b/wiki/ios_push_notifications_callkit.md new file mode 100644 index 00000000..e425a159 --- /dev/null +++ b/wiki/ios_push_notifications_callkit.md @@ -0,0 +1,55 @@ +# PushNotifications + +To be able to receive incoming call when app in background you have to use PushKit. +This is the only way to receive information and wake up application to perform some action like use CallKit to show incoming call dialog. + +PushNotifications didn't work inside emualtor. + +## How it works +1. Your application registers for receiving VoIP notifications +2. After a successful registration your application adds *device token* to Contact header when REGISTER. +3. Your SIP server should parse those headers and when someone calling to those user, server should also send push notification for those device(s). +4. When iOS application receives this PushNotificaiton it should show incoming call dialog via callkit, and register on server. +5. Server should send INVITE to new registration from this iOS device. +6. When user press Answer button via callkit, iOS application answers those SIP call. + +## Client side +When application starts, it should send REGISTER with additional attributes of `Contact` header. + +Your configuration might looks like this +```javascript +endpoint.createAccount({ + "username":"****", + "domain":"****", + "password":"****", + "regContactParams": ";app-id=****;pn-voip-tok=XXXXXXXXX;pn-im-tok=XXXXXXXXXX" +}) +``` + +By using react-native-voip-nitifications +1. Register for *VoIP* notifications. +2. Obtain `Device token` +2. Send device token in `Contact` header options by using `contactUriParams` property of account configuration. + +Ensure that the Push Notification Capability is ON + +## Server side +Your SIP server should support ability to send PushNotifications and also have addtional logic that re-send's INVITE messages during calling to user when new registration is available. +For example an working module for freeswitch consider using *mod_apn*. + +## Background mode + +When your application goes to background mode it should send UNREGISTER to ensure that PJSIP will send NEW REGISTRATION when VoIP notification will be received from server. +When new registration + +# CallKit + + + + +CallKit app receives an incoming call while it is in the background, the system's native incoming call UI will be shown. + + + + +TODO: Example \ No newline at end of file diff --git a/wiki/settings.md b/wiki/settings.md new file mode 100644 index 00000000..6b2fb2e3 --- /dev/null +++ b/wiki/settings.md @@ -0,0 +1,32 @@ +# Settings + + +# Connectivity settings +TODO + +# Network settings +TODO + + +# Codecs settings +Print codec settings +```javascript +let endpoint = new Endpoint(); +let state = await endpoint.start(); +let {accounts, calls, settings, connectivity} = state; + +console.log("codecs", settings.codecs); // Shows a list of available codecs with priority +``` + +Change codec configuration +```javascript +// Not listed codecs are automatically will have zero priority +endpoint.changeCodecSettings({ + "PCMA/8000/1": 0, + "G722/16000/1": 0, // Zero means to disable the codec. + "iLBC/8000/1": 210, + "speex/8000/1": 0, + "speex/16000/1": 0, + "speex/32000/1": 0 +}) +``` \ No newline at end of file diff --git a/wiki/startup.md b/wiki/startup.md new file mode 100644 index 00000000..39c3b240 --- /dev/null +++ b/wiki/startup.md @@ -0,0 +1,19 @@ + +# Initialization + +First of all you have to initialize module to be able to work with it. + +There are some interesting moment in initialization. +When application goes to background, PJSIP module is still working and able to receive calls, but your javascipt is totally suspended. +When User open your application, javascript start to work and now your js application need to know what status have your account or may be you have pending incoming call. + +So thats why first step should call start method for pjsip module. + +``` +let endpoint = new Endpoint(); +let state = await endpoint.start(); +let {accounts, calls} = state; +``` + +It works in background because in Android where is a service PjSip service, that you included in AndroidManifest.xml. +TODO: Describe how it works on iOS.