Skip to content

Commit 1a4662e

Browse files
committed
Show sender profile picture on notification
Signed-off-by: Jens Zalzala <jens@shakingearthdigital.com>
1 parent 3e7b7e8 commit 1a4662e

2 files changed

Lines changed: 80 additions & 16 deletions

File tree

app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ import androidx.core.app.ActivityCompat
3030
import androidx.core.app.NotificationCompat
3131
import androidx.core.app.NotificationManagerCompat
3232
import androidx.core.app.Person
33+
import androidx.core.content.pm.ShortcutInfoCompat
34+
import androidx.core.content.pm.ShortcutManagerCompat
35+
import androidx.core.graphics.drawable.IconCompat
3336
import androidx.core.app.RemoteInput
3437
import androidx.core.content.ContextCompat
3538
import androidx.core.graphics.drawable.toBitmap
@@ -76,7 +79,6 @@ import com.nextcloud.talk.utils.NotificationUtils.cancelAllNotificationsForAccou
7679
import com.nextcloud.talk.utils.NotificationUtils.cancelNotification
7780
import com.nextcloud.talk.utils.NotificationUtils.findNotificationForRoom
7881
import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri
79-
import com.nextcloud.talk.utils.NotificationUtils.loadAvatarSync
8082
import com.nextcloud.talk.utils.ParticipantPermissions
8183
import com.nextcloud.talk.utils.PushUtils
8284
import com.nextcloud.talk.utils.bundle.BundleKeys
@@ -660,6 +662,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
660662
}
661663
addReplyAction(notificationBuilder, systemNotificationId)
662664
addMarkAsReadAction(notificationBuilder, systemNotificationId)
665+
pushConversationShortcut(notificationBuilder)
663666
}
664667
}
665668

@@ -766,17 +769,38 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
766769
val senderName = notificationUser?.name ?: ""
767770
val conversationTitle = pushMessage.subject.ifEmpty { senderName }
768771

772+
val avatarBitmap = loadSenderAvatar(notificationUser)
773+
if (avatarBitmap != null) {
774+
notificationBuilder.setLargeIcon(avatarBitmap)
775+
}
776+
769777
val bitmap = loadImageBitmapSync(imagePreviewUrl!!)
770778
if (bitmap != null) {
771-
notificationBuilder
772-
.setLargeIcon(bitmap)
773-
.setStyle(
774-
NotificationCompat.BigPictureStyle()
775-
.bigPicture(bitmap)
776-
.bigLargeIcon(null as Bitmap?)
777-
.setBigContentTitle(conversationTitle)
778-
)
779+
notificationBuilder.setStyle(
780+
NotificationCompat.BigPictureStyle()
781+
.bigPicture(bitmap)
782+
.bigLargeIcon(avatarBitmap)
783+
.setBigContentTitle(conversationTitle)
784+
)
785+
}
786+
}
787+
788+
private fun loadSenderAvatar(notificationUser: NotificationUser?): Bitmap? {
789+
val userType = notificationUser?.type
790+
if (userType != "user" && userType != "guest") return null
791+
792+
val baseUrl = signatureVerification.user!!.baseUrl
793+
val avatarUrl = if ("user" == userType) {
794+
ApiUtils.getUrlForAvatar(
795+
baseUrl!!,
796+
notificationUser.id,
797+
false,
798+
darkMode = DisplayUtils.isDarkModeOn(context!!)
799+
)
800+
} else {
801+
ApiUtils.getUrlForGuestAvatar(baseUrl!!, notificationUser.name, false)
779802
}
803+
return NotificationUtils.loadAvatarBitmapSync(avatarUrl, context!!)
780804
}
781805

782806
private fun loadImageBitmapSync(imageUrl: String): Bitmap? {
@@ -824,7 +848,11 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
824848
} else {
825849
ApiUtils.getUrlForGuestAvatar(baseUrl!!, notificationUser.name, false)
826850
}
827-
person.setIcon(loadAvatarSync(avatarUrl, context!!))
851+
val avatarBitmap = NotificationUtils.loadAvatarBitmapSync(avatarUrl, context!!)
852+
if (avatarBitmap != null) {
853+
person.setIcon(IconCompat.createWithBitmap(avatarBitmap))
854+
notificationBuilder.setLargeIcon(avatarBitmap)
855+
}
828856
}
829857
val deviceUser = Person.Builder()
830858
.setKey(signatureVerification.user!!.id.toString() + "@" + signatureVerification.user!!.userId)
@@ -833,6 +861,38 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
833861
notificationBuilder.setStyle(getStyle(deviceUser, person.build(), style))
834862
}
835863

864+
private fun pushConversationShortcut(notificationBuilder: NotificationCompat.Builder) {
865+
val notificationUser = pushMessage.notificationUser ?: return
866+
val roomToken = pushMessage.id ?: return
867+
868+
val shortcutId = "conversation_${signatureVerification.user!!.id}_$roomToken"
869+
870+
val personBuilder = Person.Builder()
871+
.setKey(signatureVerification.user!!.id.toString() + "@" + notificationUser.id)
872+
.setName(EmojiCompat.get().process(notificationUser.name!!))
873+
874+
val avatarBitmap = loadSenderAvatar(notificationUser)
875+
if (avatarBitmap != null) {
876+
personBuilder.setIcon(IconCompat.createWithBitmap(avatarBitmap))
877+
}
878+
879+
val intent = Intent(context, MainActivity::class.java).apply {
880+
action = Intent.ACTION_VIEW
881+
putExtra(KEY_ROOM_TOKEN, roomToken)
882+
putExtra(KEY_INTERNAL_USER_ID, signatureVerification.user!!.id)
883+
}
884+
885+
val shortcut = ShortcutInfoCompat.Builder(context!!, shortcutId)
886+
.setShortLabel(pushMessage.subject.ifEmpty { notificationUser.name ?: "Chat" })
887+
.setLongLived(true)
888+
.setIntent(intent)
889+
.setPerson(personBuilder.build())
890+
.build()
891+
892+
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
893+
notificationBuilder.setShortcutId(shortcutId)
894+
}
895+
836896
private fun buildIntentForAction(
837897
cls: Class<*>,
838898
systemNotificationId: Int,

app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.app.Notification
1111
import android.app.NotificationChannel
1212
import android.app.NotificationManager
1313
import android.content.Context
14+
import android.graphics.Bitmap
1415
import android.graphics.drawable.BitmapDrawable
1516
import android.media.AudioAttributes
1617
import android.net.Uri
@@ -316,21 +317,24 @@ object NotificationUtils {
316317
)
317318

318319
fun loadAvatarSync(avatarUrl: String, context: Context): IconCompat? {
319-
var avatarIcon: IconCompat? = null
320+
val bitmap = loadAvatarBitmapSync(avatarUrl, context)
321+
return bitmap?.let { IconCompat.createWithBitmap(it) }
322+
}
323+
324+
fun loadAvatarBitmapSync(avatarUrl: String, context: Context): Bitmap? {
325+
var avatarBitmap: Bitmap? = null
320326

321327
val request = ImageRequest.Builder(context)
322328
.data(avatarUrl)
323329
.transformations(CircleCropTransformation())
324330
.placeholder(R.drawable.account_circle_96dp)
325331
.target(
326332
onSuccess = { result ->
327-
val bitmap = (result as BitmapDrawable).bitmap
328-
avatarIcon = IconCompat.createWithBitmap(bitmap)
333+
avatarBitmap = (result as BitmapDrawable).bitmap
329334
},
330335
onError = { error ->
331336
error?.let {
332-
val bitmap = (error as BitmapDrawable).bitmap
333-
avatarIcon = IconCompat.createWithBitmap(bitmap)
337+
avatarBitmap = (error as BitmapDrawable).bitmap
334338
}
335339
Log.w(TAG, "Can't load avatar for URL: $avatarUrl")
336340
}
@@ -339,7 +343,7 @@ object NotificationUtils {
339343

340344
context.imageLoader.executeBlocking(request)
341345

342-
return avatarIcon
346+
return avatarBitmap
343347
}
344348

345349
private data class Channel(val id: String, val name: String, val description: String, val isImportant: Boolean)

0 commit comments

Comments
 (0)