diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c
index 498f1a99..c42ab546 100644
--- a/app/src/main/cpp/baresip.c
+++ b/app/src/main/cpp/baresip.c
@@ -198,6 +198,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 e621edc3..fe85220b 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt
@@ -695,6 +695,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 511e44a9..36eaa081 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
diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt
index 50f13c95..b6f6bcf2 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
@@ -361,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)
}
}
@@ -943,6 +945,9 @@ class MainActivity : AppCompatActivity() {
showCall(ua)
}
}
+ "call update" -> {
+ showCall(ua)
+ }
"call verify" -> {
val callp = params[1]
val call = Call.ofCallp(callp)
@@ -1682,6 +1687,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]
@@ -1699,6 +1705,7 @@ class MainActivity : AppCompatActivity() {
answerButton.visibility = View.INVISIBLE
rejectButton.visibility = View.INVISIBLE
callControl.visibility = View.INVISIBLE
+ onHoldNotice.visibility = View.GONE
dialpadButton.isEnabled = false
}
"incoming" -> {
@@ -1714,6 +1721,7 @@ class MainActivity : AppCompatActivity() {
rejectButton.visibility = View.VISIBLE
rejectButton.isEnabled = true
callControl.visibility = View.INVISIBLE
+ onHoldNotice.visibility = View.GONE
dialpadButton.isEnabled = false
}
"connected" -> {
@@ -1747,9 +1755,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()
@@ -1764,6 +1772,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/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 @@
+
+
+
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 7e7a7eed..963e537c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -429,6 +429,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.