From bd94c792aa7a3d0b7c5e53e0c979e522e6c3beb3 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Fri, 3 Sep 2021 12:34:37 +0300 Subject: [PATCH] Improved implementation of notifications --- .../com/tutpro/baresip/BaresipService.kt | 194 +++++++++--------- 1 file changed, 96 insertions(+), 98 deletions(-) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 7a9289d4..a5ff9ce5 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -4,7 +4,6 @@ import android.Manifest import android.annotation.SuppressLint import android.annotation.TargetApi import android.app.* -import android.app.PendingIntent.getActivity import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothHeadset import android.content.* @@ -290,24 +289,6 @@ class BaresipService: Service() { } } - "Call Show", "Call Answer" -> { - val newIntent = Intent(this, MainActivity::class.java) - newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_NEW_TASK - newIntent.putExtra("action", action.lowercase(Locale.ROOT)) - newIntent.putExtra("callp", intent!!.getStringExtra("callp")) - startActivity(newIntent) - } - - "Call Missed" -> { - val newIntent = Intent(this, MainActivity::class.java) - newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_NEW_TASK - newIntent.putExtra("action", action.lowercase(Locale.ROOT)) - newIntent.putExtra("uap", intent!!.getStringExtra("uap")) - startActivity(newIntent) - } - "Call Reject" -> { val callp = intent!!.getStringExtra("callp")!! val call = Call.ofCallp(callp) @@ -325,23 +306,6 @@ class BaresipService: Service() { } } - "Transfer Show", "Transfer Accept" -> { - val uap = intent!!.getStringExtra("uap")!! - val ua = UserAgent.ofUap(uap) - if (ua == null) { - Log.w(TAG, "onStartCommand did not find ua $uap") - } else { - val newIntent = Intent(this, MainActivity::class.java) - newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or - Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK - newIntent.putExtra("action", action.lowercase(Locale.ROOT)) - newIntent.putExtra("callp", intent.getStringExtra("callp")) - newIntent.putExtra("uri", intent.getStringExtra("uri")) - startActivity(newIntent) - nm.cancel(TRANSFER_NOTIFICATION_ID) - } - } - "Transfer Deny" -> { val callp = intent!!.getStringExtra("callp")!! val call = Call.ofCallp(callp) @@ -352,17 +316,6 @@ class BaresipService: Service() { nm.cancel(TRANSFER_NOTIFICATION_ID) } - "Message Show", "Message Reply" -> { - val newIntent = Intent(this, MainActivity::class.java) - newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_NEW_TASK - newIntent.putExtra("action", action.lowercase(Locale.ROOT)) - newIntent.putExtra("uap", intent!!.getStringExtra("uap")) - newIntent.putExtra("peer", intent.getStringExtra("peer")) - startActivity(newIntent) - nm.cancel(MESSAGE_NOTIFICATION_ID) - } - "Message Save" -> { val uap = intent!!.getStringExtra("uap")!! val ua = UserAgent.ofUap(uap) @@ -439,6 +392,7 @@ class BaresipService: Service() { } } + @SuppressLint("UnspecifiedImmutableFlag") @Keep fun uaEvent(event: String, uap: String, callp: String) { if (!isServiceRunning) return @@ -559,10 +513,16 @@ class BaresipService: Service() { } } if (!Utils.isVisible()) { - val intent = Intent(this, BaresipService::class.java) - intent.action = "Call Show" - intent.putExtra("callp", callp) - val pi = PendingIntent.getService(this, CALL_REQ_CODE, intent, + val intent = Intent(applicationContext, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("action", "call show") + .putExtra("callp", callp) + val pi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, CALL_REQ_CODE, intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, CALL_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT) val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID) val caller = Utils.friendlyUri(ContactsActivity.contactName(peerUri), @@ -584,22 +544,28 @@ class BaresipService: Service() { .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) .priority = Notification.PRIORITY_HIGH } - val answerIntent = Intent(this, BaresipService::class.java) - answerIntent.action = "Call Answer" - answerIntent.putExtra("callp", callp) - val answerPendingIntent = PendingIntent.getService(this, - ANSWER_REQ_CODE, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT) + val answerIntent = Intent(applicationContext, MainActivity::class.java) + answerIntent.putExtra("action", "call answer") + .putExtra("callp", callp) + val api = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, ANSWER_REQ_CODE, answerIntent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, ANSWER_REQ_CODE, answerIntent, + PendingIntent.FLAG_UPDATE_CURRENT) val rejectIntent = Intent(this, BaresipService::class.java) rejectIntent.action = "Call Reject" rejectIntent.putExtra("callp", callp) - val rejectPendingIntent = PendingIntent.getService(this, - REJECT_REQ_CODE, rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT) + val rpi = if (VERSION.SDK_INT >= 23) + PendingIntent.getService(this, REJECT_REQ_CODE, rejectIntent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getService(this, REJECT_REQ_CODE, rejectIntent, + PendingIntent.FLAG_UPDATE_CURRENT) nb.addAction(R.drawable.ic_stat, - getActionText(R.string.answer, R.color.colorGreen), - answerPendingIntent) + getActionText(R.string.answer, R.color.colorGreen), api) nb.addAction(R.drawable.ic_stat, - getActionText(R.string.reject, R.color.colorRed), - rejectPendingIntent) + getActionText(R.string.reject, R.color.colorRed), rpi) nm.notify(CALL_NOTIFICATION_ID, nb.build()) return } @@ -661,12 +627,16 @@ class BaresipService: Service() { return } if (!Utils.isVisible()) { - val intent = Intent(this, BaresipService::class.java) - intent.action = "Transfer Show" - intent.putExtra("uap", uap) - .putExtra("callp", callp) - .putExtra("uri", ev[1]) - val pi = PendingIntent.getService(this, TRANSFER_REQ_CODE, + val intent = Intent(applicationContext, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("action", "transfer show") + .putExtra("callp", callp).putExtra("uri", ev[1]) + val pi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, TRANSFER_REQ_CODE, intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, TRANSFER_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT) val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID) val target = Utils.friendlyUri(ContactsActivity.contactName(ev[1]), @@ -681,22 +651,26 @@ class BaresipService: Service() { if (VERSION.SDK_INT < 26) @Suppress("DEPRECATION") nb.setVibrate(LongArray(0)) - .setVisibility(NotificationCompat.VISIBILITY_PRIVATE).priority = - Notification.PRIORITY_HIGH - val acceptIntent = Intent(this, BaresipService::class.java) - acceptIntent.action = "Transfer Accept" - acceptIntent.putExtra("uap", uap) - .putExtra("callp", callp) - .putExtra("uri", ev[1]) - val acceptPendingIntent = PendingIntent.getService(this, - ACCEPT_REQ_CODE, acceptIntent, PendingIntent.FLAG_UPDATE_CURRENT) + .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) + .priority = Notification.PRIORITY_HIGH + val acceptIntent = Intent(applicationContext, MainActivity::class.java) + acceptIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK + acceptIntent.putExtra("action","transfer accept") + .putExtra("callp", callp).putExtra("uri", ev[1]) + val api = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, ACCEPT_REQ_CODE, + acceptIntent, PendingIntent.FLAG_IMMUTABLE or + PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, ACCEPT_REQ_CODE, + acceptIntent, PendingIntent.FLAG_UPDATE_CURRENT) val denyIntent = Intent(this, BaresipService::class.java) denyIntent.action = "Transfer Deny" denyIntent.putExtra("callp", callp) val denyPendingIntent = PendingIntent.getService(this, DENY_REQ_CODE, denyIntent, PendingIntent.FLAG_UPDATE_CURRENT) - nb.addAction(R.drawable.ic_stat, getString(R.string.accept), - acceptPendingIntent) + nb.addAction(R.drawable.ic_stat, getString(R.string.accept), api) nb.addAction(R.drawable.ic_stat, getString(R.string.deny), denyPendingIntent) nm.notify(TRANSFER_NOTIFICATION_ID, nb.build()) @@ -729,10 +703,16 @@ class BaresipService: Service() { if (!Utils.isVisible() && !call.hasHistory && call.dir == "in") { val caller = Utils.friendlyUri(ContactsActivity.contactName(call.peerUri), Utils.aorDomain(aor)) - val intent = Intent(this, BaresipService::class.java) - intent.action = "Call Missed" - intent.putExtra("uap", uap) - val pi = PendingIntent.getService(this, CALL_REQ_CODE, intent, + val intent = Intent(applicationContext, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("action", "call missed") + .putExtra("uap", uap) + val pi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, CALL_REQ_CODE, intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, CALL_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT) val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID) nb.setSmallIcon(R.drawable.ic_stat) @@ -775,6 +755,7 @@ class BaresipService: Service() { LocalBroadcastManager.getInstance(this).sendBroadcast(intent) } + @SuppressLint("UnspecifiedImmutableFlag") @Keep fun messageEvent(uap: String, peer: String, msg: ByteArray) { var text = "Decoding of message failed!" @@ -795,11 +776,16 @@ class BaresipService: Service() { Message.save() ua.account.unreadMessages = true if (!Utils.isVisible()) { - val intent = Intent(this, BaresipService::class.java) - intent.action = "Message Show" - intent.putExtra("uap", uap) + val intent = Intent(applicationContext, MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("action", "message show").putExtra("uap", uap) .putExtra("peer", peer) - val pi = PendingIntent.getService(this, MESSAGE_REQ_CODE, intent, + val pi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, MESSAGE_REQ_CODE, intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, MESSAGE_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT) val nb = NotificationCompat.Builder(this, HIGH_CHANNEL_ID) val sender = Utils.friendlyUri(ContactsActivity.contactName(peer), @@ -817,12 +803,17 @@ class BaresipService: Service() { .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) .priority = Notification.PRIORITY_HIGH } - val replyIntent = Intent(this, BaresipService::class.java) - replyIntent.action = "Message Reply" - replyIntent.putExtra("uap", uap) - .putExtra("peer", peer) - val replyPendingIntent = PendingIntent.getService(this, - REPLY_REQ_CODE, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT) + val replyIntent = Intent(applicationContext, MainActivity::class.java) + replyIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_NEW_TASK + replyIntent.putExtra("action", "message reply") + .putExtra("uap", uap).putExtra("peer", peer) + val rpi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, REPLY_REQ_CODE, replyIntent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + else + PendingIntent.getActivity(applicationContext, REPLY_REQ_CODE, replyIntent, + PendingIntent.FLAG_UPDATE_CURRENT) val saveIntent = Intent(this, BaresipService::class.java) saveIntent.action = "Message Save" saveIntent.putExtra("uap", uap) @@ -835,7 +826,7 @@ class BaresipService: Service() { .putExtra("time", timeStamp) val deletePendingIntent = PendingIntent.getService(this, DELETE_REQ_CODE, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT) - nb.addAction(R.drawable.ic_stat, "Reply", replyPendingIntent) + nb.addAction(R.drawable.ic_stat, "Reply", rpi) nb.addAction(R.drawable.ic_stat, "Save", savePendingIntent) nb.addAction(R.drawable.ic_stat, "Delete", deletePendingIntent) nm.notify(MESSAGE_NOTIFICATION_ID, nb.build()) @@ -880,8 +871,10 @@ class BaresipService: Service() { LocalBroadcastManager.getInstance(this).sendBroadcast(intent) callActionUri = "" if (VERSION.SDK_INT >= 23) - if (pm.isIgnoringBatteryOptimizations(applicationContext.packageName)) - Log.d(TAG, "Battery optimizations are ignored") + Log.d(TAG, "Battery optimizations are ignored: " + + "${pm.isIgnoringBatteryOptimizations(applicationContext.packageName)}") + Log.d(TAG, "Partial wake lock/wifi lock is held: " + + "${partialWakeLock.isHeld}/${wifiLock.isHeld}") } @Keep @@ -910,11 +903,16 @@ class BaresipService: Service() { } } + @SuppressLint("UnspecifiedImmutableFlag") private fun showStatusNotification() { - val intent = Intent(this, MainActivity::class.java) + val intent = Intent(applicationContext, MainActivity::class.java) .setAction(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) - val pi = getActivity(this, STATUS_REQ_CODE, intent, 0) + val pi = if (VERSION.SDK_INT >= 23) + PendingIntent.getActivity(applicationContext, STATUS_REQ_CODE, intent, + PendingIntent.FLAG_IMMUTABLE) + else + PendingIntent.getActivity(applicationContext, STATUS_REQ_CODE, intent, 0) snb.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setSmallIcon(R.drawable.ic_stat) .setContentIntent(pi)