added Answer/Reject buttons to heads-up notification

This commit is contained in:
Juha Heinanen
2018-07-16 20:20:44 +03:00
parent d705f9f9e6
commit 19ca0e7cfd
3 changed files with 92 additions and 69 deletions

View File

@ -27,8 +27,6 @@ class BaresipService: Service() {
internal lateinit var intent: Intent
internal lateinit var nm: NotificationManager
internal lateinit var snb: NotificationCompat.Builder
internal lateinit var cnb: NotificationCompat.Builder
internal lateinit var ni: Intent
internal lateinit var npi: PendingIntent
internal lateinit var nr: BroadcastReceiver
internal lateinit var wl: PowerManager.WakeLock
@ -44,9 +42,8 @@ class BaresipService: Service() {
nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
createNotificationChannels()
snb = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
cnb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID)
ni = Intent(this, MainActivity::class.java)
val ni = Intent(this, MainActivity::class.java)
.setAction(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_LAUNCHER)
npi = PendingIntent.getActivity(this, 0, ni, 0)
@ -252,51 +249,40 @@ class BaresipService: Service() {
}
"call incoming" -> {
if (!Utils.isVisible()) {
val cnb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID)
cnb.setVisibility(VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_stat)
.setContentIntent(npi)
.setAutoCancel(true)
.setContentText("Call from ${Api.call_peeruri(callp)}")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
cnb.setVibrate(LongArray(0))
.setPriority(Notification.PRIORITY_HIGH)
}
val view = RemoteViews(getPackageName(), R.layout.call_notification)
/* val view = RemoteViews(getPackageName(), R.layout.call_notification)
view.setTextViewText(R.id.callFrom, "Call from ${Api.call_peeruri(callp)}")
cnb.setContent(view)
nm.notify(CALL_NOTIFICATION_ID, cnb.build())
}
/* if (!Utils.isVisible()) {
val cnb = NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat)
.setContentIntent(npi)
.setVisibility(VISIBILITY_PUBLIC)
.setPriority(Notification.PRIORITY_HIGH)
.setVibrate(LongArray(0))
cnb.setContent(view) */
val answerIntent = Intent(this, MainActivity::class.java)
answerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
answerIntent.putExtra("action", "answer")
answerIntent.putExtra("uap", uap)
answerIntent.putExtra("callp", callp)
val answerPendingIntent = PendingIntent.getActivity(this,
0, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val rejectIntent = Intent(this, MainActivity::class.java)
rejectIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
Intent.FLAG_ACTIVITY_SINGLE_TOP)
rejectIntent.putExtra("action", "reject")
rejectIntent.putExtra("uap", uap)
rejectIntent.putExtra("callp", callp)
val rejectPendingIntent = PendingIntent.getActivity(this,
0, rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val view = RemoteViews(getPackageName(), R.layout.call_notification)
view.setTextViewText(R.id.caller, "${Api.call_peeruri(callp)}")
view.setOnClickPendingIntent(R.id.answerButton, answerPendingIntent)
1, rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT)
/* view.setOnClickPendingIntent(R.id.answerButton, answerPendingIntent)
view.setOnClickPendingIntent(R.id.rejectButton, rejectPendingIntent)
cnb.setCustomBigContentView(view)
cnb.setVibrate(LongArray(0))
cnb.setCustomBigContentView(view) */
cnb.addAction(R.drawable.ic_stat, "Answer", answerPendingIntent)
cnb.addAction(R.drawable.ic_stat, "Reject", rejectPendingIntent)
nm.notify(CALL_NOTIFICATION_ID, cnb.build())
return
} */
}
}
"call established", "call closed" -> {
nm.cancel(CALL_NOTIFICATION_ID)

View File

@ -83,7 +83,7 @@ class MainActivity : AppCompatActivity() {
serviceEventReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
handleServiceEvent(intent.getStringExtra("event"),
intent.getStringExtra("uap" ),
intent.getStringExtra("uap"),
intent.getStringExtra("callp"))
}
}
@ -97,11 +97,12 @@ class MainActivity : AppCompatActivity() {
arrayOf(Manifest.permission.RECORD_AUDIO), RECORD_AUDIO_PERMISSION)
}
aorSpinner = findViewById(R.id.AoRList) as Spinner
aorSpinner = findViewById(R.id.AoRList)
uaAdapter = UaSpinnerAdapter(applicationContext, uas, images)
aorSpinner.adapter = uaAdapter
aorSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
Log.d("Baresip", "aorSpinner selecting $position")
val acc = uas[position].account
val aor = acc.aor
val ua = uas[position]
@ -144,14 +145,26 @@ class MainActivity : AppCompatActivity() {
dtmf.visibility = View.INVISIBLE
}
}
val `in` = Call.uaCalls(calls, ua, "in")
val view_count = layout.childCount
// Log.d("Baresip", "View count is $view_count")
if (view_count > 7)
layout.removeViews(7, view_count - 7)
for (c in `in`)
for (call_index in Call.uaCalls(calls, ua,"in").indices)
addCallViews(ua, c, (call_index + 1) * 10)
for (c in Call.uaCalls(calls, ua, "in"))
for (call_index in Call.uaCalls(calls, ua, "in").indices) {
val startIndex = (call_index + 1) * 10
addCallViews(ua, c, startIndex)
if (answerCall == c.callp) {
answerCall = ""
val answerButton = layout.findViewById(startIndex + 5) as ImageButton
answerButton.performClick()
}
if (rejectCall == c.callp) {
rejectCall = ""
val rejectButton = layout.findViewById(startIndex + 6) as ImageButton
rejectButton.performClick()
moveTaskToBack(true)
}
}
}
override fun onNothingSelected(parent: AdapterView<*>) {
@ -184,7 +197,7 @@ class MainActivity : AppCompatActivity() {
callee.threshold = 2
callee.setAdapter(ArrayAdapter(this, android.R.layout.select_dialog_item,
ContactsActivity.contacts.map{Contact -> Contact.name}))
ContactsActivity.contacts.map { Contact -> Contact.name }))
securityButton.setOnClickListener {
when (securityButton.tag) {
@ -258,7 +271,7 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Hanging up AoR $aor call $callp to " +
(findViewById(R.id.callee) as EditText).text)
callButton.isEnabled = false
ua_hangup(ua.uap, callp,0, "")
ua_hangup(ua.uap, callp, 0, "")
}
}
}
@ -275,7 +288,7 @@ class MainActivity : AppCompatActivity() {
val call = Call.calls(calls, "out")[0]
call_unhold(call.callp)
call.hold = false
holdButton.tag= "Hold"
holdButton.tag = "Hold"
holdButton.setImageResource(R.drawable.hold)
}
}
@ -332,16 +345,7 @@ class MainActivity : AppCompatActivity() {
aorSpinner.setSelection(account_index)
else
addCallViews(ua, new_call, Call.uaCalls(calls, ua, "in").size * 10)
am.mode = AudioManager.MODE_RINGTONE
rt.play()
rtTimer = Timer()
rtTimer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
if (!rt.isPlaying()) {
rt.play()
}
}
}, 1000 * 1, 1000 * 1)
startRinging()
if (Utils.isVisible()) {
Log.d("Baresip", "Baresip is visible")
val i = Intent(applicationContext, MainActivity::class.java)
@ -531,11 +535,7 @@ class MainActivity : AppCompatActivity() {
History.aorRemoveHistory(history, aor)
history.add(History(aor, call.peerURI, "in", false))
}
if (rtTimer != null) {
rtTimer!!.cancel()
rtTimer = null
if (rt.isPlaying) rt.stop()
}
stopRinging()
} else {
Log.d("Baresip", "Removing outgoing call $uap/$callp/" +
call.peerURI)
@ -576,21 +576,13 @@ class MainActivity : AppCompatActivity() {
val action = intent.getStringExtra("action")
Log.d("Baresip", "Got onNewIntent action $action")
if (action == null) return
val uap = intent.getStringExtra("uap")
val callp = intent.getStringExtra("callp")
val ua = UserAgent.find(uas, intent.getStringExtra("uap"))!!
val aor = ua.account.aor
val peer_uri = Api.call_peeruri(callp)
when (action) {
"answer" -> {
/* TODO */
answerCall = callp
}
"reject" -> {
Log.d("Baresip", "Rejecting incoming call from $peer_uri")
ua_hangup(uap, callp, 486, "Busy Here")
if (History.aorHistory(history, aor) > HISTORY_SIZE)
History.aorRemoveHistory(history, aor)
history.add(History(aor, peer_uri, "in", false))
rejectCall = callp
moveTaskToBack(true)
}
}
@ -607,6 +599,24 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Resumed")
imm.hideSoftInputFromWindow(callee.windowToken, 0)
visible = true
if ((answerCall != "") && (layout.childCount > 7)) {
answerCall = ""
/* if multiple calls, right answer button needs to be searched */
val answerButton = layout.findViewById(10 + 5) as ImageButton
answerButton.performClick()
}
if ((rejectCall != "") && (layout.childCount > 7)) {
rejectCall = ""
/* if multiple calls, right reject button needs to be searched */
val rejectButton = layout.findViewById(10 + 6) as ImageButton
rejectButton.performClick()
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
Log.d("Baresip", "View count at onAttachedToWindow is ${layout.childCount}")
Toast.makeText(this, "Hi UI is fully loaded", Toast.LENGTH_SHORT).show();
}
override fun onBackPressed() {
@ -727,10 +737,10 @@ class MainActivity : AppCompatActivity() {
val call = ua_connect(ua.uap, uri)
if (call != "") {
Log.d("Baresip", "Adding outgoing call ${ua.uap}/$call/$uri")
val dtmfWatcher = object: TextWatcher {
val dtmfWatcher = object : TextWatcher {
override fun beforeTextChanged(sequence: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(sequence: CharSequence, start: Int, before: Int, count: Int) {
val digit = sequence.subSequence(start, start+count).toString()
val digit = sequence.subSequence(start, start + count).toString()
Log.d("Baresip", "Got DTMF digit '" + digit + "'")
if (digit.isNotEmpty()) call_send_digit(call, digit[0])
}
@ -738,7 +748,7 @@ class MainActivity : AppCompatActivity() {
call_send_digit(call, 4.toChar())
}
}
calls.add(Call(call, ua, uri, "out","Cancel", dtmfWatcher))
calls.add(Call(call, ua, uri, "out", "Cancel", dtmfWatcher))
callButton.tag = "Cancel"
callButton.setImageResource(R.drawable.hangup)
holdButton.visibility = View.INVISIBLE
@ -928,9 +938,15 @@ class MainActivity : AppCompatActivity() {
private fun setSecurityButtonTag(button: ImageButton, security: Int) {
when (security) {
R.drawable.box_red -> { button.tag = "red" }
R.drawable.box_yellow -> { button.tag = "yellow" }
R.drawable.box_green -> { button.tag = "green" }
R.drawable.box_red -> {
button.tag = "red"
}
R.drawable.box_yellow -> {
button.tag = "yellow"
}
R.drawable.box_green -> {
button.tag = "green"
}
}
}
@ -938,10 +954,31 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Holding call with ${call.peerURI} at ${button.id}")
call_hold(call.callp)
call.hold = true
button.tag= "Resume"
button.tag = "Resume"
button.setImageResource(R.drawable.resume)
}
private fun startRinging() {
am.mode = AudioManager.MODE_RINGTONE
rt.play()
rtTimer = Timer()
rtTimer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
if (!rt.isPlaying()) {
rt.play()
}
}
}, 1000 * 1, 1000 * 1)
}
private fun stopRinging() {
if (rtTimer != null) {
rtTimer!!.cancel()
rtTimer = null
if (rt.isPlaying) rt.stop()
}
}
external fun uag_current(): String
external fun uag_current_set(uap: String)
external fun ua_connect(uap: String, peer_uri: String): String
@ -961,6 +998,8 @@ class MainActivity : AppCompatActivity() {
internal var calls = ArrayList<Call>()
var filesPath = ""
var visible = true
var answerCall = ""
var rejectCall = ""
const val ACCOUNTS_CODE = 1
const val CONTACTS_CODE = 2

View File

@ -41,7 +41,6 @@
android:textSize="15dp"
style = "@android:style/TextAppearance.Medium" />
<!--
<Button android:id="@+id/answerButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -62,6 +61,5 @@
android:layout_marginStart="20dp"
android:layout_gravity="center"
android:text="Reject" />
-->
</RelativeLayout>