From f71811f65a46d1e676564d9cc7d8a609bd3dfd0c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 7 Apr 2022 10:44:48 +0200 Subject: [PATCH] Improve call notification when calling a conference --- .../compatibility/Api26Compatibility.kt | 33 ++++++++++++++--- .../compatibility/Api31Compatibility.kt | 37 ++++++++++++------- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt index 2f08ba2f9..af76ec673 100644 --- a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt @@ -26,6 +26,8 @@ import android.app.* import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.media.AudioAttributes import android.os.VibrationEffect import android.os.Vibrator @@ -34,7 +36,9 @@ import android.view.inputmethod.EditorInfo import android.widget.RemoteViews import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.Person import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.IconCompat import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -193,12 +197,29 @@ class Api26Compatibility { channel: String, notificationsManager: NotificationsManager ): Notification { - val contact: Friend? = coreContext.contactsManager.findContactByAddress(call.remoteAddress) - val roundPicture = ImageUtils.getRoundBitmapFromUri(context, contact?.getThumbnailUri()) - val displayName = contact?.name ?: LinphoneUtils.getDisplayName(call.remoteAddress) - val stringResourceId: Int val iconResourceId: Int + val roundPicture: Bitmap? + val title: String + val person: Person + + val conferenceInfo = coreContext.core.findConferenceInformationFromUri(call.remoteAddress) + if (conferenceInfo == null) { + val contact: Friend? = + coreContext.contactsManager.findContactByAddress(call.remoteAddress) + roundPicture = ImageUtils.getRoundBitmapFromUri(context, contact?.getThumbnailUri()) + val displayName = contact?.name ?: LinphoneUtils.getDisplayName(call.remoteAddress) + title = contact?.name ?: displayName + person = notificationsManager.getPerson(contact, displayName, roundPicture) + } else { + title = conferenceInfo.subject ?: context.getString(R.string.conference) + roundPicture = BitmapFactory.decodeResource(context.resources, R.drawable.voip_multiple_contacts_avatar_alt) + person = Person.Builder() + .setName(title) + .setIcon(IconCompat.createWithBitmap(roundPicture)) + .build() + } + when (call.state) { Call.State.Paused, Call.State.Pausing, Call.State.PausedByRemote -> { stringResourceId = R.string.call_notification_paused @@ -225,11 +246,11 @@ class Api26Compatibility { val builder = NotificationCompat.Builder( context, channel ) - .setContentTitle(contact?.name ?: displayName) + .setContentTitle(title) .setContentText(context.getString(stringResourceId)) .setSmallIcon(iconResourceId) .setLargeIcon(roundPicture) - .addPerson(notificationsManager.getPerson(contact, displayName, roundPicture)) + .addPerson(person) .setAutoCancel(false) .setCategory(NotificationCompat.CATEGORY_CALL) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) diff --git a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt index 41da79860..830bc8ec3 100644 --- a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt @@ -25,6 +25,7 @@ import android.app.* import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.graphics.drawable.Icon import androidx.core.content.ContextCompat import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -98,11 +99,29 @@ class Api31Compatibility { channel: String, notificationsManager: NotificationsManager ): Notification { - val contact = - coreContext.contactsManager.findContactByAddress(call.remoteAddress) - val roundPicture = ImageUtils.getRoundBitmapFromUri(context, contact?.getThumbnailUri()) - val displayName = contact?.name ?: LinphoneUtils.getDisplayName(call.remoteAddress) + val conferenceInfo = coreContext.core.findConferenceInformationFromUri(call.remoteAddress) + val caller = if (conferenceInfo == null) { + val contact = + coreContext.contactsManager.findContactByAddress(call.remoteAddress) + val roundPicture = + ImageUtils.getRoundBitmapFromUri(context, contact?.getThumbnailUri()) + val displayName = contact?.name ?: LinphoneUtils.getDisplayName(call.remoteAddress) + val person = notificationsManager.getPerson(contact, displayName, roundPicture) + Person.Builder() + .setName(person.name) + .setIcon(person.icon?.toIcon(context)) + .setUri(person.uri) + .setKey(person.key) + .setImportant(person.isImportant) + .build() + } else { + Person.Builder() + .setName(conferenceInfo.subject) + .setIcon(Icon.createWithResource(context, R.drawable.voip_multiple_contacts_avatar_alt)) + .setImportant(false) + .build() + } val isVideo = call.currentParams.isVideoEnabled val iconResourceId: Int = when (call.state) { Call.State.Paused, Call.State.Pausing, Call.State.PausedByRemote -> { @@ -116,16 +135,8 @@ class Api31Compatibility { } } } - - val person = notificationsManager.getPerson(contact, displayName, roundPicture) - val caller = Person.Builder() - .setName(person.name) - .setIcon(person.icon?.toIcon(context)) - .setUri(person.uri) - .setKey(person.key) - .setImportant(person.isImportant) - .build() val declineIntent = notificationsManager.getCallDeclinePendingIntent(notifiable) + val builder = Notification.Builder( context, channel )