From ce52d1dbff995737784bb748df199f77c9848b5b Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Tue, 20 Feb 2018 05:01:26 +0200 Subject: [PATCH] first commit --- .gitignore | 13 + .google/packaging.yaml | 7 + .svnignore | 13 + README.md | 7 + app/build.gradle | 34 ++ app/proguard-rules.pro | 17 + app/src/main/AndroidManifest.xml | 108 ++++ app/src/main/assets/accounts | 34 ++ app/src/main/assets/busy.wav | Bin 0 -> 64320 bytes app/src/main/assets/callwaiting.wav | Bin 0 -> 80418 bytes app/src/main/assets/config | 200 +++++++ app/src/main/assets/contacts | 17 + app/src/main/assets/error.wav | Bin 0 -> 16776 bytes app/src/main/assets/message.wav | Bin 0 -> 6356 bytes app/src/main/assets/notfound.wav | Bin 0 -> 16568 bytes app/src/main/assets/ring.wav | Bin 0 -> 12180 bytes app/src/main/assets/ringback.wav | Bin 0 -> 68084 bytes app/src/main/cpp/CMakeLists.txt | 80 +++ app/src/main/cpp/baresip.c | 458 ++++++++++++++++ .../com/tutpro/baresip/AboutActivity.java | 21 + .../main/java/com/tutpro/baresip/Account.java | 34 ++ .../tutpro/baresip/AccountSpinnerAdapter.java | 46 ++ .../main/java/com/tutpro/baresip/Call.java | 32 ++ .../tutpro/baresip/EditAccountsActivity.java | 105 ++++ .../tutpro/baresip/EditConfigActivity.java | 105 ++++ .../tutpro/baresip/EditContactsActivity.java | 104 ++++ .../java/com/tutpro/baresip/MainActivity.java | 499 ++++++++++++++++++ app/src/main/res/drawable/edit_aor.xml | 5 + app/src/main/res/drawable/green.png | Bin 0 -> 1309 bytes app/src/main/res/drawable/red.png | Bin 0 -> 1167 bytes app/src/main/res/drawable/yellow.png | Bin 0 -> 1180 bytes app/src/main/res/layout/account_spinner.xml | 26 + app/src/main/res/layout/activity_about.xml | 17 + .../res/layout/activity_edit_accounts.xml | 18 + .../main/res/layout/activity_edit_config.xml | 18 + .../res/layout/activity_edit_contacts.xml | 18 + app/src/main/res/layout/activity_main.xml | 60 +++ app/src/main/res/menu/accounts_menu.xml | 12 + app/src/main/res/menu/edit_menu.xml | 10 + app/src/main/res/menu/main_menu.xml | 18 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/dimensions.xml | 4 + app/src/main/res/values/strings.xml | 13 + app/src/main/res/values/styles.xml | 20 + build.gradle | 23 + gen-libs/build.gradle | 40 ++ gen-libs/proguard-rules.pro | 17 + gen-libs/src/main/AndroidManifest.xml | 9 + gen-libs/src/main/res/values/strings.xml | 3 + gradle.properties | 18 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 ++++++ gradlew.bat | 90 ++++ screenshot.png | Bin 0 -> 25099 bytes settings.gradle | 11 + 63 files changed, 2568 insertions(+) create mode 100644 .gitignore create mode 100644 .google/packaging.yaml create mode 100644 .svnignore create mode 100644 README.md create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/accounts create mode 100644 app/src/main/assets/busy.wav create mode 100644 app/src/main/assets/callwaiting.wav create mode 100644 app/src/main/assets/config create mode 100644 app/src/main/assets/contacts create mode 100644 app/src/main/assets/error.wav create mode 100644 app/src/main/assets/message.wav create mode 100644 app/src/main/assets/notfound.wav create mode 100644 app/src/main/assets/ring.wav create mode 100644 app/src/main/assets/ringback.wav create mode 100644 app/src/main/cpp/CMakeLists.txt create mode 100644 app/src/main/cpp/baresip.c create mode 100644 app/src/main/java/com/tutpro/baresip/AboutActivity.java create mode 100644 app/src/main/java/com/tutpro/baresip/Account.java create mode 100644 app/src/main/java/com/tutpro/baresip/AccountSpinnerAdapter.java create mode 100644 app/src/main/java/com/tutpro/baresip/Call.java create mode 100644 app/src/main/java/com/tutpro/baresip/EditAccountsActivity.java create mode 100644 app/src/main/java/com/tutpro/baresip/EditConfigActivity.java create mode 100644 app/src/main/java/com/tutpro/baresip/EditContactsActivity.java create mode 100644 app/src/main/java/com/tutpro/baresip/MainActivity.java create mode 100644 app/src/main/res/drawable/edit_aor.xml create mode 100644 app/src/main/res/drawable/green.png create mode 100644 app/src/main/res/drawable/red.png create mode 100644 app/src/main/res/drawable/yellow.png create mode 100644 app/src/main/res/layout/account_spinner.xml create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_edit_accounts.xml create mode 100644 app/src/main/res/layout/activity_edit_config.xml create mode 100644 app/src/main/res/layout/activity_edit_contacts.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/menu/accounts_menu.xml create mode 100644 app/src/main/res/menu/edit_menu.xml create mode 100644 app/src/main/res/menu/main_menu.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/dimensions.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 build.gradle create mode 100644 gen-libs/build.gradle create mode 100644 gen-libs/proguard-rules.pro create mode 100644 gen-libs/src/main/AndroidManifest.xml create mode 100644 gen-libs/src/main/res/values/strings.xml create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 screenshot.png create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..589dd22c --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +/.idea +local.properties +.DS_Store +*~ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +build +/captures +.externalNativeBuild diff --git a/.google/packaging.yaml b/.google/packaging.yaml new file mode 100644 index 00000000..c3f85aeb --- /dev/null +++ b/.google/packaging.yaml @@ -0,0 +1,7 @@ +status: PUBLISHED +technologies: [Android, NDK] +categories: [NDK] +languages: [C++, Java] +solutions: [Mobile] +github: googlesamples/android-ndk +license: apache2 diff --git a/.svnignore b/.svnignore new file mode 100644 index 00000000..efa9236c --- /dev/null +++ b/.svnignore @@ -0,0 +1,13 @@ +.idea +local.properties +.DS_Store +*~ +*.iml +.gradle +local.properties +.idea/workspace.xml +.idea/libraries +.DS_Store +build +captures +.externalNativeBuild diff --git a/README.md b/README.md new file mode 100644 index 00000000..2ff3c431 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +This is very basic Android Studio baresip project. + +Includes PCMU/PCMA, speex, and opus codecs as well as ZRTP media +encapsulation. + +The static libraries and include files in distribution directory have +been produced using https://github.com/alfredh/baresip-android. diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..34e72448 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion = 25 + + defaultConfig { + applicationId = 'com.tutpro.baresip' + minSdkVersion 21 + targetSdkVersion 23 + versionCode = 1 + versionName = '1.0' + ndk { + abiFilters 'armeabi-v7a' + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), + 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path 'src/main/cpp/CMakeLists.txt' + } + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.android.support:appcompat-v7:25.2.0' + compile 'com.android.support.constraint:constraint-layout:1.0.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..b7420a70 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/gfan/dev/sdk_current/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..30576d9c --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/accounts b/app/src/main/assets/accounts new file mode 100644 index 00000000..49528ec9 --- /dev/null +++ b/app/src/main/assets/accounts @@ -0,0 +1,34 @@ +# +# SIP accounts - one account per line +# +# Displayname ;addr-params +# +# uri-params: +# ;transport={udp,tcp,tls} +# +# addr-params: +# ;answermode={manual,early,auto} +# ;audio_codecs=speex/16000,pcma,... +# ;auth_user=username +# ;mediaenc={srtp,srtp-mand,srtp-mandf,dtls_srtp,zrtp} +# ;medianat={stun,turn,ice} +# ;outbound="sip:primary.example.com;transport=tcp" +# ;outbound2=sip:secondary.example.com +# ;ptime={10,20,30,40,...} +# ;regint=3600 +# ;pubint=0 (publishing off) +# ;regq=0.5 +# ;rtpkeep={zero,stun,dyna,rtcp} +# ;sipnat={outbound} +# ;stunuser=STUN/TURN/ICE-username +# ;stunpass=STUN/TURN/ICE-password +# ;stunserver=stun:[user:pass]@host[:port] +# ;video_codecs=h264,h263,... +# +# Examples: +# +# +# +# +# +;auth_user=foo;outbound="sip:192.168.43.98:5060;transport=tcp";ptime=20;audio_codecs=OPUS/48000/2,speex/16000,speex/8000;video_codecs="";regint=600;pubint=0;sipnat=outbound diff --git a/app/src/main/assets/busy.wav b/app/src/main/assets/busy.wav new file mode 100644 index 0000000000000000000000000000000000000000..9d0ffec0edcff56e6f94f3a50d504a186c7dff84 GIT binary patch literal 64320 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 CrTpmt literal 0 HcmV?d00001 diff --git a/app/src/main/assets/callwaiting.wav b/app/src/main/assets/callwaiting.wav new file mode 100644 index 0000000000000000000000000000000000000000..c9bf9b20811de514d07d244b76de23f1dff53879 GIT binary patch literal 80418 zcma*Q`>$?URsOlwdiN2lT&T zRZ#_11z6k!M7%^Kpn-q{B9TBe5{N_sk!T>0rp|uf)#G_T`*X%z@7_gscJ^MkImhK0 z&lq#AIai%}-OFG4(*OPcoToRv_>I5!j{oa_{U1-5rfII97d>s7{_ht~(=t6_y6cYr zb;pmNKi8A#>C=nnHyz%-+;#Zl<#(rNtjqMR=`+*&=Xb7mPw$!k_VBgkk;5-6zdgNv zy<@(9xOMlk!!zf{uKziIZvD`FU$uE~`o#Q|!w;4xAAVzb&Eaj!JNCDqy>kC+%M%X& zwS4jL(dAw1pHAyc+_AoT{>}C0<{z&AJbhw$aDVsizWs-m z&z0QAuFsrbw%$5lFMY3{etZ3e`H|`C>)$NzIov(Jb9(>!>G@mJZvExuclUq1yX)}w z`AyS{*I$~a_21`Dt$#M(yWTUsZ~El)Z_|E$+TnMWH?DV1*XLUgzqkDAdTsjl^pDdA zr~9UR)(4lr-v7()$NQh(J^%39`OfvO>Gt^*>$B&_uiu@&aQO4({<8Xk`QwK#E&p?P z;_|%1AI@)^-m(74@~Xpg=O<17vwms$`2O9yyASuxADO;TeI8$ZU$Nd+2;Fh^x*NZB z_LTjP=C96wJw0@YXCGMpas7|^mg!g5-b1W`DxRB`nUD(miHa*neUw* zo<3DRR6N!fEftUHuI0^#m(0(YcZY8-pE*2SzTZPU3Xi9*FW9~Q{El74V}9BEtixlL z?;Jimf7p0TUzvV5KY9I)={3_G(>tcO&aXWD+Wds+`_mVvk4+ViipfXUe_FnO_}S&x z4}Y*6<8gTPQt_C6SbaY+JviTUc<1urlKGwKvD35G-(PM!+%?}hRXnDrP8E;oZ|C<^ z>??Y_GI(ejk(`Ri+^YIC@4_lo_qm&YHzyIjO$efLuFnEz*f(*C(;uR8ye-8&8y zkM+6h6PN$lf9b5^u~a;kj~qU~``-EE&YrV>`EvVI@z}j?|69vb)*nq3kHdq@J?lHC z56=I%|Bu}*>#s~NEp8m+F}-kl+PvTY>)9vI-+OlN{+{LG!{0C8IIO#;pTFqrP5a7^ z>CO9>oIPW|EZ4($LyZ9uXq$=@0?$Mc){}2^(WKU=f7Pan(kTN zxqo>1%=E2wS)Q?f$?nZZ7QJczqFu$q{Fv@t-@ANrU-6ipRvf&@kLjg_#Vzx<5C5?H z;QpPvd-jzd>%UAtUY=6ey>7bmaM#)GH(q}BoWtX$?=4^0AM;~=;P4l_FQ5PS*^>^> zonAG)ZLa*7D<0F6=E{%xu=2$@mPy##AE%B z(*LW6-`iC@rpk}`h3hZQ`}JR^PtNaKD?ci?kNL6w((>Z{8Z||FnE;t<2xO>-?iFtbT9R4JztLX>Tu_BeSORH(&<+dkM$ptABo4V>ece&=_%`PO|MJ6DlA_< zJ!g9S{Jq2HmyfLXO?Qv=YI;@0qVi++s{M0!Pdfbf{N?p8<_Fe4o$p`&e7>kx(<>5> zlJ(m8`RmV5Kc2t3{?+u*a?klYuYK_RAC_;g*XE0QHNCxf@;k|o!@ur6d3f)7&+gvy zKRf%>;ooaysd_cNX-?+9d98YNSkAt6oPTXsQ!+*EV_NJc%)t({%QBI{ry#CD?jSI>eck?Rm*N)-m$)| zYTIvCPF>{3dUO0J+0Wd)?8dFPT)%P0?wB8kpDY!Rs-5?&_s%tbEZ^EMyULHVH=n<~ zc=X2U#mm$8>+T!-zu!H)FVFUsAH};GKgf@&MQ_=?bpI>6TMqv*{o_*kLA^Tr>Wv?r zJ>~FQ^XoD)uD30(IMnzteQ&LJ?C;y%UE{;Y_cea3Pn@1Nzp850v0fdXyHq@uFCYG5 zdEoG;%l$RheBtoj-Q&-ny?e#swu=27)9a?^PfwYCJXJiF8b69@HGUlaW4YzTx_@uJ3O>d)ayA$Ml`4#`ERA^SiG-c>b45jUP2O|K@Zv9@DR{KRbVa{imu^$MJmr zSjLZijUVeDOmAJ@QF-*58^3Y(ISx^=Db{BW%} z`VZ>|c4hUh#*g`{(~sAmFD@U)^ZE9}%XiP&KW_KE{pWWdIlu4P-RCuaOkZCAdwSCH zy!{{U-gdZNHS1N=^VTO)ucnLqNIWWz&zW8^)%a0W_H~CEKMp@yDjqd&$jJD?(t8n) z!&{c?m9v!}>o4wV{3!0cce*$AYN~i-{MgrczSel2{8*lGzFa%z$N9a*qW7$SGk<;k z$z0=k)$*!W`&*Y9KdPpD=lrv0AKq8Jnjbt=JTiV1-!I1Vsq!Q9tNDxTN9T7{=GS;$ z=QVy*oc>^bYt2;NHdlTee(vmtH~#so;<4UcbAt~}pR0MoW2R>0&&uxnPYSySw%kkLl^<$2SgtKR;Zvt9z>+|K0p=>v_#zUbw!YxOmrc zoL?QT%{9MTKTv$VyLfwyNAdU=kHYcx>E`@us(Mvp!@H-CFJIpO_pZkC8po?%t$#AT zYJT3~iMtxlml{9Hv-=r84v$-E{HQtF$#~BAF;_fFca7)sON$#do|j!Uek{j$Of|o% ztp2m*IDQ;{Y4_suH=f;9xnJ>Ee|fjN@y%@sqX2kNqDlsj|m< zb*OmkKf9}V)a>Db`4crJ|M2j0HD7x5bjNzV=1+gH`}N9&%8#1oR({m)M{BP2{rL%p zU)#NMfBXE7`8a+szpDNZR7J1()mrnb^)YkJucn$gR_4FH>SWD#*RL_ZsyX<>HMV_o zuKDi#yXzlUPFH@+$NBE`jrACh8bL0_qvn{uSGBw1;rMZQa6XRb(^HZknP2U1J3G#= z*6&VVm_9P!U$y9g^)IF`S1we&VmzPTcKE~H^Uj}mR^xd+dtkZy#(h8Ykw-p%_Pu?@ zqw?$a{auC9Yg4c0A0Pgu<_r&}5}$wItmap9jpxjFGoIJn?^v%6$N8@H>aZ?PKOE<~ zySvW+xN1PfWBq2{Kc;uC$9T+NukrLa-@S3iwaO3XyYqME8b8h|^UtbY?dtub=1Ld! zYI^JR%Bkj8>+$`A{HS^F&G}W0FUS0-_mwBtdrOVy^$t_Bki=v9&U~y_m50aokHZUg zPu(BKkJPK(aeh_y?dE5!FRA)k@nF7Ne%y@5`rf(5kK*1hp1ttK8_wQd^UGT^o*%C5 zzP+#c)uCpN%R~F)e0O&oKc-^ZQuS)C@q9hbcjxM0U=ecjdcJL{ z_rcv`5A{AceK<3f!vo7F_LUz~jpunEoZd0NwQABa9&^19?%uVp`PKfT%SAjYR&Px_ zrq|T`_~&*%tiH$bqhx(}|JkM9Kl*)edHwzvkKNbz$N3fcQSV0=`C&Zjop#Fm$Ncc2 zM#lBM^^Wy#HCEPmUhiEszp9#jG2dPPq22|mUhOI#Ro{O!S3K%{A(gn^KOE2N9j|7E zHGlexnn(TjT=U&}53KP#^{R5E-Up{IPam)O*Twtb^u77<)wjkE>ecygU3YSM#fyC)Rwo=8QGJay*~DHGgJ*tXI=}c7J>0 zYu6q*uX=Sj&ac)QKYTx*YQDSNvwvV$^{VErl^^xaUGIbI?aR&g!L{DcEAwx@4^|yJ zjvw{jc${CYKiGZc#$VQ)pt5@X&|2>wHy(4#vu^zUuHHY^8b9*>k@;2C&6@A7_wL?* z{^_%C9hRDR)cCR1_;LQmUCnpvy|&`9{#oVyJp3i+Z(Ie$=W$)vKk(^XY%) znqTc6D5l-N|MT4!_BFpcJUjE4q;wR!u##*do+ zo!2;5^Q*kYE)UoIu;y30i+WWv-anpi&ad_lpS|XqvyneQ(3)>QA!HQ%ioU-PTP zBkv#cC)SFG<44WXkMUTlUQJ)DdG2w(oAr`fKdJGY_w$Ndy$_~d%@^~lsp3&{=>ObR zz1khe^Yc5dz5cx7(c}5y-m{9wuHFZ;UUI1MW4?I*NId3x|42OM_syR?9OqZ_3#(3V z=2wS$|2V$I-W<;vKN!#FdLLZs{bRluKMs{2l?zX*G5lscGJfp-r{3E?Uhj*?_m6si z{O;M~Z#?_jEB3cd*O!XNQsYPE-dCp@Kjx}ehY#$I^WB?cZsgkFC~2p5}bF?yFa>k&@Oqw@+kxK0dkJ zyIZCAQgYAM^O7I?@+>xCFQ&)KJm{^*yz@bNSTB5s7XwvV<(j;&&S5Wr&)6-m%F za-a*6_)KhK2W=YBMzWEgHi(}W8o@@qkWQOCJ0IAhT6fI(?RYY_| zL{C8hzrw1ekjlOM<$BZ?yGCtcxX5;lv@k1&E#%lWUjswFJvA%)e%eW z;~CfEUp&`W`hYjqk)vi|M~f_rB>KqkWMcRZJL4ajaczC%7}dlklH2>M7!{dX0VmXq zJ+OrqoxQX)3i1_HKwn$Kp{4Tf{BTRzMTW+zMEOSDyHQ?jqcvid^N~F~i@rz0Njy5z z%8x}_)n_Bew@+=4F3_h%&globWVKe&56g2-2AeJ0SnChWBfo=6B4{O2SK@-!)2toQ zz_X4Qd6LNF9!Tq1`yun&KjheQJjQ0O$4Gmxkp+(tU##lv-u4-FY{r0|Aj`C(a)k;OJ_P+m6D|v@n>CT&2&1>FXt1K^?o<7&g>aJFfYTjQv zL3tB%Cy15RtQ_sHoqfAjIBRB8@0c~SnZ8;%=W){AR3tX3+n)tlJ0S~<$j zL#<%mTeHZAYQ?`+@(#nye|}l*)EsA;*_o?1+L~!j^=5qS$v^pxpLxwAZ#%1*CM&DV zG;7!4xbtwRmAqQrJFeu_Zc*(#^qcYeK)pe{vsR*xD;3ML4mWp#*5k~--p*_1q1MEX zD@XNaaRy}EB3WBS8p7(l9!dEdJCzUX74<7Jl5I?+Sf`&?KHlzSGw0_z8R0H zR*ufTe*Tl)QxCP0H(jiBFVEUP=IlE+K6~xM=f^kW+Ufkt{s+6-d8pO7xq6$d zoznTm({W|B^8a@awQ{ttmG0~Wu~JdHVztse{q|BjrDwHMI@L~T@+0-C-^7+5?k`sI zY8Crp=Q{b3ozi03{kxBy*UrOQI}g(?=+X+j8m^_*RbMIc3$k1PPKDgyS=rtdj9uk51-dNjXT%m$5Jb+)2(ymN7ajp z$9fWv<@x*9p50mdPPG%X)=p`?Rej<7&v&(wmwHvW*PB>Y^5%Lo-o5So56_;rzo=KN zRAi@gxu{pQdr>Q^m2VXfcOLR)d^pB~ow-`&y{l|`Lv~85re3@m*V<~m886>hS9XGG zMeI0!Waoh|39>VHsCreq#*bvByLOR}`BA(4wNsj%hpBe1YYpbX{l!Z6@|*it*B1iU zYiFUpB-lOS{J*Y!@y18bYW$eqwS260=`QM3tt?%ik6#jG<)~IUYUQY6U-77~6aKSy zVQXczR&b9yrM1FdJJ*M=?f!QEP_0rOcY-Q^m#pN~%6zTQCmy|XeO$vouH?BBRJHo9 z-Oc=%FU6yG9*W=3sU6RoD;0@H?NHa31k>}DB{Mres6@dDZV7|GsT6N;vGY(&yR_0hen~Lb zN=2>U*UC|Lf@+uL7k4#&)T-IdouJ-%s1=>sd06X9g8i_Pw|{o60M(Zr?mXm6f_&LA zJul<=u2%Bai_`Vypeg0ge%N?w0Su-$pcmmTCsjcXVAv9FcY^V)gH z&Rpu%`b+uJru@3dkE+cVE8WSDUG0>fJ+iNzxxyx+-f`uqcF+EE_qp@qPHFO^R)3E1 z$j)4i4L4WvvNJco>-J^Tr1tRp7Y_#x#O1| z)3IJvKHmJYW8Hjd)A>G8{s>^%4-!Fi46>|Ezdo2+!#3g2=3m@np6hg#`A zfBD(%>^!U&Uv|`-;bNtGzF0XrtNf^u@t7a^(xz7AYv=m7{&?|ahdU4KlqNs+-`w5& z(xz}Y=Eqb!rLmg%?%89{D;~A;U-PSc`BYy6)Xqb`>{#yDAHVFVFKTM1G~>s5e|?W~ zfAWK!IpR@yRO5N=R@9eIH9xEUlA48l=8kUlQ=;Q+*v!4lU+o^carZ6v z-8in~<;y2`9z%p8qsE4tU)p5nVL9$R@a5C~XY0M>Vx@bnFFW%7k)4OUe=a%=~xVh4OsFiMa zg2<2UPU(8F(p_z8r!-%7@Fl_Fz8V{9r+1qRGR6C{9v0i0<)%mge@%hi6)%Jc7l>0*_rdpj?}CA+NS1L^(E9relWipzkDjJ@2l~s z@?&~z-Uky8=DV3+@#Rx}%~|7lf2ld{Jmkx##N+JV8XIdo@AtvftNG@9x8BPxc7hns z>x;3QUq1O|$DwwD>b>Gvuj-4M+L^oj{*f;=5A`Kl?cg21w5cx&k2`ZU4%Ph1ozms_ zWnjMSs2$pR|0qt>&coUDeT^Uci}_XF2Qw>7eysmq^Y*9vWngxK>OJc?o-gm;SG`&v zT5EoF{*$w(p1#4qc;!7Lf&+F^gA1+Vc*OzGf8qbp-d}&i(JJn85-p{iW zG+mnSRt%5h$4{T{9)40b{LQuZ+^Bd=7vslr%#Xaq=6x_<&Ki&XaVN+xpXxpMV!pep z^^$yPlkuZiR9^Yc83g7T%!p}y>>FKKH0m@7Zdo>%W3Z#%zU zzZdTxHSapkcdOm;%h`HwdG^^WZrpY)-v=GnOZGoH`|9~$ojp{0`}KZ4|KnWwaaQkx z=0|;Xa{RI*U!v955A~(ZQah#NdMYbgSp#zo&(*haC6cv9+Oqz3u@ZK3=VQBWuGDDC zkLzyZsvWC~tU|ix)+>&z%CobQr|!;V^%4tQ0nHVwb?!)HWmt>zL@ThQpY=*~pCRpZ z&5#ww_{jP)`xB9DOV$xxv2BlS;kt5c>y^a0R%2aPchx;ITz_xN^;R6RYKzX6#O5VW zWi2{i7VSHd|nzHNuLv18#XeOoGaIJntB!ZF7F?i+rBT0HVJ|Z;M@HNGmfD3)&v{Zu*!OAO;`DNRHmMA6OV>v+Ea* z#6nv)>WNG4@)Y^nN5s`mWD`~OBZcS5Vt1Ui6^}>R`XMh{w#fAneCQGDMkc{`c9Qi< z{2YL^oKqHZqMxXv zUyMgapGwsZZIIhr$(QxXl`$i^m%rgJV@mJ##ik(J88+IL9Yiqh9s95ce&t#2BLPXx zol$bTwHXA0W98sZbTkth$=r|p;4ZiI<`i{uNOU7juiB$jkX=a{QR=6# z)fiKg&{?ShFfGoanFMp9omgT&!iA&=c|HgY=b;K`i+Yf4hT-Y)wdWmJ{7BLB8oW)Wy zOm=}L9uU=@t8ROvEu855qhGwxGUSac(0{8WS*73DMpS~`c#THqz#TU%WPTMM8be}d z-PqcI2IPZ!Y>yQ|By54vJvU*--dNJIvxWX60#pm{Y>(;99dwcvFfCQoXR+xtjvz)x zbnoUFXEIH;(cY-xVKCH^==40=L2vx3u5D_W+cPcgx4z5SgWpOwueR2j5wU3e(K8~I zC)gyL;TD`!qB86Y)6sw&#J0XwIt~z7B4T!fNu**;WFZwSU}5+b)&&Q9MoV<22NlRK zF}GLn1{_cM-|X^CzE}hB4Nm1;jkd>EP0s;KD zLRgh)rQViktjRN3sy9gPE6>c0Mn5eqbU%3=-X@mAg2Xh2tCz`ZJ zH|#q-_bo<$VY~fA2#wm7V_P!nBGTSzyZ`^4jag^)0YCajs~ly9kji$|x@P!A1;G~m zkvZPInpOB0ozd93a~->Sc0^0i!D4br#)DY2pWZ<-_q7!{WUBd^dq&p^id2|t#I=&U zR1(mE`8>xbFhyJZ3mW;QCYZY|5ww(mcC%Q2lTE~CJBFrLqtF~oziO>dg3;Mywb1Q~ypnsnB9eOA^_HTc$iXf9Gbmfit@Z645zc;X)zQ!(Sy$U;1Fj@(bt zWjwHHv?q7WAkbwt9_j75$c=X+6U5uoMl`HS%q~l#m#j-);~#0-#<}vn+mX<=t+c+| zEzuC)sGwk(mg3hujx-RDX4|vEAqLGR-;dFXt)AyN-oc*S!ShJV+1O6q-4hAK2nqcx zv4GQ;(LoEi>TizmxN|7i{8Eb}$1EMsk)ZxYHoU>+#5%EWY@&M{BXiD7FHh1M+k31q z_TJBRTeCe=Q&$=M!0N~}A8kSWsU_{V{{Md+^`(8p0vY7kBa_7lKBW~s@hyDIS&!#k zPl&2aX!)X+mWdX4Hiv^LK8p>^8u^7aFo^crWh)|+t8UfUa39}dq4KuY;3>G9Ij6CN zhZ!+p!ZvQQ(U^mRGICdrwEZI1$Hw&0&#)5Y;%DsWAN1fuylS+&VniSDMN3;oc9X%x z1XMdd*!t+!owk%S=*!bcq!m#L9D+gM*r| zP8(a2TD0PnYhL3O4C|P37fYgB4)$4d5^lhy{56i`o==I1)kEt*6X|&tlskI4)7PL! zzMS^c3;U|gdSbq9Jybr{xSM(77+anNYb@}+k6Ii3o!N4urT3j!BAR_>_2FrI({`J2 zr+T(IibVKov?7fRa#j$j;1-)qP=YpyBuM? z_-l(*9_GbktfM{Hfx~v@lbG>q#;QZS``EEcbkeJ_j3443e{2hi%{46ZO%>~q)Vol@ z4%|jLxs%?}YFoXF?db!mM71sII3|MGPtQ8?cJBa5JVWm}jG>$aPLiukMQ_$cvTWYz@82Caon$vSWD~En<5a=g8NO zocT+A$X{fJqa9z)`nqGDR`F!}OG|vg*4#mtk)~(bB$A_DqwPqx4NszrJ7RRIqy2(S zL7qr@J!VE%cP&J|l{7Xa3XM)bAzJB&ZPZ#(ffej1tA(#7V)=;A$ouiW(ckV$b64+S zQtn~R*>R7_mESM}d|F5BkA6opGnyEQKXK7_G2R}Hs%;bJt7mfQN7dusRIrB;X8a;@ z9bs|h4p(r=I^ek1KFE^xucPf5c~1+Fpsx0}U`BzA0BaF+JO!I=B*_O*>c}{@`T~DjoA0VFboF6Tfb?vX!t^ER3^lG1Su(PokF*Tm-+Yosyh_?8d zzi8GQC5`ey(acO7oylnZ)2h$Wh3sJBA@|VcP zM(cYbr?l3Wsu;}s%Ui6tI%4({A2dYBQIna2e zSI5w^(PR3cq3?U9RdS_SthGi_hNZ=JAAO9c=ZpZs-W4(8gE#|bOHQs6il_*$xwvGQ76=KfJCHMOoSIW;7);AZ4t?V??NFeHw9v_t2 zZIM1ousYc~-e8@xu6+OE%=pxbt0f@;#H@Plt8>ti0X?(O9xT;z@{b$|T9=s#1AS(! zqYFKelrt=*e^AaDt*PC)a&BYRr;@wx8ws|Ltw=>)%hETQ1XJKnY&5=+iF~8oM?6vj_pyD{CIg5W%z%Yv6uQ)+H<7pPiw4_at8vIP{i0o-M*neK!9Hq0(5Jd!H|Na_ z^x&mPL?fQZ#?!H4>kSso^F(T-*{^-VPBHj z$Ji;G;+c1`tWj4Eel#;V!+Rn<@?UGvp{7_zD>J2ij2?C2Rqz<&*xc$70n}_IpLi}t zt<|i-7f>Rq@%nOph>>1+Eh8e2^D)ZUEu-{ed+ev2jd=B)=uJ&jdah~NSj(gw8y9+B zHIA7*WJQl&T{FNGL}K-LHr8Z0O%6pjzaUA=$ikn_Ew7Q??b4#hdcEIvd;Vlfzdj#y1M2@3w`5##|i&Wu`{E#7`b9DcTW3K zo%;J3t4j3g=XeAsQHyo+#TeJ)1)ek3jCCRs&G*Izq(#arJ=Y3nM&oxr*tPW=IrKK$ zt>LUr>5b9rh&D?((^hyU1JnO1MmFv_v#-*XZIuXa*h)*INt|-85wcG#&=WUU=dK_CC4d0>bu(fV6FoI?icEcK2k{0nPEt=mlkRx$PdswQqFeY(SkK>V}pCgp9$9km_ zRqrJy&4!%wE#N5OGEdGgG$#h}O~le4J}4bsM7U#kS_kZZRcr2zErJ*5apqr84yW`R ze%ZJC*`FgLp&W^1D@VR`!dBu<1k7G=A*-W1{iqkw2rgO@JnY9a+Iz2`;#uy;y0j8Y zZISs{k51NbeWC_DMw2ntqEX|i6_<0@*#h3;X=~Hcpd_07m!(vL z2>-zz8;LEp`36b-0TJRXX0aP@Ji}Y;62s9ad8IdF z%sG!m%uFKLx&{t-Y0bOLMEG#ZxJWU2o;4nL9&UjMUA2qssaJTKr($k=!E>Ie57DUJH&qp=#1)iSN+ z8EEM_R*(0#z0`lXy77cjK(=6oZ-f3f{$@t752ns|!gkjXU^9q}u@PV4e)Jj-GfSQ)`QzNMtzqVrSimD?u-$`&a0RQFZ(Zu z#X67!L(u|tH1&*C&$K}N#|U*sY|lmKjH+HogtQvV?J;Q796T2Q&a!1YRG0#M|DO=s+-@2h6`Qq#|-tX-!%@U5+f-O->e+h?#4>uKQ~+Huu&kmzr1@Je)J({@!aPaNyE z@4CT6?liNIcv?;JJdrcAa@FU}rpsqWXVl$3hcQ$OvmsYVhHuV8+Y7P}o*M&>jWgK! zbVNx!dj;H?Re$+}Z>K)C)r?1x3WAAn7-`&$+=y>{ihc5K+`SOnu~N4Uqn5@7jl`*$ zp*`D7B>}sFz!^$9rjCS_IV%rdl_P_gh4{w6Oh>>q4=uR)6gEb?><#X)K zY(F#otWXCBYN2bp=_N;k;P|68V->mTIk@%{Y{$FNRx5&WM?S4bG?By@)3)_>KZnWr zT3MdLA7?j=NnP8lYrbE>lg3)h&;U01n;e6a)`;LZ`W^ez%hqZTyM9V9eMb}h;NN&h z9&_x9o0h!6z+kMA2hBG<>sW{dXgWhV9j&nrboDZ_^iofKrp+BA&Z3ubA^B`9Pwj-! z#>O`%Y)>Dv*R#_sY-`{$)@VWE#4o6M9r?tNqfu6d`aMQ_eBqsxoz7;o^LlpGyboTH zADj85o3_8DkU6WL2U-1h^xM$tHc|h)3hS$f0&{hKy0`>A892$O$jDt&|Egn~~j0Z8F*G zSnpd)=W*K|?9kkdZjSSAq!y5HBqCP&su!`|F%@Qv+HFOR>6T;ydJ;X+m6?zBRy@j1 zZ)Fb@lx#Y|tKSC1N1@ynBKgu7p)S?$bt z>!7SgW9&mxOQU7(V*$K(?tHmNG!eD;%2m$P4fDDJ!+7Ei%2XL<$jG8^Ywa`RVzeDaF6PY+K=vsL@ab(9a-CYq}?223*I;1;H0ySaaoa|XEQ`j3EaivQ)Z9<`UEWKS{^IYJ{Fl3u)^3UtH+8?2EmXp z2G#@#Ev5FIz5|Izx2(<=xQWV$!-#Bb93!WN#=4`fFR+OFRy}ZyUsoZV_!%LN?N1PZ zLHtE-`wkDVc>A~C6_kM|N>h>u+e(kq4y>_G#%(RlGprRs8KzH(QfJkc?Hxs8o^Mqn zjmQW0ZUKK{Z7P@9;$36gBO$2b4W5q?(z<4oExYcGo{IBTzQ$fEDYK49x{4pj3$9>7 ztLT$eFfHxKi;+v+o59XVWYRW5Ne_l!%T z#lJ^k#E4XMVJ&CGITpKP3@^=>W*_<-ZN?cP;}g|HRLor~jBUs&Q4{~Rg?0GxU!u{Y z(SCeDmllrCx4D}qR=Y@R+dy79T18u!(3NeAqhpBK&d30o!B?5+rdH=)31Re4Ya)$z zv8nyEuXn6p>7kc$OAoBw<6O4eXph>`Yh~o3dUR86B)FQF(sQC z3D)$r78~Pvw`dP8pTRI93JT3nS=chQ2)j=I#!uMgc(TP3UCk1FW3`d@a*+fR*IygC zG17ew$6%K}j9T#8x@{J2vCzk>WZ4q$^f584XFl5=gTK~LWpn4MmGF+7wr-JxK}yS&b+hlG z3Cj|ptFkq1(j$m_p0ikm-{6|(TgmE6+x}@Q?V)!WyNF?DTy!8;oN{ISxu+M*D3Nk` z3^7Yu-pB`SJ@r)m(TL^IZ>>{8dxvFKP@~>bw6&4Ce0EiZX!|&$&KecC%vHxZy6m@| znP4yR4o_t)NxSh?UzSzsG5EpuB5p3zd$%9zdt+tr;mGa5-T%Ga<9+KIKfX~ym zqkDQ54YaV8I=dftV7aYjwYY+a6-pV6H0{g`ybi1VwMLIvI6e^zW#$-P`z=NkBdaC1 zM56`DYTy_@u+k_SE9HAV>d$%b;qB7;3u0Ii=|q5tAjP|V?^NoDuR3Hk5pH{0N}u6P zbhrI^+SvFEe|s)!t7rpZ>RHR~>uuDC2w4%{IZxJqt3H`$Tz)ztXzhy8u|sO()fHKIz?MihboXk^CYYzIADqZL^oGS0r^2iN)+@4Ip| zn%?v279m&Vf(3n;q2Qf;z#>=ibQ>pU?i{J1=ui{YfXH#)*yx23;fZ%`-CQ-NVlO-< zisZU6wia;LcFnq2CZCe4<}2;<7tcqjsdVh`%SUV_Cz&ZSswK<8Z;TSm{c${F`XK9;u}u0WzkTJj)P$ntIes2ksnvr#bu z#;RNA4tHCwzBHed3fI_o1n>R}b|R#gWC*#d#YV;qb>0Gka(;|E_A(|mx;YaqIl>)$ zQlD4ddOK%8qH@Wecw@GwpZ<8RpWqk!x?Y}Q(qm(vVRtM9{b-M7<}F>RxgM+6=v8_< zp9*KOru~6ovWv>3hU9Trh7DWBFsEylf(cn+%f_UwrfRgl_}gzVqjhpj&%l8eTaI_^ z!ECG%)L85kms7i_da-?rW!h;eRU^;c1Hqm#%ASu$5o%;Sa}?lO=0y*Bn@8{*#M`26 z|MqjsTu~%bbJcT#{6B=?QKQ;&PVJQMkx#9W8`zs%;Mrv^a0l7(AZ^_}Ru57eyF|mP z&-@*1wh`$ZY|F8<$Fec{qYScvI7UvM1)t6iu5xF&7(vMfa}h>uy&L;eF`4I}CrGD- zN6s4=b4M@LV3j1B(<*YbSDnUptb=NR+wve5kT>Q${a#wb>Z!$L?p|MeD zZMJH@bsX_R6lp2@L^nQKQ^)UK@Fe!7#brF;ES%ymdX0=&(KB+IS2-gGbJx9~%rLOg zQTp^Prcv9MrppS^|d|5<5qU!BA2kmtmXfE7yagqX#3y7^5#H{ zmEskgN4k}GtgcoG(4(^R9L6ArRm@tTSaq6p<;R*apw)L6O@5sTR z%Y4q*$2t$JOT>{6%X2r+Gou;5w1P84!OZXaFzSh~v739NzrL;ae}9}f%XPVD9bvp= zKCOl0QDkNF$boKW<#>w8LQJPvW)du6F}c=564EW#42&&*La&l z)L2oC6uFB|#wP9&FS*k7`sy=1BFADC?CP^Im+}nuAgxjKx_y9g;1LBC{NNC{qWqcz;ibi__X6s6+)Bx zL;Fpo^cVG zu@%;8bF}C+p5R5}lDqtLJd#Tw$XT98r}0sTM>*^qq2GA*G7`3}qQQIkPlh$$(FXS7 zls2G_?(NgAVj_fRBP$avs`Y4__MshqMs|AyBat`$6*Um*ztpR-DjE5axt$zJjxds_%Oa##-7GD zEr?iGDJ@n{AHi9i#+ebCnoS*7G{jQ)0CR{;?nZjcjXxRtf2RJM|NQqvwy+JJUdBP6 z;EE%${u4hvkH^$ZGceW$ZLv%4#HMk4;aZC>qt+g7`!#yoGi{U8;MBF;`+A=1(I&6( z741O*e8Clst~fbEAs?JCjxD1LY)^PFEJNDbS@gp89**hmJ6{+4;>DN;t?I%@VGd+NvbSvV&yoOjM( zt@x)Eo(CCPVSCQ8|Iwm6J{RZK6T8PNa)q&t(LXC4Fll@fp_h0d!PvyYMph2!`&i$% z&)~rL_o}Lq=Ob^agXlBQ6LV&-)ZNaVu;udTZWQn*-sB8DoQcwi7uJoV&E=Y^tVm>j z!P`%`(_=#O+cQ1k-9Wq0p1+;>r)O9i+sIR_OfC?8cp2}Eb-!=4e4@}EiYM=NVAwcn zUvx)m^Gu1s61(+qTSb}`W7d*kok>Vf3phsHnps;OV)OV`MHIFX!_)q2T*g?AWAZ6( zuzq~sHCIO*5-~;>-}Yj4ECDOg!Pm3~C;B8Gt%+crzxvHF9)K`?%v$e*4N{3ybmXad z+m;|_ypHVrC?(@Y7?$3V1sGhG(BDyw6{g!Y zV#Fm;=seoK@5^PXY_6`#zS!8-ijp#2^=Pc+;3&O0*j5?6)C1lRIP2IDL&kBw!6ow4 zJfb5`XlRVVx#LfKshrywz?j?{?>B?dkf%fujKGXL#`zORDa0sPhnM^)p=H8^Q|+TP4DF|KkdZ}c$f>^!$xbJsCMjatuI)$ zy$ioZCzh!%JaHTdTF!4o8;i&UB*P)NxP3Zaoo1c<+wzAi=P-^&!3X`ZRH7cGd=LlSMhA&ny}(Nu(UXx!)s5SYWn> z%lMd9BO+?ovPLLRf+%sqUgM-ztQ0Zx-Kqq_2WY@CC7s+zg?~5sR-c* z8D>xXlP7%_Um_8HI#Uo$`-M$GC|>7pJUxw7TWA$eTUimE^g|XJ(9d|^_<$d%s@L9l zds&heD{+i17Dp03L`Io&^f`XyE_;VPJ0_FVBPWfp+K`vKBAA&Akw_e9H|p1hM$}9l z+oBitMS64Tl%;A8zHn2d+SbmNaZaQU>4pFNd#N2qbBJuPJ#UNuG)x-Rn|F;n}fH#NCcgSz&ZRwf( z#^P=6r;S#{U#-Sos%(7sexgMsu^)YihE+MO^_(+fNPlKrzL#p**alW?pKwL|L1yHD zUdEoVn>ik}Nn6Agq@rI-w=MKmJYXYOUG04$=`VidFMcK>*pB{|PSqu{+D6-EM%Re; zT)$;1XpET={MvVN-+OJv7&USZJ0owj2evDJ%U+n=K9AQRB7fkQ+D~~C2{KT-9Jj~X ztY2ncwj6Bl(}OBa1+aQ4v#%RLqJ4@TcoAi} zoVg8|9E%(Oo=?cuQJRvd2eB(XVMZilbMA;(-;F$Mu#X6h+SMQ)^lzqsPooK|#~DRp z?YzC$Lpo!yA#y~-V|4RQnKydsn9MPcWJjZdq}*rKCS zJtI4|oJ>o9Y~3pXm$6P8t5IuFHx}{y>L_5{=mCAl{8K|DCH;1;7w?+H|RWhov)YkC`v*HbBFb)Y?A(MKPANiy{@!g_FES%9a zPsFPE*cPbWXQO3X?_rTK&M~~OK4}@&`Zvds^;+WdT%WcfGdg}EVN|yx{V5Vi7UR>W zGKrBG>$wNB;cL!E--x!EgT3;>DnTtIqMf-s?b!+PFY6_aY9|JG0z#lIXTj7_f(W9S zC|E&^tzM5@>^uV3p6`vo{d*=Hi_M<3ylLdCQC;&d7$^hJ+m6_#wbrW0 z$MgK{F;dT|&AwfG*CQM>Zp>PoQ8wR+ip(%#)En0CM`y`!gf7%%l1Ddck(Z#Zwi zycYi)#}R8ArL^XUc8qA|aG{L%}L zd1gG}$QX0phI1e8hACoCPvoEh-dz6MnfTMs#Kky-$wZqNSrfN7z%W{BXPA82S7sm) zc6FRYNgKe8E3^k&YU+q*qI6Xx=^2Z=4rA5GK)EE3i~!t|Dg0}}KdH4S{=4(uk3Fq6 z@rv4zm8%!`k5>=xdq;l?47#dITl9`PBAr|Hl zePpYc<`|j&?Rt++S%g-#Y_o;ywrLl!^jFV%or>DCUy(-gokC~!p zAUdwXG{(*UmSJ4<`}DZw1GwQ0H2@54MKn9Ukv={f$4^_y01*Ro>|x~CMnym6UgEEu#OJc4zSC9q@|lc> z!&a7H7tFAWI^xU>xmIA}(pc~mwtDVUu1BdYKOUr4u`@le=JX71z^Ncc{x;fL_UOm7)z;v_yq9c*9kghfIkU!smzc$C(A%;Sg!?IM zZ63qM#vL}nl~{ttV8H($pd&gmm2-W;W9DXHhizkoJKMAy%d`idwZ=Hwraf)T+eZ=T z)f=LOY%vew;~MZNNlQ;-KI#>jo=w3$>=+{z5BZHB_#j(+;!*zQT6sn~J(FSnw}{pg zMk4;kJFttb#Idm!N1o{=ch%PMFm^_v2kaZb_4eoIKp zZlz~f1hO5;ma8T7MOx#3+Ro8Ed8B0^*nOe}t)Ar>^O?>wm`AT*fu^>$ebGbPw4Y;r zZse>Ioq^;SmAY6&qg7dMQFt3$Sbe}@6_2?#7}JKR$W0FWzaw6u~`J~jHHojREXKg#aQ0f zQx$n5a847Ch^HB4Hl^QX&fp2QH^%B{ZC9O*b*L>Hy=%`!QD#P-IQ9`c{GLf}H9OQ2 z)SHjkwzWA|qqklKW!BD_r)XE=pL4MDO3QK=T!~Wqm}_y9>dn)UVd<;A)QC|7$TSw> zn`3*9{X|1~W?ov67kFpPf^J(Rs;SUpW}NCbV)#}f>dTv~%{7hz;_MTA%y~f}kklN4`AzIf&Rte6S&wM{?q-CbiSUc9Ea+ z<}XplJ2Am0d<92YXr}b>a%@C?v~{fC;5@EhieXzZS}2OJ(zeu^ex^n7OrJoL9wIAp zX_b4lj;+L8f0{w*-+Tzdsj^+q;Rs&YJMGi1|Jwm0V5GW!X&KfSFPV4m>F@Z8 zU*-(aH{NCtI3zxO7Ee14UV(sD&4NhOYW)Yvtq-723t|!*q6c(|19*uwIxpvry+nER zQ46(KTwn=y>upCxR@pliQV~GnvWJnU?Z_kF@j%NsZZpI9v=`v5ZF1F|M>;WzM$Wbv zM~@y7kM!cM|H4wf(~$k>vSnMMM@A#p=B^n;FZB^ivn?7=b4N>0pBQEAHeSYt*6>to zT2g#tEO6}9GvlIEc+Hi6@riN7szBU=Jra#V$6p*A(_#(0h{s|mQ?Lgq$kZ}CjXr7# zUu?T~<~+f-?#sxEhT1yx2MUD;;N(-zR5iruduF~~GRuhHPO!3MQY)^S$ zAMrRvT0GhoE!1x$#A9WQ_=uXen8m#U0>VV0-;urB8s~x#h%Uu@u5#_rk%*! zzGbRwJc6CJl*wCc5ujXgSY&41tI|BY8P<6j~OUes4Ljw-pvCuegb?<13(iLs8Ja6>P6vFRu#ACm9RXd+2m^v&$SlC9j!mWrOXwFkkCYROrixK6emM@OE- zA~@%Nhtqrl?fhk)*gKZ6q@Tx{_>Fa9lz!L;kHrXm&i=?wGO8ir)B)(8XUoQ z%ptJRm8?ymv$UWkNwcA$S6aV;3K3Lz8 zXC$%HI8&R9X>c??W9CN(BN!_Id6s)y{^u$>JC}Q&+PIL%`5PPJ9o3LAFp?uT?X8TA zqgQdhQNix?8KcEH8FwlV+tH>ajcofC$yiS|U@i8wG2Hk`igRor^Ud$%`;0 z)z*kNE1eHEm*lnh7$GXiqvd9Nz%KI8xPe!CMGp8G!(4+E7@ukyyTi7O;M+3Qinl)!x>)0)61_A~C_Z;!87=LjrH;Mlt1 z6jp8}QWGx64YbFM5pOcVECSEmlO17Tyh~sGX`QDvFRdH*ob|80f~p>EBgxvq7$sPx zEiFx};|0<@YHPGbH<1BXX9n?3PxY?bjZr_n+c>q>ZiBV`#MacN)|6_TSx5exdPgdm z8H?#RMu_+Yhe#nNv9r;p#fZN#CjyZ_;zu;Mah7lK07>+Uhu+gVM;~V-{EI)x8!fk= z@!7IS$znsRX2mI@v~R@Y8?n`%*7N9bz&l%NL(oZ|t0dZn=Q4QPR(;ALQnZ12%(?k; zmQ`+IDcU1$9ZzaSB=j$gqW8!ad*vw7oMT67gCVpYGPh&r{UVnuxf< xMTNkwAl`PN6&+XwQ^76vHk-rq*a~Wn63A{pbH>|@yiq!OjnL(+5wG3){{pJ@WUc@J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/config b/app/src/main/assets/config new file mode 100644 index 00000000..f501c607 --- /dev/null +++ b/app/src/main/assets/config @@ -0,0 +1,200 @@ +# +# baresip configuration +# + +#------------------------------------------------------------------------------ + +# Core +poll_method epoll # poll, select, epoll .. + +# SIP +sip_trans_bsize 128 +#sip_listen 0.0.0.0:5060 +#sip_certificate cert.pem + +# Call +call_local_timeout 120 +call_max_calls 4 + +# Audio +audio_player opensles,nil +audio_source opensles,nil +audio_alert opensles,nil +audio_srate 8000-48000 +audio_channels 1-2 +#ausrc_srate 48000 +#auplay_srate 48000 +#ausrc_channels 0 +#auplay_channels 0 +audio_level no + +# Video +#video_source v4l2,/dev/video0 +#video_display x11,nil +video_size 352x288 +video_bitrate 500000 +video_fps 25 +video_fullscreen yes + +# AVT - Audio/Video Transport +rtp_tos 184 +#rtp_ports 10000-20000 +#rtp_bandwidth 512-1024 # [kbit/s] +rtcp_enable yes +rtcp_mux no +jitter_buffer_delay 5-10 # frames +rtp_stats no +#rtp_timeout 60 + +# Network +#dns_server 10.0.0.1:53 +#net_interface ^ + +# BFCP +#bfcp_proto udp + +#------------------------------------------------------------------------------ +# Modules + +# UI Modules +#module stdio.so +#module cons.so +#module evdev.so +#module httpd.so + +# Audio codec Modules (in order) +module opus.so +#module silk.so +#module amr.so +#module g7221.so +#module g722.so +#module g726.so +module g711.so +#module gsm.so +#module l16.so +module speex.so +#module bv32.so +#module mpa.so +#module codec2.so +#module ilbc.so +#module isac.so + +# Audio filter Modules (in encoding order) +#module vumeter.so +#module sndfile.so +#module speex_aec.so +#module speex_pp.so +#module plc.so + +# Audio driver Modules +module opensles.so +#module jack.so +#module portaudio.so +#module aubridge.so +#module aufile.so + +# Video codec Modules (in order) +#module avcodec.so +#module vp8.so +#module vp9.so +#module h265.so + +# Video filter Modules (in encoding order) +#module selfview.so +#module snapshot.so +#module swscale.so +#module vidinfo.so + +# Video source modules +#module v4l.so +#module v4l2.so +#module v4l2_codec.so +#module x11grab.so +#module cairo.so +#module vidbridge.so + +# Video display modules +#module directfb.so +#module x11.so +#module sdl2.so +#module fakevideo.so + +# Audio/Video source modules +#module rst.so +#module gst1.so +#module gst_video1.so + +# Media NAT modules +module stun.so +module turn.so +module ice.so +#module natpmp.so + +# Media encryption modules +#module srtp.so +#module dtls_srtp.so +#module zrtp.so + + +#------------------------------------------------------------------------------ +# Temporary Modules (loaded then unloaded) + +module_tmp uuid.so +module_tmp account.so + + +#------------------------------------------------------------------------------ +# Application Modules + +module_app auloop.so +module_app contact.so +module_app debug_cmd.so +#module_app dtmfio.so +#module_app echo.so +#module_app gtk.so +module_app menu.so +#module_app mwi.so +#module_app natbd.so +#module_app presence.so +#module_app syslog.so +module_app vidloop.so + + +#------------------------------------------------------------------------------ +# Module parameters + + +cons_listen 0.0.0.0:5555 + +http_listen 0.0.0.0:8000 + +evdev_device /dev/input/event0 + +# Speex codec parameters +speex_quality 7 # 0-10 +speex_complexity 7 # 0-10 +speex_enhancement 0 # 0-1 +speex_mode_nb 3 # 1-6 +speex_mode_wb 6 # 1-6 +speex_vbr 0 # Variable Bit Rate 0-1 +speex_vad 0 # Voice Activity Detection 0-1 +speex_agc_level 8000 + +# Opus codec parameters +opus_bitrate 28000 # 6000-510000 +opus_cbr no +opus_inbandfec yes + +# Selfview +#video_selfview window # {window,pip} +#selfview_size 64x64 + +# ICE +ice_turn no +ice_debug no +ice_nomination regular # {regular,aggressive} +ice_mode full # {full,lite} + +# Menu +#redial_attempts 3 # Num or +#redial_delay 5 # Delay in seconds diff --git a/app/src/main/assets/contacts b/app/src/main/assets/contacts new file mode 100644 index 00000000..d884f5f1 --- /dev/null +++ b/app/src/main/assets/contacts @@ -0,0 +1,17 @@ +# +# SIP contacts +# +# Displayname ;addr-params +# +# addr-params: +# ;presence={none,p2p} +# ;access={allow,block} +# + +"Echo Server" +#"user" ;presence=p2p + + +# Access rules +#"Catch All" ;access=block +#"Good Friend" ;access=allow diff --git a/app/src/main/assets/error.wav b/app/src/main/assets/error.wav new file mode 100644 index 0000000000000000000000000000000000000000..483daca4353ea33f6f9c22b50c0520e3891a7b88 GIT binary patch literal 16776 zcmZ8{hgX!z()YgSeCNFHz5DLEuDa^3iV-CvN={YC* zXNC(rMvGw%GnWN}Ar*ASG-OO8z=6&M797k0#i$bhS21H`D!@o=AST+14POmZ!vqin zQ4EwZg8`CY2x{|!ZZM0DW<(Hyj0_c{MqtKxG(r^$H;91%3?Z2@9yBp#Aa+cM4j7;U zD#>MRC|hh%7!YWHn-fxx&Y75DE+8V(Vg%#@0SX3#p0p4^cibS`KE&0x#~J(f1g-xwo~pph2AF<4|l3?vz9ObMjJq#{{yh=G8{2zX<| zSV$BEqA=;uhw-o~bYYkd3xW_Jg;Nzx#Ew1uoAVKkHpB&G7no4h>zQT7+@z*RBoe|~ z3~#J2f|B3?A0>qZ5cd^b6hb@T$dDz>Nw`qVWhZkv$?PO1HNJRg=>*)2dOWba-G;rc$ZY%5jBqdP0;O6Bm<^%1Y)Y#)Sq328Eo7J`)la zC(?W!9aBn&K7W>g^b8JukqyaY(!l}gv|61U9TFB4YDC@;`R+^o|2#j&>nW z-ZWNMR6luC|N2F@yKm2jC(o)LR6TyuDmb;z)82Z!vy-#O0pA0MgA>%+FYjC5Kdq~+ zxL;aQQe1E=KffTqsKvp0%Q}-aCYvm_dboQZKj7}*;Oe&B(aR_P-J`P7;#=3RUd_qQ z&d$or&Us+DVfFH5%T}0JI)o^@>rXgtwb*F7e$#f(gsS_+`2~47+1IXQXI{E=?yn04 zj+<65TeSG6)n?mN_bV!19Cf!|Z(_1;v-Q50WyJ-#*K)G2T*=DHynO!Lg#$}0+Vz_)+&GjVJuKI)Sn|W-l_qPg z_N!jK?w>kpZ)0h0Y2$RVsj4LJT6QMN<;#~YU(WZoT=(;`9~ZA!wPusm?oXdsfw4#3 z?6x|)xp{>=zFU-=lX*Gw^2JLRFK6dgI-9Op`P0&609|k4;u|yhrKvOCZ{I;*Uq9Zn z^5R=Jau0q!HB}W4 zE30d2s%vT=KYR7IFZ#rRo$fA9j*gBluI_Gb?mPA#{58D4{llBaS1(^TH8;1s`|z%% zxv}BZ^QVs=J%0S8{#Em*VRqo*gZuXE-nD!0exJi90;748@)4O#u2O5o0=_{zF74@P zg{Y<`2ygB9EZ4Ck15X}1a`^D!BS(*&I2CX@C^RxUhQ&@!VyEzU8QKYjY`FhR-@xGT zkaT1Ou5Z=kjK&~LPh}^>MMp(OL`Fr&#Kgq2SnSjck-?yY3tT%pqn??X7#|x|DNvNE zv59Go4!&I?u|coZ%&5URs#2n;#^CFsHHhH*!sBvMlarG08 zJUB4W-#-8xq$A2PwGOMZ;$vf=epFOcOl&+Wi7U|0Oep0tfcE$G_V)D;3=NMcM%8)& z7l}rm2@4Ae2?-4gkB9=Y$vmNUdR(cHNrzA%twJ@f)``+NNr?&Zv9U2R(J-snxC9nE zB@Mocv(pp6SD}#0!;oRr(0V`gA;l?`=SFl?LC7Y&a%fZ^;7jV@BEKQTP6-26rI|)%lE~DijRTprlz3- zj;`K)tcceixU7$_T2Acrl{9Dg8`_(@lGHuX-g_n<*EA)Ecl7w|_3LOHJ|6O_>WM_y z^Ij4hFw@v7@91goRi#8pr;qyh_jmF`gguf_zW{@hbEQW4;Ft z9XTyzCq|zC?rVuD#3>1S<30K2;CN$3uok zI)(z`yV}~q_x~#W(4|lB?aDYF$Qf*I?qvu0$H?1yVpz#Z1O0Ka(hse%M~(*SXU9i- z-*hE}1hV+S#{#C>J`IjcM*1H=Jt&by2LuV_?9k(Z+JV?(KE82Xl77CQ&r$zaQKX(b z{YlD-7#;r9*!;e!rS)xF`2 zbN4}6(GA#UE@x(zZeIG`qSY=hYYbivTP;mZR-0^gNp5=as#EKC(7&-f|JwCy*%$x( z{kMN#@Ll$gfBxiBc)h4f>|wQW^(qs~_=>8Io%Rk++qXLGeqUKpaW4;cxvMv>UOfAI zw%rfkF4|aAbeHSw?7nr&n$_!_o|fG0_S|M?VQ%FzR8jfp!^g_JoSf^q*E7%m@%t5< zMgRP6bz5QK1H&#SD^ruTTXxo!mTO(NIXYQeTDx{UZulI~cKdqHja&KGF8%SZ-*VS{ z`#;~A-MNzcWT(BI&1RD|n|4(c-BUYRZ@00uwDf#k@t{u8TyZn!%8k4mm(TwDx7>B# z{r7k4>vFC?IJn)`#>`~RMyHzM+b>+KEiAV?I3MbMQrFzy`0!TF)tiMyS1N`c(a<1hT6#=6^Zkd1o zkMGtzx_Z6b%gV-KoB4+I*3*ByY7BdcE7r*<>AeooV?qmH!lA6+f{R5 zw5BTiN`;HLwZ{(Yb*oJSN^X<}TAObTnDMYRvsK+IEU9`@U7UZbpddHAmY$ZB`Pq5(j&{yoPUdUZS`HTHmA-Sbw6b$`b@MpfUR_a9S5r}3SX5GaEBpK(e-&?9 z^zHX1Pjj-14_jGobJ@0K{U+DSg2G20R#x`=Je{^~J6LNS=t)0AgT5sBDGjq4N%Gb)=%00IG>#qmH>dQ(?%SsDx-Mp25E9X*X zkrE5eG9UYRt%O=bHHKpYeCrcZ5R?7#@8P1D`rNxE0c{gtrQ`4x)<5k%c0gEFT2NR}n4g<_{aRLbZu0tN zi@d?HxV#xNNhqa`1WA*cRZu*C#^K+4ZIEdG-C0!otF$;-bRb+~OYVwX00b+)`Q- zb~!n^dhOfm>F%-HFOa7lQw(*twlp@rdiA8HqP+ZJRdr?gz1w9qUHcquY__?2?e=up zZtvu|-{;U?uN`}Q&rJ0V4oN;V)IWLhq^`QMvZ|)Grt)EVd1YNol((z1vx|p^r-z%n zyVvgBUZ8p(ja6$o(cJFl=TAW%)zv+ETvt?f8=pU^tF3?izN4$B|BEys_~?;S$B+6Q*ze=#bI^Og z_rW89(TVXv;T%a%pG4BtJJkQa_2avD&2Qd+_|*4Bs_5!eB}GPsrDTLgg`GGOl<4ns z?3jPR8ULfF0u1SLwtsX=@MLRSyHfH_FX^1@``p>l+tVbE=$mbSr(sDxrG}r;aYp(> z!$SOHlVbvcBEo}$A_GHo2?_cmacX`FOCePq5x!SO3*-CVNu$2BhsZiq5i)*v2e;Q> z7eA9a_`&Z;oJ{W@-jS3Z6+AFCm84yz;a6@;v zRB$FRbu#GGX-<3yTO1#jp-{~P2C=$_+3FajWN0SxqmC=pN)(dmA+DSi)T?I2gz!>= zBjbZ~G5%>sheINQPH8xrxFI=<)0sBF3YPXK#;9b8F(aRcMimKCWlvkUUzhSs-|5pQ z;@hI*l1{~ie%6L0gv@F~rP>4@FD9T>6&cjg6QSvS7Zk*ibZA0C`G(GZ_`|0a$Dfv* zNbQX3X9>lM(9sVe!6OoGbZ?I=EP6!swO^ti(a5?*agzhRU-)5R13lWAscF45HYUEe zo14xX4^he^WJAh0mU?;+ezrx8Xjvn(gG%`Uw znvx)&R`MbyX4o@>V-aKAsBzZ7h>ph@({xx9=t z4L5c|ZQu$7N!sZdu|}ohh}F8ODdmi2JVU?}>U4UsmYc>=a|B``hsWp5W~8PG1Olzn zpiI-qCuXK(D$(?~XkvO=rxwF+DULdgJ;Ua*(pm9|DQT$*$tiIxPHK`aL&Ft8x|DH) zQ1?|Vo7GID>owy7k%li$%MhjVgrXFIATf=@=Vg4=i+NMpjF}nTv_LA)P|hl*v z%A1~6!4EL4LM-Nsg@$w;H&wt(PUW(a5=4Aal0d6rrKv=snbD+4y-+^Mn@~^kwHlqu zFe#kM5T}c$g~_7v44saz=Ww+tA|9-`VoGRGjBE8%GPPPg(l44(jHGJD`HG1td6H6| zI4V?$Qp8gNHJ3AONMTQAh}Z^YDqE4jNmZZ8kfn}jlBSjH5za`e!XOyt&BCe};-!jo z!Gu0GJwZL4lE&jEa^fc=qEj*^L$vWxya~ATlc%vhD~E^2hSa0e%09*HjFLU3OdVEo zH5sCegt!b=c&G^W*7&#}UWiyfC=Kflld-~7F+BkhpTubq@vU)jXQtXtoECgKovMu= z^iPzBbo#TJ{3Ho|iCl?zAf-1!qZv$;oRoAKdZSZ(eLPvJqa6($AKFHGMj}(9{AZ%! z_s{r;p3c^ZFKt5;66NeTeC(;QeQNfgM9YB>G%iZO4vv!P6n%mzSxn;RshH8o;K;xT zR`~JYBM0{H-U~M+-mtA4KmF^8#Grsg$;;aE+eJ5X@b2u&E<3vwKP+Fl+{E1Jn9E*{ zgO$CFjf0#2$L6|wrMGTmUAl1YkN@|tb778Ke)#92Wj}8Wx?5X&zt-K_%FN8l#pJv1mabT9S9|+uUHNV+D^pWThf|%8ZkJcoe(ZRq zt}e>Ie);0Lv;X>Qx0@CGW?H&({g;xahj#)j%uP3%It{iw%r7k~Qw5A1oUN(KyOMq3 z&$Iu^v2s}bzyJH=G86lf;^vY{^UY=^8*O&It-M=sxANIh@BN;i>hE94y!_YiXa8Ne z!DjhCzFYQ_XuEv9QWJ07mSSD63sai+KBE2=}CcDOq$-@~t|E0@n-y72pXS0~FKzW-^(&yF=u-`}pc zv$EW<$!@>T)6$9uWdnY`u5PC~pOxIao^$Ea<#WGXaaOJQ{>Pq> zM^7KuJ&*GB^YM9KTU~hLR`%u0b7#+%aDQF?!%vHsnOYzGT=Bs7gzpv$H(O`_cvkEC z;pyNLfj+D!)%Wsm+t2qdUkvE=+dKzu*PQ;~Wo~0*4Zos$<(lM7!OO`HPyxPouu<~9*(`Q?2duv-~kG+1Mrjoy?_=c92n(_xl zxw+YwE}r}CZ0SSyWlNVV`f2?Zw+|0$8=m=Yb=+#{=;(GR{urn2OkkhnOnpV=?Yvvp zvobH9{q4f-hju?MTl)QSQ!~e!`*n5CcG%k6nAtfy9SlAd(cAx3`lYk!(Zh$Oxi_;e z!V;bsT z>5`R8S6I1uRo#(@g00Q0w^%wkooXFzYYW)F+uL)Oy600_QSr^}>p7RRGSB~c>-5Rh zOMY6uVuQO+V`Y_i_f9iYOA8x!-;S=KxBfeKySeY)uc)uOTacFvXBwGVnSY%tKIUZd za=VrFn)?urETU?X;&@Ov>N2guKKR>FzpMNVq=Sp5?R`&U`S3-7} zE&XxTDw92REp_GZ9k!USU$=dy&&yXbiMNxTwS&j5kT>zbd< z2KYs0V&PqNx2`2%+gg)N8@DDjKY#S`MWZ#l&&+WqHwko}(Fj+g*=}Uspb;sHwVFTvC#I^;*`2 z3+MjKI<)HNrHg+ul~>#=tMN5kV`5@rcIv_1s=7uG3)9W!)}E7(E34~XzO1i=8C}cD z%FeoU{(R2o4L>hiwsOPq`=u2vCv4WPUcKJJ<866yS=$cVEgLpkc(m8T&$uVepWaj! z!OzmGc+Yt0e5TrD`A;iWu0MLa1%0+wSGp z*HT|sTlcJ?>19=EVJ@8A!N;4Od8KmGayaBOwN0oj8@1WI(R7ok<(|jo4_~TJde~W* z+3Xl?uCJ-Ae5sMQRF)POT+hkMz6Sfsr5k&HS-R|(jTX)y9@cqVnr_;>+0=4>b;;eP zqdPsEY-}8lysUln{Phd?W!u*P_X9Vt=H%pDyKyz=YNh2$*u1T_xt(Z&8ErN-x3qTj zt$+CNwf`X-ha}91*t`+ob`FX{v4VL!qhsPtm9V{*2 zByeX)V|CSwq}}fBo;&xQ)P8)^F6rrRho8$&;3)6rja-Pke&t%>C-c=Se_3Z??{P3P z^02Fog@ujdt`l9ao<5iOdAhiH`2>n2@0(kD|Lk#XW!arlh%G88C@6Wl8;&2=Y_fLRx%be?&~QIbhiwj?rv^WE z4Ged+cgbUe!?^wJt*x!^nqNPM(CUh^I~WSD(r2D#cpzfqgtt*CiYRXv2j^WueV^q# z{pa@ff#_2wgU2KtJwuXrFCW*|R98N@3z4Mk-DbzlCMIxI+dI1MI;v9y>~?i>-xrXW z5EdM(lyr@-&qQkax_XBD+ZrC%RKdN~y*qIGS_-5~Ya+IrZQ8iS!rIo($-^gB9PYb! z@4=HX5rM~!27m2t`}pxwd;6zP9iQ6XzJ6L;T~%2LCoiypJbd_|qPE4~-QL#5*4D;m z>vk8fL&r}Co=H><3{S_0gvN-Zz1>}%?H}I1`_TH~EuOqKQfX*tY-)Mm(Ju%&=5t`* z?j4?Rr{=YL-$6LG4T@xEXw_r#q5dzQdnA(XuCA`m&W?5<@v*I~t-ZaoyJtYEQj2*> zaJCr{9ugcJ7#MgO{so7IhDXA=B_77=HR|b!aTT0f%4O2wp#dUrgerqG-0`VdgYjfE zJS-HV&cLZJoTGB!xDyU(^;!^}PG`V}E^weZGd(#mK0ZD+HacsgvT=E;S40Fq6G__3=0K(45pHi z!RHHvaF%KSDtMeqf@k58$t*Tx1oZRAMIq`B#xBSVFH5~xC?+( zIvim`2uwpP7K(M+4F2q_SRmpVGC;%{I44in7^Y^Rwt7})n8pkm5l@tENMp0orojHa+7bkmV3x{=xRX~kFBL?ljA=-Bdq^!y1&$#zu|CheUp! zm9j=hh7+~@Lo?}`pjb9Lv|l^eInb-rN@Efyqh{lR*yEb%@u6Aim&yLo(5Rr)2>-;M z$#}hNGT{q*N~#Zz;H1Z}lvDl6k^Ye|_-J^^{poQ6_C)XCK$J!rKcQ6e!xIdN+~`Ev z)aZmtF?}XfH5wSiP7=p(hGpXd?#LiNUNtO^V^7DN5f6WniZuFYVRDKpPBp{rlPO1L zWeKtUF$rqk(ANl^cu<Qb_%t~`v0pMC#~m6>2#pz(rU|9pv#}hxm<6e0 zV)$tSmQXs*7wYv1VKeQrN0L2_LDjDn-l8>Y3%i5Yxu z7|SrCj2Fp;aj`mOVq_G5A~BLLmnX)_#}gBEGEHJCnL%p8DAxEmUoRih#K)!1 z=s8KVUt^+Y`$rSmqbdV;R%S>@5$W_9qV$yHG^I>ArJMbl7|&*>u@lnAhm{lZk#7K@X(@R6uTWilOyrx)-HilGs;W^!y=s8+})HR{Q9HajIXg*UC5(o85d zY48L!IVzT$oFtfp=Q`R9ZW0e3;^@=U(o&Q86Dl=4uAP8wiJzRTho@8{GR3SxE9RzT z!0s?Jrc_N$PtFR`GX&}UuUa+iI5V?wBw!G7Q#m|=4o(1O_3-cqwj4g}cOuv>V8ak) za5-G^{D*88{B+pLGK9F>z}AM3li^zq5658tGr&_YcnC%|C*0m}j6Lo+xF?BV4}rah z3OpT#4OE0rrcupE#}{rpxM61SVVi`F61N+8;UHhD%c6Xe4GeSjGO4;{S4IDi+rKrkgLm;ickfC8;C z&EI-r1)Kqp%;!lIqLZnRKUSC*R)BPvc0LDPJZPD}cY3{%3aO1$LFj)~K_Uz}nviBC zONNsnM#2?fI9U`7hX&k?fz~D*XbACvf1!{SFo;P!#K9_{ilGn)SX>?ul2l9?8(^)_ zjA@K+ib0DpfsqB8AQxr;5LlTk=tn%dFdBsD2JA>0k^!R$A^0W|D|AdGb^yk3CI`Lz zFcE?gZ|sRqVRKGG3Q>Sx&>4A&$r?}>wj`C&IcEj~yl6>+fMh^RjEe^i;Lrd)m_TD} zL?te2UBHQCMkK*PZcy;OP{0lB<}4HhLtqRpqhRW}Aw@$=6zqWz41gmxI55hBC@?MX z%*}@|$1wULRIoB8F)&V=4J||fZDfo{Tpr`JAi@|%Q;+~O%|$O@fs;kb5XA(NZUJ_o zN>Tw9FYGxXR3Qh5*jSMkqcdbac;W*T0YW#I!Wbk5#Tbv7$aamUg@Sfwj3tr&oPa7O z1Ja7gq>N5T4sL<~F9TS(Bs4FqDoJT12XjL##QlempozuM8bF~R7mm=eKnNdtoxrkF?*a@lF=On+7zzs2$%uTSSOct#0YP9OBec^C z1Ids9G+-qoVj~d7MJCPUAtus*0pNt|yph-zY(0cMlZ$r5!oX-js5f7YDamAn0*Cc1!qgar!Qf{CVFUvsc?Lr##*koA8f}1Pgvnsc1U*d#EmEaSKqX@uLse{{5jyDBveQ<>-h6QY+wb1b(tQj0znsu~0z_2zJI0l6NkU0iY9M z@DE=o!~*;l2)+9=w)8HEjA%GnB@Bf-A-o|aH%2&SQX*XtF}%s`Dc;tRyCy76>XBN6 z2xKJQxg2Dz{>B9dG!SC(=9HWT(8E!&S zDe@xOn5jb|$Ob|VawuKIVoD?nXEUIX0aMP{;UbWggs(M|lhUO5>19hT z$OFogRfc(xPXHcTz!Sf$uCLy?R9f&aDWWPrP#=>WgDs>Uyd_w}sP>fij(I9AH#JFfY zwv+;DAQVn|qdIS%w@^(?LP&BFXdo?G8PDHfMkCWBPXn2U0pgedNPuRB2pDNf44H#q zQMv$NB|5^y1d5T2ppz~WC?pM858`D4nIJ^brKH5E*I=9lr35X*0O+ES7A9fjMWd*T z=oChQP=W~~0P=N55WzqalzDo@3=tH7xc?9|(J7+?aU=&SWCTNGhC@am`J4fxiOeZv z1QWrC1vJ2q7Gj+1VJbLhoDpakLouXfg2AyM2vF1jYhd^roPZ#WfmWR_&EUa|>qbV1 zq8cd(0~F%=PnGduha4B+37oot6Dq{Q;E*QR&`bpPG!P18OaNhoXmePjm7s|Wo4GG4 z;Xx(}p92(=3P~ARl3f;z1VKYEF+dPRt|v2m%wduuxzJ9Xc2=v`X zLNHYfGypz7ECV()GaYDP!|Ra&ks-Q?0m*<6FIDHM(g4JhLWsvVfuV&cXfx&}1~Fh5 z&jLKyaOU8kAV#5);F*sxCd29kiwey|wRv647?_@BHySAn*`OF`M|a_$`hpOKGKB&Lh3P104oN%|2Q8_M!E+X{k+mi(f;pJfbLp7WM%I7;fpGW` GQ2YPopvgY~ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/message.wav b/app/src/main/assets/message.wav new file mode 100644 index 0000000000000000000000000000000000000000..bd91094b9cd1d6d8cf0e130d1bf8060f7fceb966 GIT binary patch literal 6356 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/notfound.wav b/app/src/main/assets/notfound.wav new file mode 100644 index 0000000000000000000000000000000000000000..285c61da597dbd539ad78587ce9c2aca69772ff9 GIT binary patch literal 16568 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 atve-qw%%C2emv6alib_><4=F~-9G_6;*E9y literal 0 HcmV?d00001 diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 00000000..09479956 --- /dev/null +++ b/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,80 @@ + +# +# Copyright (C) The Android Open Source Project +# +# 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. +# + +cmake_minimum_required(VERSION 3.4.1) + +# configure import libs +set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution) + +add_library(lib_crypto STATIC IMPORTED) +set_target_properties(lib_crypto PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libcrypto.a) + +add_library(lib_ssl STATIC IMPORTED) +set_target_properties(lib_ssl PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/openssl/lib/${ANDROID_ABI}/libssl.a) + +add_library(lib_re STATIC IMPORTED) +set_target_properties(lib_re PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/re/lib/${ANDROID_ABI}/libre.a) + +add_library(lib_rem STATIC IMPORTED) +set_target_properties(lib_rem PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/rem/lib/${ANDROID_ABI}/librem.a) + +add_library(lib_speex STATIC IMPORTED) +set_target_properties(lib_speex PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/speex/lib/${ANDROID_ABI}/libspeex.a) + +add_library(lib_opus STATIC IMPORTED) +set_target_properties(lib_opus PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/opus/lib/${ANDROID_ABI}/libopus.a) + +add_library(lib_bn STATIC IMPORTED) +set_target_properties(lib_bn PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/bn/lib/${ANDROID_ABI}/libbn.a) + +add_library(lib_zrtp STATIC IMPORTED) +set_target_properties(lib_zrtp PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/zrtp/lib/${ANDROID_ABI}/libzrtp.a) + +add_library(lib_baresip STATIC IMPORTED) +set_target_properties(lib_baresip PROPERTIES IMPORTED_LOCATION + ${distribution_DIR}/baresip/lib/${ANDROID_ABI}/libbaresip.a) + +add_library(baresip SHARED baresip.c) + +target_include_directories(baresip PRIVATE + ${distribution_DIR}/openssl/include + ${distribution_DIR}/re/include + ${distribution_DIR}/rem/include + ${distribution_DIR}/baresip/include) + +target_link_libraries(baresip + android + OpenSLES + lib_baresip + lib_rem + lib_re + lib_ssl + lib_crypto + lib_speex + lib_opus + lib_zrtp + lib_bn + z + log) diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c new file mode 100644 index 00000000..fae31b7b --- /dev/null +++ b/app/src/main/cpp/baresip.c @@ -0,0 +1,458 @@ +#include +#include +#include +#include +#include +#include +#include + +#define LOGD(...) \ + ((void)__android_log_print(ANDROID_LOG_DEBUG, "Baresip", __VA_ARGS__)) + +#define LOGI(...) \ + ((void)__android_log_print(ANDROID_LOG_INFO, "Baresip", __VA_ARGS__)) + +#define LOGW(...) \ + ((void)__android_log_print(ANDROID_LOG_WARN, "Baresip", __VA_ARGS__)) + +#define LOGE(...) \ + ((void)__android_log_print(ANDROID_LOG_ERROR, "Baresip", __VA_ARGS__)) + +typedef struct tick_context { + JavaVM *javaVM; + jclass jniHelperClz; + jobject jniHelperObj; + jclass mainActivityClz; + jobject mainActivityObj; + pthread_mutex_t lock; + int done; +} TickContext; + +TickContext g_ctx; + +static void signal_handler(int sig) +{ + static bool term = false; + + if (term) { + mod_close(); + exit(0); + } + + term = true; + LOGI("terminated by signal (%d)\n", sig); + ua_stop_all(false); +} + +static void ua_exit_handler(void *arg) +{ + (void)arg; + LOGD("ua exited -- stopping main runloop\n"); + re_cancel(); +} + +static const char *ua_event_reg_str(enum ua_event ev) +{ + switch (ev) { + case UA_EVENT_REGISTERING: return "registering"; + case UA_EVENT_REGISTER_OK: return "registered"; + case UA_EVENT_REGISTER_FAIL: return "registering failed"; + case UA_EVENT_UNREGISTERING: return "unregistering"; + default: return "?"; + } +} + +static void ua_event_handler(struct ua *ua, enum ua_event ev, + struct call *call, const char *prm, void *arg) +{ + const char *event; + char event_buf[256]; + char ua_buf[256]; + char call_buf[256]; + + LOGD("ua event (%s)\n", uag_event_str(ev)); + + switch (ev) { + case UA_EVENT_REGISTERING: + case UA_EVENT_UNREGISTERING: + case UA_EVENT_REGISTER_OK: + case UA_EVENT_REGISTER_FAIL: + re_snprintf(event_buf, sizeof event_buf, "%s", ua_event_reg_str(ev)); + break; + case UA_EVENT_CALL_RINGING: + re_snprintf(event_buf, sizeof event_buf, "%s", "call ringing"); + break; + case UA_EVENT_CALL_PROGRESS: + re_snprintf(event_buf, sizeof event_buf, "%s", "call progress"); + break; + case UA_EVENT_CALL_ESTABLISHED: + re_snprintf(event_buf, sizeof event_buf, "%s", "call established"); + break; + case UA_EVENT_CALL_INCOMING: + re_snprintf(event_buf, sizeof event_buf, "%s", "call incoming"); + break; + case UA_EVENT_CALL_CLOSED: + re_snprintf(event_buf, sizeof event_buf, "%s", "call closed"); + break; + case UA_EVENT_EXIT: + re_snprintf(event_buf, sizeof event_buf, "%s", "exit"); + break; + default: + re_snprintf(event_buf, sizeof event_buf, "%s", "unknown event"); + } + event = event_buf; + + TickContext *pctx = (TickContext*)(&g_ctx); + JavaVM *javaVM = pctx->javaVM; + JNIEnv *env; + jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); + if (res != JNI_OK) { + res = (*javaVM)->AttachCurrentThread(javaVM, &env, NULL); + if (JNI_OK != res) { + LOGE("Failed to AttachCurrentThread, ErrorCode = %d", res); + return; + } + } + jmethodID statusId = (*env)->GetMethodID(env, pctx->jniHelperClz, + "updateStatus", + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + sprintf(ua_buf, "%lu", (unsigned long)ua); + jstring javaUA = (*env)->NewStringUTF(env, ua_buf); + sprintf(call_buf, "%lu", (unsigned long)call); + jstring javaCall = (*env)->NewStringUTF(env, call_buf); + jstring javaEvent = (*env)->NewStringUTF(env, event); + LOGD("sending ua/call %s/%s event %s\n", ua_buf, call_buf, event); + (*env)->CallVoidMethod(env, pctx->jniHelperObj, statusId, javaEvent, javaUA, javaCall); + (*env)->DeleteLocalRef(env, javaUA); + (*env)->DeleteLocalRef(env, javaCall); + (*env)->DeleteLocalRef(env, javaEvent); +} + +#include + +static int pfd[2]; +static pthread_t loggingThread; + +static void *loggingFunction() { + ssize_t readSize; + char buf[128]; + + while((readSize = read(pfd[0], buf, sizeof buf - 1)) > 0) { + if(buf[readSize - 1] == '\n') { + --readSize; + } + buf[readSize] = 0; + LOGD("%s", buf); + } + + return 0; +} + +static int runLoggingThread() { + setvbuf(stdout, 0, _IOLBF, 0); + setvbuf(stderr, 0, _IONBF, 0); + + pipe(pfd); + dup2(pfd[1], 1); + dup2(pfd[1], 2); + + if (pthread_create(&loggingThread, 0, loggingFunction, 0) == -1) { + return -1; + } + + pthread_detach(loggingThread); + + return 0; +} + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv* env; + + LOGD("Executing JNI_OnLoad\n"); + + memset(&g_ctx, 0, sizeof(g_ctx)); + + g_ctx.javaVM = vm; + if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + return JNI_ERR; // JNI version not supported. + } + + jclass clz = (*env)->FindClass(env, "com/tutpro/baresip/MainActivity"); + g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz); + + jmethodID jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz, + "", "()V"); + jobject handler = (*env)->NewObject(env, g_ctx.jniHelperClz, + jniHelperCtor); + g_ctx.jniHelperObj = (*env)->NewGlobalRef(env, handler); + + g_ctx.done = 0; + g_ctx.mainActivityObj = NULL; + return JNI_VERSION_1_6; +} + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject thiz, jstring javaPath) +{ + int err; + const char *path = (*env)->GetStringUTFChars(env, javaPath, 0); + struct le *le; + + runLoggingThread(); + + err = libre_init(); + if (err) + goto out; + + conf_path_set(path); + + err = conf_configure(); + if (err) { + LOGW("conf_configure() failed: (%d)\n", err); + goto out; + } + + err = baresip_init(conf_config(), false); + if (err) { + LOGW("baresip_init() failed (%d)\n", err); + goto out; + } + + play_set_path(baresip_player(), path); + + err = ua_init("baresip v" BARESIP_VERSION " (" ARCH "/" OS ")", + true, true, true, false); + if (err) { + LOGE("ua_init() failed (%d)\n", err); + goto out; + } + + uag_set_exit_handler(ua_exit_handler, NULL); + uag_event_register(ua_event_handler, NULL); + + err = conf_modules(); + if (err) { + LOGW("conf_modules() failed (%d)\n", err); + goto out; + } + + TickContext *pctx = (TickContext*)(&g_ctx); + JavaVM *javaVM = pctx->javaVM; + jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); + if (res != JNI_OK) { + res = (*javaVM)->AttachCurrentThread(javaVM, &env, NULL); + if (JNI_OK != res) { + LOGE("Failed to AttachCurrentThread, ErrorCode = %d", res); + return; + } + } + + LOGD("Adding %u accounts", list_count(uag_list())); + char ua_buf[256]; + struct ua *ua; + for (le = list_head(uag_list()); le; le = le->next) { + ua = le->data; + sprintf(ua_buf, "%lu", (unsigned long)ua); + jstring javaUA = (*env)->NewStringUTF(env, ua_buf); + LOGD("adding account %s/%s\n", ua_aor(ua), ua_buf); + jmethodID accountId = (*env)->GetMethodID(env, pctx->jniHelperClz, "addAccount", + "(Ljava/lang/String;)V"); + (*env)->CallVoidMethod(env, pctx->jniHelperObj, accountId, javaUA); + (*env)->DeleteLocalRef(env, javaUA); + } + + LOGI("Running main loop\n"); + err = re_main(signal_handler); + +out: + + if (err) { + LOGE("error: (%d)\n", err); + ua_stop_all(true); + } + + LOGD("closing upon main loop exit"); + ua_close(); + conf_close(); + baresip_close(); + mod_close(); + libre_close(); + + // tmr_debug(); + // mem_debug(); + + return; +} + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_MainActivity_baresipStop(JNIEnv *env, jobject thiz) +{ + LOGD("closing upon stop"); + ua_stop_all(false); + ua_close(); + // conf_close(); + // baresip_close(); + // mod_close(); + // libre_close(); + + // tmr_debug(); + // mem_debug(); + + return; +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1aor(JNIEnv *env, jobject thiz, jstring javaUA) +{ + const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0); + struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10); + + if (strlen(native_ua) > 0) + return (*env)->NewStringUTF(env, ua_aor(ua)); + else + return (*env)->NewStringUTF(env, ""); +} + +JNIEXPORT jboolean JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1isregistered(JNIEnv *env, jobject thiz, jlong ua_ptr) +{ + struct ua *ua = (struct ua *)ua_ptr; + bool result; + + result = ua_isregistered(ua); + if (ua == NULL) { + LOGD("ua_ptr is null\n"); + } else { + LOGD("ua_ptr is NOT null\n"); + } + return result; +} + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1current_1set(JNIEnv *env, jobject thiz, + jstring javaAoR) +{ + struct ua *new_current_ua; + const char *native_aor = (*env)->GetStringUTFChars(env, javaAoR, 0); + + LOGD("running ua_current_set on %s\n", native_aor); + new_current_ua = uag_find_aor(native_aor); + uag_current_set(new_current_ua); + (*env)->ReleaseStringUTFChars(env, javaAoR, native_aor); + return; +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1current(JNIEnv *env, jobject thiz) +{ + struct ua *current_ua = uag_current(); + char ua_buf[256]; + + if (current_ua == NULL) + ua_buf[0] = '\0'; + else + sprintf(ua_buf, "%lu", (unsigned long)current_ua); + return (*env)->NewStringUTF(env, ua_buf); +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1prev_1call(JNIEnv *env, jobject thiz, jstring javaUA) +{ + const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0); + struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10); + (*env)->ReleaseStringUTFChars(env, javaUA, native_ua); + + struct call *call = ua_prev_call(ua); + char call_buf[256]; + if (call == NULL) + call_buf[0] = '\0'; + else + sprintf(call_buf, "%lu", (unsigned long)call); + return (*env)->NewStringUTF(env, call_buf); +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1call(JNIEnv *env, jobject thiz, jstring javaUA) +{ + const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0); + struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10); + (*env)->ReleaseStringUTFChars(env, javaUA, native_ua); + + struct call *call = ua_call(ua); + char call_buf[256]; + sprintf(call_buf, "%lu", (unsigned long)call); + return (*env)->NewStringUTF(env, call_buf); +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_call_1peeruri(JNIEnv *env, jobject thiz, jstring javaCall) +{ + const char *native_call = (*env)->GetStringUTFChars(env, javaCall, 0); + struct call *call; + + call = (struct call *)strtoul(native_call, NULL, 10); + (*env)->ReleaseStringUTFChars(env, javaCall, native_call); + return (*env)->NewStringUTF(env, call_peeruri(call)); +} + +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1connect(JNIEnv *env, jobject thiz, + jstring uri) { + struct call *call; + struct ua *ua; + int err; + const char *native_uri = (*env)->GetStringUTFChars(env, uri, 0); + char call_buf[256]; + + LOGD("connecting to %s\n", native_uri); + ua = uag_current(); + if (ua != NULL) { + err = ua_connect(ua, &call, NULL, native_uri, NULL, VIDMODE_ON); + if (err) { + LOGW("connecting to %s failed with error %d\n", native_uri, err); + call_buf[0] = '\0'; + } else { + sprintf(call_buf, "%lu", (unsigned long)call); + } + } else { + LOGE("no current ua\n"); + call_buf[0] = '\0'; + } + (*env)->ReleaseStringUTFChars(env, uri, native_uri); + return (*env)->NewStringUTF(env, call_buf); +} + + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1answer(JNIEnv *env, jobject thiz, + jstring javaUA, jstring javaCall) { + const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0); + const char *native_call = (*env)->GetStringUTFChars(env, javaCall, 0); + LOGD("answering call %s/%s\n", native_ua, native_call); + struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10); + struct call *call = (struct call *)strtoul(native_call, NULL, 10); + ua_answer(ua, call); + (*env)->ReleaseStringUTFChars(env, javaUA, native_ua); + (*env)->ReleaseStringUTFChars(env, javaCall, native_call); + + return; +} + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_MainActivity_ua_1hangup(JNIEnv *env, jobject thiz, + jstring javaUA, jstring javaCall, jint code, + jstring reason) { + const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0); + const char *native_call = (*env)->GetStringUTFChars(env, javaCall, 0); + struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10); + struct call *call = (struct call *)strtoul(native_call, NULL, 10); + const uint16_t native_code = code; + const char *native_reason = (*env)->GetStringUTFChars(env, reason, 0); + LOGD("hanging up call %s/%s\n", native_ua, native_call); + // ua_hangup(ua, call, native_code, native_reason); + ua_hangup(uag_current(), NULL, 0, NULL); + (*env)->ReleaseStringUTFChars(env, javaUA, native_ua); + (*env)->ReleaseStringUTFChars(env, javaCall, native_call); + (*env)->ReleaseStringUTFChars(env, reason, native_reason); + return; +} diff --git a/app/src/main/java/com/tutpro/baresip/AboutActivity.java b/app/src/main/java/com/tutpro/baresip/AboutActivity.java new file mode 100644 index 00000000..dc667ec9 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/AboutActivity.java @@ -0,0 +1,21 @@ +package com.tutpro.baresip; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; + +public class AboutActivity extends AppCompatActivity { + + private TextView aboutView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + aboutView = (TextView)findViewById(R.id.aboutText); + aboutView.setEnabled(false); + aboutView.setText(getString(R.string.aboutText)); + } + +} + diff --git a/app/src/main/java/com/tutpro/baresip/Account.java b/app/src/main/java/com/tutpro/baresip/Account.java new file mode 100644 index 00000000..4030da99 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/Account.java @@ -0,0 +1,34 @@ +package com.tutpro.baresip; + +public class Account { + + private String ua, aor, status; + private int status_image; + + public Account(String ua, String aor) { + this.ua = ua; + this.aor = aor; + this.status = ""; + this.status_image = 0; + } + + public void setStatusImage(int status_image) { + this.status_image = status_image; + } + public int getStatusImage() { + return status_image; + } + + public String getUA() { + return ua; + } + public String getAoR() { + return aor; + } + + public void setStatus(String status) { this.status = status; } + public String getStatus() { + return status; + } + +} diff --git a/app/src/main/java/com/tutpro/baresip/AccountSpinnerAdapter.java b/app/src/main/java/com/tutpro/baresip/AccountSpinnerAdapter.java new file mode 100644 index 00000000..7a5d8436 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/AccountSpinnerAdapter.java @@ -0,0 +1,46 @@ +package com.tutpro.baresip; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; + +public class AccountSpinnerAdapter extends ArrayAdapter { + + private ArrayList images; + private ArrayList aors; + private Context context; + + public AccountSpinnerAdapter(Context context, ArrayList aors, ArrayList images) { + super(context, android.R.layout.simple_spinner_item, images); + this.images = images; + this.aors = aors; + this.context = context; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return getImageForPosition(position, convertView, parent); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return getImageForPosition(position, convertView, parent); + } + + private View getImageForPosition(int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View row = inflater.inflate(R.layout.account_spinner, parent, false); + TextView textView = (TextView) row.findViewById(R.id.spinnerText); + textView.setText(aors.get(position)); + ImageView imageView = (ImageView) row.findViewById(R.id.spinnerImage); + imageView.setImageResource(images.get(position)); + return row; + } +} + diff --git a/app/src/main/java/com/tutpro/baresip/Call.java b/app/src/main/java/com/tutpro/baresip/Call.java new file mode 100644 index 00000000..9c05f368 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/Call.java @@ -0,0 +1,32 @@ +package com.tutpro.baresip; + +public class Call { + + private String ua, call, peer_uri, status; + + public Call(String ua, String call, String peer_uri, String status) { + this.ua = ua; + this.call = call; + this.peer_uri = peer_uri; + this.status = status; + } + + public String getUA() { + return ua; + } + + public String getCall() { + return call; + } + + public String getPeerURI() { + return peer_uri; + } + + public void setStatus(String status) { + this.status = status; + } + public String getStatus() { + return status; + } +} diff --git a/app/src/main/java/com/tutpro/baresip/EditAccountsActivity.java b/app/src/main/java/com/tutpro/baresip/EditAccountsActivity.java new file mode 100644 index 00000000..4a872cd0 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/EditAccountsActivity.java @@ -0,0 +1,105 @@ +package com.tutpro.baresip; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.util.TypedValue; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.EditText; +import android.widget.TextView; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; + +public class EditAccountsActivity extends AppCompatActivity { + + private EditText editText; + private String path; + private File file; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit_accounts); + + editText = (EditText)findViewById(R.id.editAccounts); + path = getApplicationContext().getFilesDir().getAbsolutePath() + "/accounts"; + file = new File(path); + String content; + + if (!file.exists()) { + Log.e("Baresip", "Failed to find accounts file"); + content = "No accounts"; + } else { + Log.e("Baresip", "Found accounts file"); + int length = (int)file.length(); + byte[] bytes = new byte[length]; + try { + FileInputStream in = new FileInputStream(file); + try { + in.read(bytes); + } finally { + in.close(); + } + content = new String(bytes); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to read accounts file: " + e.toString()); + content = "Failed to read account file"; + } + } + + Log.d("Baresip", "Content length is: " + content.length()); + + editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.textsize)); + editText.setText(content, TextView.BufferType.EDITABLE); + } + + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.edit_menu, menu); + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + Intent i = new Intent(this, MainActivity.class); + switch (item.getItemId()) { + case R.id.save: + try { + FileOutputStream fOut = + new FileOutputStream(file.getAbsoluteFile(), false); + OutputStreamWriter fWriter = new OutputStreamWriter(fOut); + String res = editText.getText().toString(); + try { + fWriter.write(res); + fWriter.close(); + fOut.close(); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to write accounts file: " + + e.toString()); + } + } catch (java.io.FileNotFoundException e) { + Log.e("Baresip", "Failed to find accounts file: " + + e.toString()); + } + Log.d("Baresip", "Updated accounts file"); + i.putExtra("action", "save"); + setResult(RESULT_OK, i); + finish(); + return true; + case R.id.cancel: + i.putExtra("action", "cancel"); + setResult(RESULT_OK, i); + finish(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} + diff --git a/app/src/main/java/com/tutpro/baresip/EditConfigActivity.java b/app/src/main/java/com/tutpro/baresip/EditConfigActivity.java new file mode 100644 index 00000000..9b41610f --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/EditConfigActivity.java @@ -0,0 +1,105 @@ +package com.tutpro.baresip; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.util.TypedValue; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.EditText; +import android.widget.TextView; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; + +public class EditConfigActivity extends AppCompatActivity { + + private EditText editText; + private String path; + private File file; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit_config); + + editText = (EditText)findViewById(R.id.editConfig); + path = getApplicationContext().getFilesDir().getAbsolutePath() + "/config"; + // path = "/sdcard/baresip/config"; + file = new File(path); + String content; + + if (!file.exists()) { + Log.e("Baresip", "Failed to find config file"); + content = "No config"; + } else { + Log.e("Baresip", "Found config file"); + int length = (int)file.length(); + byte[] bytes = new byte[length]; + try { + FileInputStream in = new FileInputStream(file); + try { + in.read(bytes); + } finally { + in.close(); + } + content = new String(bytes); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to read config file: " + e.toString()); + content = "Failed to read account file"; + } + } + + Log.d("Baresip", "Content length is: " + content.length()); + + editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.textsize)); + editText.setText(content, TextView.BufferType.EDITABLE); + } + + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.edit_menu, menu); + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + Intent i = new Intent(this, MainActivity.class); + switch (item.getItemId()) { + case R.id.save: + try { + FileOutputStream fOut = + new FileOutputStream(file.getAbsoluteFile(), false); + OutputStreamWriter fWriter = new OutputStreamWriter(fOut); + String res = editText.getText().toString(); + try { + fWriter.write(res); + fWriter.close(); + fOut.close(); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to write config file: " + + e.toString()); + } + } catch (java.io.FileNotFoundException e) { + Log.e("Baresip", "Failed to find config file: " + + e.toString()); + } + Log.d("Baresip", "Updated config file"); + i.putExtra("action", "save"); + setResult(RESULT_OK, i); + finish(); + return true; + case R.id.cancel: + i.putExtra("action", "cancel"); + setResult(RESULT_OK, i); + finish(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} diff --git a/app/src/main/java/com/tutpro/baresip/EditContactsActivity.java b/app/src/main/java/com/tutpro/baresip/EditContactsActivity.java new file mode 100644 index 00000000..f9868e91 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/EditContactsActivity.java @@ -0,0 +1,104 @@ +package com.tutpro.baresip; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.util.TypedValue; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.EditText; +import android.widget.TextView; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; + +public class EditContactsActivity extends AppCompatActivity { + + private EditText editText; + private String path; + private File file; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit_contacts); + + editText = (EditText)findViewById(R.id.editText); + path = getApplicationContext().getFilesDir().getAbsolutePath() + + "/contacts"; + file = new File(path); + String content; + + if (!file.exists()) { + Log.e("Baresip", "Failed to find contacts file"); + content = "No contacts"; + } else { + Log.e("Baresip", "Found contacts file"); + int length = (int)file.length(); + byte[] bytes = new byte[length]; + try { + FileInputStream in = new FileInputStream(file); + try { + in.read(bytes); + } finally { + in.close(); + } + content = new String(bytes); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to read contacts file: " + e.toString()); + content = "Failed to read account file"; + } + } + + Log.d("Baresip", "Content length is: " + content.length()); + + editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.textsize)); + editText.setText(content, TextView.BufferType.EDITABLE); + } + + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.edit_menu, menu); + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + Intent i = new Intent(this, MainActivity.class); + switch (item.getItemId()) { + case R.id.save: + try { + FileOutputStream fOut = + new FileOutputStream(file.getAbsoluteFile(), false); + OutputStreamWriter fWriter = new OutputStreamWriter(fOut); + String res = editText.getText().toString(); + try { + fWriter.write(res); + fWriter.close(); + fOut.close(); + } catch (java.io.IOException e) { + Log.e("Baresip", "Failed to write contacts file: " + + e.toString()); + } + } catch (java.io.FileNotFoundException e) { + Log.e("Baresip", "Failed to find contacts file: " + + e.toString()); + } + Log.d("Baresip", "Updated contacts file"); + i.putExtra("action", "save"); + startActivity(i); + return true; + case R.id.cancel: + i.putExtra("action", "cancel"); + startActivity(i); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} + diff --git a/app/src/main/java/com/tutpro/baresip/MainActivity.java b/app/src/main/java/com/tutpro/baresip/MainActivity.java new file mode 100644 index 00000000..b3a1d5e6 --- /dev/null +++ b/app/src/main/java/com/tutpro/baresip/MainActivity.java @@ -0,0 +1,499 @@ +package com.tutpro.baresip; + +import android.content.Intent; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.graphics.Color; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.*; +import android.widget.RelativeLayout.LayoutParams; +import android.view.*; +import android.util.Log; +import java.util.*; +import java.io.*; +import android.content.Context; + +public class MainActivity extends AppCompatActivity { + + static Context mainActivityContext; + static Boolean running = false; + static List accountList = new ArrayList<>(); + static EditText callee; + static RelativeLayout layout; + static Button callButton; + static ArrayList Accounts = new ArrayList<>(); + static ArrayList AoRs = new ArrayList<>(); + static ArrayList Images = new ArrayList<>(); + static AccountSpinnerAdapter AccountAdapter = null; + static ArrayList In = new ArrayList<>(); + static ArrayList Out = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + mainActivityContext = getApplicationContext(); + + Spinner AoRSpinner = (Spinner) findViewById(R.id.AoRList); + Log.i("Baresip", "Setting AccountAdapter"); + AccountAdapter = new AccountSpinnerAdapter(getApplicationContext(), AoRs, Images); + AoRSpinner.setAdapter(AccountAdapter); + AoRSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String aor = AoRs.get(position); + Log.i("Baresip", "Setting " + aor + " current"); + ua_current_set(aor); + ArrayList out = uaCalls(Out, ua_current()); + if (out.size() == 0) { + callee.setText(""); + callButton.setText("Call"); + } else { + callee.setText(out.get(0).getPeerURI()); + callButton.setText(out.get(0).getStatus()); + } + ArrayList in = uaCalls(In, ua_current()); + int view_count = layout.getChildCount(); + Log.d("Baresip", "View count is " + view_count); + if (view_count > 4) { + layout.removeViews(4, view_count - 4); + } + for (Call c: in) { + for (int call_index = 0; call_index < In.size(); call_index++) { + addCallViews(c,(call_index + 1) * 10); + } + } + } + @Override + public void onNothingSelected(AdapterView parent) { + Log.i("Baresip", "Nothing selected"); + } + }); + + String[] assets = {"config", "accounts", "busy.wav", "callwaiting.wav", "error.wav", + "message.wav", "notfound.wav", "ring.wav", "ringback.wav"}; + final String path = mainActivityContext.getFilesDir().getPath(); + Log.d("Baresip", "path is: " + path); + File file; + file = new File(path); + if (!file.exists()) { + Log.d("Baresip", "Creating baresip directory"); + try { + new File(path).mkdirs(); + } catch (Error e) { + Log.e("Baresip", "Failed to create directory: " + + e.toString()); + } + } + for (String a : assets) { + file = new File(path + "/" + a); + if (!file.exists()) { + Log.d("Baresip", "Copying asset " + a); + copyAsset(a, path + "/" + a); + } + } + + if (!running) { + Log.i("Baresip", "Starting Baresip with path " + path); + new Thread(new Runnable() { + public void run() { + baresipStart(path); + } + }).start(); + running = true; + } + + layout = (RelativeLayout) findViewById(R.id.mainActivityLayout); + + callee = (EditText)findViewById(R.id.callee); + + callButton = (Button)findViewById(R.id.callButton); + callButton.setText("Call"); + callButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String ua = ua_current(); + if (callButton.getText().toString().equals("Call")) { + String uri = ((EditText) findViewById(R.id.callee)).getText().toString(); + if (!uri.startsWith("sip:")) uri = "sip:" + uri; + if (!uri.contains("@")) { + String aor = ua_aor(ua); + String host = aor.substring(aor.indexOf("@") + 1); + uri = uri + "@" + host; + } + ((EditText) findViewById(R.id.callee)).setText(uri); + Log.i("Baresip", "Calling " + uri); + String call = ua_connect(uri); + if (!call.equals("")) { + Log.i("Baresip", "Adding outgoing call " + ua + "/" + call + + "/" + uri); + Out.add(new Call(ua, call, uri,"Cancel")); + callButton.setText("Cancel"); + } + } else { + Log.i("Baresip", "Hanging up " + + ((EditText) findViewById(R.id.callee)).getText()); + ua_hangup(ua, "", 486, "Rejected"); + } + } + }); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + Log.d("Baresip", "Screen orientation change to landscape"); + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ + Log.d("Baresip", "Screen orientation change to portrait"); + } + } + + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.main_menu, menu); + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + Intent i = new Intent(this, MainActivity.class); + switch (item.getItemId()) { + case R.id.accounts: + startActivity(new Intent(MainActivity.this, + EditAccountsActivity.class)); + return true; + case R.id.config: + startActivity(new Intent(MainActivity.this, + EditConfigActivity.class)); + return true; + //case R.id.contacts: + // startActivity(new Intent(MainActivity.this, + // EditContactsActivity.class)); + //return true; + case R.id.about: + startActivity(new Intent(MainActivity.this, + AboutActivity.class)); + return true; + case R.id.quit: + if (running) { + Log.d("Baresip", "Stopping"); + baresipStop(); + Accounts.clear(); + AoRs.clear(); + Images.clear(); + running = false; + } + finish(); + System.exit(0); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + public ArrayList aorStatusList() { + ArrayList res = new ArrayList<>(); + for (Account a : Accounts) { + res.add(a.getAoR() + " (" + a.getStatus() + ")"); + } + return res; + } + + public void addAccount(String ua) { + String aor = ua_aor(ua); + Log.d("Baresip", "Adding account " + ua + " with AoR " + aor); + Accounts.add(new Account(ua, aor)); + AoRs.add(aor + " ()"); + Images.add(R.drawable.yellow); + runOnUiThread(new Runnable() { + @Override + public void run() { + AccountAdapter.notifyDataSetChanged(); + } + }); + } + + private void copyAsset(String asset, String path) { + try { + AssetManager assetManager = getAssets(); + InputStream is = assetManager.open(asset); + OutputStream os = new FileOutputStream(path); + byte [] buffer = new byte[512]; + int byteRead; + while ((byteRead = is.read(buffer)) != -1) { + os.write(buffer, 0, byteRead); + } + } catch (IOException e) { + Log.e("Baresip", "Failed to read asset " + asset + ": " + + e.toString()); + } + } + + private void addCallViews(final Call call, int id) { + Log.d("Baresip", "Creating new Incoming textview at " + id); + TextView caller_heading = new TextView(mainActivityContext); + caller_heading.setText("Incoming call from ..."); + caller_heading.setTextColor(Color.BLACK); + caller_heading.setTextSize(20); + caller_heading.setPadding(10, 20, 0, 0); + caller_heading.setId(id); + LayoutParams heading_params = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + if (id == 10) + heading_params.addRule(RelativeLayout.BELOW, callButton.getId()); + else + heading_params.addRule(RelativeLayout.BELOW,id - 10 + 3); + caller_heading.setLayoutParams(heading_params); + layout.addView(caller_heading); + + TextView caller_uri = new TextView(mainActivityContext); + caller_uri.setText(In.get(In.size() - 1).getPeerURI()); + caller_uri.setTextColor(Color.GREEN); + caller_uri.setTextSize(20); + caller_uri.setPadding(10, 10, 0, 10); + Log.d("Baresip", "Creating new caller textview at " + (id + 1)); + caller_uri.setId(id + 1); + LayoutParams caller_uri_params = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + caller_uri_params.addRule(RelativeLayout.BELOW, id); + caller_uri.setLayoutParams(caller_uri_params); + layout.addView(caller_uri); + + Button answer_button = new Button(mainActivityContext); + answer_button.setText("Answer"); + answer_button.setBackgroundResource(android.R.drawable.btn_default); + answer_button.setTextColor(Color.BLACK); + Log.d("Baresip", "Creating new answer button at " + (id + 2)); + answer_button.setId(id + 2); + answer_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String call_ua = call.getUA(); + String call_call = call.getCall(); + switch (((Button)v).getText().toString()) { + case "Answer": + Log.i("Baresip", "UA " + call_ua + " accepting incoming call " + + call_call); + ua_answer(call_ua, call_call); + final int final_in_index = callIndex(In, call_ua, call_call); + if (final_in_index >= 0) { + Log.d("Baresip", "Changing answer button text to Hangup"); + runOnUiThread(new Runnable() { + @Override + public void run() { + final int answer_id = (final_in_index + 1) * 10 + 2; + Button answer_button = (Button)layout.findViewById(answer_id); + answer_button.setText("Hangup"); + Button reject_button = (Button)layout.findViewById(answer_id + 1); + reject_button.setEnabled(false); + } + }); + } + break; + case "Hangup": + Log.i("Baresip", "UA " + call_ua + " hanging up call " + + call_call); + ua_hangup(call_ua, call_call,200, "OK"); + break; + default: + Log.e("Baresip", "Invalid answer button text: " + + ((Button)v).getText().toString()); + break; + } + } + }); + LayoutParams answer_button_params = new LayoutParams(200, + LayoutParams.WRAP_CONTENT); + answer_button_params.addRule(RelativeLayout.BELOW, id + 1); + answer_button_params.setMargins(3, 10, 0, 0); + answer_button.setLayoutParams(answer_button_params); + layout.addView(answer_button); + + Button reject_button = new Button(mainActivityContext); + reject_button.setText("Reject"); + reject_button.setBackgroundResource(android.R.drawable.btn_default); + reject_button.setTextColor(Color.BLACK); + Log.d("Baresip", "Creating new reject button at " + (id + 3)); + reject_button.setId(id + 3); + reject_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.i("Baresip", "UA " + call.getUA() + + " rejecting incoming call " + call.getCall()); + ua_hangup(call.getUA(), call.getCall(), 486, "Rejected"); + } + }); + LayoutParams reject_button_params = new LayoutParams(200, + LayoutParams.WRAP_CONTENT); + reject_button_params.addRule(RelativeLayout.BELOW, id + 1); + reject_button_params.setMargins(225, 10, 0, 0); + reject_button.setLayoutParams(reject_button_params); + layout.addView(reject_button); + } + + private int callIndex(ArrayList calls, String ua, String call) { + for (int i = 0; i < calls.size(); i++) { + if (calls.get(i).getUA().equals(ua) && calls.get(i).getCall().equals(call)) + return i; + } + return -1; + } + + private ArrayList uaCalls(ArrayList calls, String ua) { + ArrayList result = new ArrayList<>(); + for (int i = 0; i < calls.size(); i++) { + if (calls.get(i).getUA().equals(ua)) result.add(calls.get(i)); + } + return result; + } + + private void updateStatus(String event, final String ua, final String call) { + String aor = ua_aor(ua); + int index, call_index; + + Log.d("Baresip", "Handling event " + event + " for " + ua + "/" + call + "/" + + aor); + for (index = 0; index < Accounts.size(); index++) { + if (Accounts.get(index).getAoR().equals(aor)) { + Log.d("Baresip", "Found AoR at index " + index); + switch (event) { + case "registering": + case "unregistering": + // Log.d("Baresip", "Setting status to yellow"); + break; + case "registered": + Log.d("Baresip", "Setting status to green"); + Accounts.get(index).setStatus("OK"); + AoRs.set(index, aor); + Images.set(index, R.drawable.green); + runOnUiThread(new Runnable() { + @Override + public void run() { + AccountAdapter.notifyDataSetChanged(); + } + }); + break; + case "registering failed": + Log.d("Baresip", "Setting status to red"); + Accounts.get(index).setStatus("FAIL"); + AoRs.set(index, aor); + Images.set(index, R.drawable.red); + runOnUiThread(new Runnable() { + @Override + public void run() { + AccountAdapter.notifyDataSetChanged(); + } + }); + break; + case "call ringing": + break; + case "call established": + Log.d("Baresip", "Out call number is " + Out.size()); + int out_index = callIndex(Out, ua, call); + if (out_index >= 0) { + Log.d("Baresip", "Changing call button text to Hangup"); + Out.get(out_index).setStatus("Hangup"); + if (ua.equals(ua_current())) { + runOnUiThread(new Runnable() { + @Override + public void run() { + callButton.setText("Hangup"); + } + }); + } + break; + } + Log.e("Baresip", "Unknown call " + ua + "/" + call + + " established"); + break; + case "call incoming": + final String peer_uri = call_peeruri(call); + Log.d("Baresip", "Incoming call " + ua + "/" + call + "/" + + peer_uri); + final Call new_call = new Call(ua, call, peer_uri, "Answer"); + In.add(new_call); + if (ua.equals(ua_current())) { + runOnUiThread(new Runnable() { + @Override + public void run() { + addCallViews(new_call, In.size() * 10); + } + }); + } + break; + case "call closed": + call_index = callIndex(In, ua, call); + if (call_index != -1) { + Log.d("Baresip", "Removing inbound call " + ua + "/" + + call + "/" + In.get(index).getPeerURI()); + final int view_id = (call_index + 1) * 10; + final int remove_count = In.size() - call_index; + final int final_call_index = call_index; + In.remove(call_index); + Log.d("Baresip", "Current UA is " + ua_current()); + if (ua.equals(ua_current())) { + runOnUiThread(new Runnable() { + @Override + public void run() { + View caller_heading = layout.findViewById(view_id); + int view_index = layout.indexOfChild(caller_heading); + Log.d("Baresip", "Index of caller heading is " + + view_index); + layout.removeViews(view_index, 4 * remove_count); + for (int i = final_call_index; i < In.size(); i++) { + addCallViews(In.get(i), (i + 1) * 10); + } + } + }); + } + break; + } + call_index = callIndex(Out, ua, call); + if (call_index != -1) { + Log.d("Baresip", "Removing called call " + ua + "/" + + call + "/" + Out.get(index).getPeerURI()); + Out.remove(call_index); + if (ua.equals(ua_current())) { + runOnUiThread(new Runnable() { + @Override + public void run() { + callButton.setText("Call"); + callButton.setEnabled(true); + } + }); + } + break; + } + Log.e("Baresip", "Unknown call " + ua + "/" + call + + " closed"); + break; + default: + Log.d("Baresip", "Unknown event '" + event + "'"); + break; + } + } + } + } + + public native void baresipStart(String path); + public native void baresipStop(); + public native String ua_aor(String ua); + public native Boolean ua_isregistered(long ua_ptr); + public native String ua_call(String ua); + public native String ua_prev_call(String ua); + public native String call_peeruri(String call); + public native String ua_current(); + public static native void ua_current_set(String s); + public native String ua_connect(String s); + public native void ua_answer(String ua, String call); + public native void ua_hangup(String ua, String call, int code, String reason); + + static { + System.loadLibrary("baresip"); + } + +} diff --git a/app/src/main/res/drawable/edit_aor.xml b/app/src/main/res/drawable/edit_aor.xml new file mode 100644 index 00000000..e5fddbc8 --- /dev/null +++ b/app/src/main/res/drawable/edit_aor.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/green.png b/app/src/main/res/drawable/green.png new file mode 100644 index 0000000000000000000000000000000000000000..fbea016274dd3b1beb49585a11d37e66355b43f7 GIT binary patch literal 1309 zcmV+&1>*XNP)y2Bql;ZQ*2FB8~W0uZ@!SA@u8*BYE67HkyH(| z4@QZ7@r|S}B{eqvj4cHdBU{km7K&+$6uY>5?ZS3HX6JbBo!JFisTw!=GvqRJe)s(U zXYYXU?2pdc%W7s-vx@EYFl&T$jdg{UT&n=CvF>6W1r^)zg(5EtvCIQnfmjAI7UD<` zqeQ>XAS(oE>f-e?toXkH)UbNAhK*Hu2X{cduZ~{Y;KPc-a>&n2=%GZBlgkz@>df4d1k zeBTeTv%y7*8HafJ`riR+xOm_C_i8-*>zm2%twM!MAOeZnDDNcu2OiiA*w&z3+KtLx=BeKkP2`bG8Jk0$>4T7oa@hrRc>jE|oTcvqrcz6@cKE zgAlzjeUfiEB>+0AI8o7A>#f`IA{M!LT6lk|LcA;?!~o$G*j*5BT{J}uKv|r-;o@kR z2($4h{WSIqjvpTi@#1Fj$btO2!f$;id{n)@0v!s0rVud%?JlHUxa_CpJzu#v+Pf#i z2Bb`+k=bz!ej0?x;QSlnna*vkTaHy6*aT&{#UKDS#J0+^Nmzs{2qsweq$L2sE-p2- z6o$Ls{SNoOesEema>?IOxv#8x9kD&AtEK>uLorda0Nep!CX0+kGFZL}02il}sh}vH zOe4+47jbfA4gx1fFN;S8o4S3wO3HJfKzD&t6&;vXC#uzfnhASVz*e{hw~|UL_U;t{ zfcaz`!jq5TMqBW<1nfIo=`SjCkVn_i$sOp5NxDkt;NL|asvKF70oe`-@0WvR0C8bV zG9bYnM3X6;d6|s{9e^(0wNoPom}qyBov4)nIXNbxy>kXAm@p9H z42Y$GEsDdH_IuKz&ibRzweM^xpd2-gIhp{N#8zeV&?JDK03aDQfQu9F920ES;}lXn zt>SR+0t}pa)FsDsYeU|JL!WGf94*ZA|FQrkR}&fWJ7qOtPT`=itOp($zk7l*KzKEg>gd_#VIsJ z_|@SDA=7}(*`vbW;^{d2(K-oma|YZ6=V1Xv9-8&7wgDV2XCQpf0Jt#5ID;4i&V4+G zf!^o`nWG|m*tLC8Qd!&R0FT1~ZU;b)y3#7j0OWWIdxYoGcNPZ=(NqeC`jXK7PWY+A zP9E3pe7tqyo1#2lwUY{+q8kG4f&(|@$f~wQJVBU}!Lls^U?9yU=J3u)0#3a-6OBda zspC5P!pSYb-s7k9a~qrUvB+7@cIgtJO90sb>AeKRj3mq?CaLdQ1UrvKqDu?3<_l-} z#e>kZ|A=1M_O1)IZ!H0jUc%E=z|-KAHzdsj?|K2E$!WNIKMdWU$Khg6a+K%yA77c7 zk9_HC4rp(BP4zavj#yVqu&LA(575Mvf`K8VtCt9GUQLIL6#S=`{>sn){CR00000NkvXXu0mjfZWV0; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/red.png b/app/src/main/res/drawable/red.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b151849ee6cdd8c9e0d4817f45f5c23ba3b4f1 GIT binary patch literal 1167 zcmV;A1aSL_P); zd@Nk(!grezXe~xdEH=V?9t-1{MH{#fYz5W(=OAseu8! zv5@2sJd8`<6Ec6~MgR|%17Cd-Lbzk+-N63Gbt27LJ$`p*4?CzD9b1CL7U znSTOkmf%11hn>=`d%75{+e!D54o3we*|u`7SNTKd>Eg*Av?si{fZUg5lATs0&V`;* zZ0=~g2i)AkXQf163K67+pZdv?}^Lft*wOh6)G^pGSGf@ z{bWP4_RQO}o@f2*b38RPMDD7RA72!yqI6+&m4=ETCCdf&e=aLwu|WBrUY#uB*tXA1S>e8B)TQcGQ_!&p~B2uQlH~_wZoo=p<;o^}**+*p ztOAgg6Q!jyElFO=(BM4d-Z3N5;iDU=``{hK6d+;&KtRC!D9A@1Ah(kRKmrqGbjPRCKm}KF*|N=76Y|wVuH9T|rM>)CZ*_1B z&|||Mj?ZGB*=U5x@pdOtT}DPV(T5ZKO7^J89d;)k za2j?ACWnh52{#f2Y{~joNaWhmOj}C|T4E8WCmDOc^Hv>p=C}^x?5RDza8pf4HeHor zQ;_gw8!clQ=){UYH$$USN$fu9#^+P3kL&z}6T;UYcly@t+EPk%+g(6$F-y`7fMWqX z1E4EsVG$g?%BRQT^i;0|Pp*C8UCQ4%BLJVSp2nq%=jU>hdLl($D zL9+y1jF|}um?+zf-GJZ(4L@XTbHl}Cz}&{V4GOGVTiV;>xnJ#NYff+2G0ldQBdmaW*Y0nbA`+94R&Eu&8LvbBIMt16v zq~0TUK^$m-j*d>){Kc(cU^f0Dd(Wi;DC6Ki`}Q~&Jig&o65JJ-2!#)fBXu6hUsPXw zqzkW{`3Ag){L>8btX7FOz=8^1K4|Wmd7nKE z(lj%7%kb4hF2}O+7Z7cWlUbvjE+yblSAm+f>>yn=!J9PP{R0;58I!tendGdlS(Djz zYOkAwf@Q2d4uUp_bjZI?qe(tyUJuiJOMQL_RtXSE!k z0Te@>rMgIGam7eNzV$mCZ@UgVzYH9aruu%`@AN!bx|oCo%TW!kRG@(9t4Vf|mbDT* zQ33HYP2a#vy*J^xef|z<+HY4sbCu^WT?k-Zl+0eMKuA-CK670Kvdxae(C{57dTXp( z2Kb}NwPvL&gD@*k&YBD=?}=(u6;w^s%=t&C(n1(lD-hWqn#60P5h&a?c3GyV>!8!~ zM3I@$oP}UC0WbguW&lNS6jF$+b`Hr|^P2=9@^dUo5Dnp_fe2LWRVZpaw!^-AYqgEg zz?mA23?T3`PcU#aA=$F201{ct04zW>MkoRvZ=Z%8#{!4tHm!Xsv-RXhxxfHY_H5dH zjvjM0(DNQ+6WJ+BfCQU9oPyS0L$&fkGaGrKwYVJaMMjiB$OsQsAV6vjbi7MhOCTJa zM#f`USjP)3rYtmNtEjdeXsXX)ig=L8sL*9lMP>jL=1`=yrlK^2>6OVg^_!jgnl#0823;LI;!sCjo{-e#w4*N+GnI-8uf z(p3w&W%Cuf3>rl^M`Ti3Q{kLwb_jd>??BZy-mdS>->$W*l0m+2X~?yD*0~UDrGQ2& zQ-r7!T3fZO0b|8x0D`^LaefTz>ZhdOX%C!4B^>U=mX~Y=``)&LdqqAUl`8>Ed4Pgd zL5OqE=p<118jM^Yg8iQcp!wUNM9V)Onc5{E`eqX!`s*?s&sSz)SqUHdPJ_f0`Nu`< u>5I~j=VsA&KIFe2{cnf9{`%j4TmA;@u^R!4rAaRU0000 + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 00000000..9153cded --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_edit_accounts.xml b/app/src/main/res/layout/activity_edit_accounts.xml new file mode 100644 index 00000000..96dd5793 --- /dev/null +++ b/app/src/main/res/layout/activity_edit_accounts.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_edit_config.xml b/app/src/main/res/layout/activity_edit_config.xml new file mode 100644 index 00000000..95a95a68 --- /dev/null +++ b/app/src/main/res/layout/activity_edit_config.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_edit_contacts.xml b/app/src/main/res/layout/activity_edit_contacts.xml new file mode 100644 index 00000000..a556e598 --- /dev/null +++ b/app/src/main/res/layout/activity_edit_contacts.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..6eb0b84c --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/accounts_menu.xml b/app/src/main/res/menu/accounts_menu.xml new file mode 100644 index 00000000..53b5fd18 --- /dev/null +++ b/app/src/main/res/menu/accounts_menu.xml @@ -0,0 +1,12 @@ +

+ + + + + + + + diff --git a/app/src/main/res/menu/edit_menu.xml b/app/src/main/res/menu/edit_menu.xml new file mode 100644 index 00000000..264f9e9b --- /dev/null +++ b/app/src/main/res/menu/edit_menu.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml new file mode 100644 index 00000000..3de6c80f --- /dev/null +++ b/app/src/main/res/menu/main_menu.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d GIT binary patch literal 4842 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..aee44e138434630332d88b1680f33c4b24c70ab3 GIT binary patch literal 10486 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 + + 64dp + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..3ab3e9cb --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..812cb7be --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,6 @@ + + + 16dp + 16dp + 16dp + diff --git a/app/src/main/res/values/dimensions.xml b/app/src/main/res/values/dimensions.xml new file mode 100644 index 00000000..56b7e1c4 --- /dev/null +++ b/app/src/main/res/values/dimensions.xml @@ -0,0 +1,4 @@ + + + 12sp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..109a9fc5 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ + + + baresip + EditActivity + EditAccounts + + Baresip Android application\n\n + Work in progress\n\n + Juha Heinanen jh@tutpro.com\n\n + + No accounts + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..545b9c6d --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + +