From f8d3c0060ef95a4af06580e35226bdbde035452e Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Thu, 16 Dec 2021 11:02:36 +0200 Subject: [PATCH 1/5] Work on informing user when call is held by the peer --- app/src/main/cpp/baresip.c | 6 ++++ .../com/tutpro/baresip/BaresipService.kt | 11 +++++++ .../main/kotlin/com/tutpro/baresip/Call.kt | 7 ++-- .../kotlin/com/tutpro/baresip/MainActivity.kt | 15 +++++++++ app/src/main/res/layout/activity_main.xml | 33 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- 7 files changed, 60 insertions(+), 15 deletions(-) diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index 115c040e..26bd6586 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -200,6 +200,12 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, case UA_EVENT_CALL_ESTABLISHED: len = re_snprintf(event_buf, sizeof event_buf, "call established"); break; + case UA_EVENT_CALL_REMOTE_SDP: + if (strcmp(prm, "offer") != 0) + return; + ardir = sdp_media_rdir(stream_sdpmedia(audio_strm(call_audio(call)))); + len = re_snprintf(event_buf, sizeof event_buf, "call update,%d", ardir); + break; case UA_EVENT_CALL_MENC: if (prm[0] == '0') len = re_snprintf(event_buf, sizeof event_buf, "call secure"); diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 41320650..cb7338ac 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -691,6 +691,17 @@ class BaresipService: Service() { if (!Utils.isVisible()) return } + "call update" -> { + val call = Call.ofCallp(callp) + if (call == null) { + Log.w("Baresip", "Call $callp that is updated is not found") + return + } + when (ev[1]) { + "0", "1" -> call.held = true + "2", "3" -> call.held = false + } + } "call verified", "call secure" -> { val call = Call.ofCallp(callp) if (call == null) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Call.kt b/app/src/main/kotlin/com/tutpro/baresip/Call.kt index 7276888d..6703b3a1 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Call.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Call.kt @@ -7,6 +7,7 @@ class Call(val callp: String, val ua: UserAgent, val peerUri: String, val dir: S var status: String, val dtmfWatcher: TextWatcher?) { var onhold = false + var held = false var security = 0 var zid = "" var hasHistory = false @@ -24,11 +25,11 @@ class Call(val callp: String, val ua: UserAgent, val peerUri: String, val dir: S return call_connect(callp, uri) } - fun startAudio() { - call_start_audio(callp) + fun hold(): Int { + return call_hold(callp, true) } - fun hold(): Int { + fun isOnHold(): Int { return call_hold(callp, true) } diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index a36baa6c..8c181673 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -64,6 +64,7 @@ class MainActivity : AppCompatActivity() { private lateinit var dtmf: EditText private var dtmfWatcher: TextWatcher? = null private lateinit var infoButton: ImageButton + private lateinit var onHoldNotice: TextView private lateinit var uaAdapter: UaSpinnerAdapter private lateinit var aorSpinner: Spinner private lateinit var imm: InputMethodManager @@ -140,6 +141,7 @@ class MainActivity : AppCompatActivity() { transferButton = binding.transferButton dtmf = binding.dtmf infoButton = binding.info + onHoldNotice = binding.onHoldNotice voicemailButton = binding.voicemailButton contactsButton = binding.contactsButton messagesButton = binding.messagesButton @@ -943,6 +945,9 @@ class MainActivity : AppCompatActivity() { showCall(ua) } } + "call update" -> { + showCall(ua) + } "call verify" -> { val callp = params[1] val call = Call.ofCallp(callp) @@ -1674,6 +1679,7 @@ class MainActivity : AppCompatActivity() { BaresipService.isMicMuted = false micIcon!!.setIcon(R.drawable.mic_on) } + onHoldNotice.visibility = View.GONE } else { swipeRefresh.isEnabled = false val call = showCall ?: Call.uaCalls(ua, "")[0] @@ -1691,6 +1697,7 @@ class MainActivity : AppCompatActivity() { answerButton.visibility = View.INVISIBLE rejectButton.visibility = View.INVISIBLE callControl.visibility = View.INVISIBLE + onHoldNotice.visibility = View.GONE dialpadButton.isEnabled = false } "incoming" -> { @@ -1706,6 +1713,7 @@ class MainActivity : AppCompatActivity() { rejectButton.visibility = View.VISIBLE rejectButton.isEnabled = true callControl.visibility = View.INVISIBLE + onHoldNotice.visibility = View.GONE dialpadButton.isEnabled = false } "connected" -> { @@ -1756,6 +1764,13 @@ class MainActivity : AppCompatActivity() { dialpadButton.isEnabled = false infoButton.isEnabled = true callControl.visibility = View.VISIBLE + if (call.held) { + imm.hideSoftInputFromWindow(dtmf.windowToken, 0) + onHoldNotice.text = getString(R.string.call_on_hold_by_peer) + onHoldNotice.visibility = View.VISIBLE + } else { + onHoldNotice.visibility = View.GONE + } } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5b79ec14..d28112c6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -214,17 +214,34 @@ + + + + + @@ -234,9 +251,7 @@ android:layout_height="wrap_content" android:background="@null" android:src="@drawable/contacts" - android:layout_toStartOf="@id/messagesButton" android:layout_marginEnd="10dp" - android:layout_alignParentBottom="true" android:layout_marginBottom="5dp" android:contentDescription="@string/contacts" > @@ -247,9 +262,7 @@ android:layout_height="wrap_content" android:background="@null" android:src="@drawable/messages" - android:layout_toStartOf="@id/callsButton" android:layout_marginEnd="10dp" - android:layout_alignParentBottom="true" android:layout_marginBottom="5dp" android:contentDescription="@string/messages" > @@ -258,9 +271,7 @@ android:id="@+id/callsButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_toStartOf="@id/dialpadButton" android:layout_marginEnd="10dp" - android:layout_alignParentBottom="true" android:layout_marginBottom="5dp" android:padding="0dp" android:background="@null" @@ -273,12 +284,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="15dp" - android:layout_alignParentBottom="true" android:layout_marginBottom="8dp" - android:layout_alignParentEnd="true" android:background="@null" android:src="@drawable/dialpad_off" android:contentDescription="@string/dialpad" > + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac80e60d..d66dec52 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -426,6 +426,7 @@ This call is SECURE and peer is VERIFIED! Do you want to unverify the peer? + Call is on hold by peer Unverify Application data has been backed up to file \'%1$s\'. In Android versions 9 and below, the file is in Download folder. diff --git a/build.gradle b/build.gradle index 0303ba59..14b3bbf7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.0' + ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() From c292994da504d9ffcea038059f5d68a0ff48b15f Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sun, 19 Dec 2021 09:49:04 +0200 Subject: [PATCH 2/5] Renamed hold/resume drawables --- app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 8c181673..e91dea87 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -363,12 +363,12 @@ class MainActivity : AppCompatActivity() { Log.d(TAG, "AoR $aor resuming call ${call.callp} with ${callUri.text}") call.resume() call.onhold = false - holdButton.setImageResource(R.drawable.pause) + holdButton.setImageResource(R.drawable.resume) } else { Log.d(TAG, "AoR $aor holding call ${call.callp} with ${callUri.text}") call.hold() call.onhold = true - holdButton.setImageResource(R.drawable.play) + holdButton.setImageResource(R.drawable.hold) } } @@ -1747,9 +1747,9 @@ class MainActivity : AppCompatActivity() { answerButton.visibility = View.INVISIBLE rejectButton.visibility = View.INVISIBLE if (call.onhold) { - holdButton.setImageResource(R.drawable.play) + holdButton.setImageResource(R.drawable.resume) } else { - holdButton.setImageResource(R.drawable.pause) + holdButton.setImageResource(R.drawable.hold) } dtmf.isEnabled = true dtmf.requestFocus() From 10116a0c8ce13bc041630e534ea3ca266133cedd Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sun, 19 Dec 2021 09:55:18 +0200 Subject: [PATCH 3/5] Renamed pause.xml to hold.xml and replaced play.xml with resume.xml --- app/src/main/res/drawable/{pause.xml => hold.xml} | 0 app/src/main/res/drawable/play.xml | 4 ---- app/src/main/res/drawable/resume.xml | 4 ++++ 3 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/res/drawable/{pause.xml => hold.xml} (100%) delete mode 100644 app/src/main/res/drawable/play.xml create mode 100644 app/src/main/res/drawable/resume.xml diff --git a/app/src/main/res/drawable/pause.xml b/app/src/main/res/drawable/hold.xml similarity index 100% rename from app/src/main/res/drawable/pause.xml rename to app/src/main/res/drawable/hold.xml diff --git a/app/src/main/res/drawable/play.xml b/app/src/main/res/drawable/play.xml deleted file mode 100644 index 6e858ee2..00000000 --- a/app/src/main/res/drawable/play.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/resume.xml b/app/src/main/res/drawable/resume.xml new file mode 100644 index 00000000..24dcacca --- /dev/null +++ b/app/src/main/res/drawable/resume.xml @@ -0,0 +1,4 @@ + + + From e49c67c9ccff3f6923dd21c4ef8187054b025fb5 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sun, 19 Dec 2021 11:04:53 +0200 Subject: [PATCH 4/5] Version upgrade to master level --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bafa8640..36d52643 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId = 'com.tutpro.baresip' minSdkVersion 21 targetSdkVersion 31 - versionCode = 189 - versionName = '37.0.0' + versionCode = 190 + versionName = '37.0.1' externalNativeBuild { cmake { cFlags '-DHAVE_INTTYPES_H' From ed9d510d997285b353d05ecfe1d5c9db042aa3b5 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sun, 19 Dec 2021 11:16:34 +0200 Subject: [PATCH 5/5] Removed unused function --- app/src/main/kotlin/com/tutpro/baresip/Call.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/Call.kt b/app/src/main/kotlin/com/tutpro/baresip/Call.kt index 6703b3a1..36eaa081 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Call.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Call.kt @@ -29,10 +29,6 @@ class Call(val callp: String, val ua: UserAgent, val peerUri: String, val dir: S return call_hold(callp, true) } - fun isOnHold(): Int { - return call_hold(callp, true) - } - fun resume(): Int { return call_hold(callp, false) }