Skip to content

Commit de4c146

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

File tree

2 files changed

+80
-16
lines changed

2 files changed

+80
-16
lines changed

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
@@ -74,7 +77,6 @@ import com.nextcloud.talk.utils.NotificationUtils.cancelAllNotificationsForAccou
7477
import com.nextcloud.talk.utils.NotificationUtils.cancelNotification
7578
import com.nextcloud.talk.utils.NotificationUtils.findNotificationForRoom
7679
import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri
77-
import com.nextcloud.talk.utils.NotificationUtils.loadAvatarSync
7880
import com.nextcloud.talk.utils.ParticipantPermissions
7981
import com.nextcloud.talk.utils.PushUtils
8082
import com.nextcloud.talk.utils.bundle.BundleKeys
@@ -583,6 +585,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
583585
}
584586
addReplyAction(notificationBuilder, systemNotificationId)
585587
addMarkAsReadAction(notificationBuilder, systemNotificationId)
588+
pushConversationShortcut(notificationBuilder)
586589
}
587590
}
588591

@@ -689,17 +692,38 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
689692
val senderName = notificationUser?.name ?: ""
690693
val conversationTitle = pushMessage.subject.ifEmpty { senderName }
691694

695+
val avatarBitmap = loadSenderAvatar(notificationUser)
696+
if (avatarBitmap != null) {
697+
notificationBuilder.setLargeIcon(avatarBitmap)
698+
}
699+
692700
val bitmap = loadImageBitmapSync(imagePreviewUrl!!)
693701
if (bitmap != null) {
694-
notificationBuilder
695-
.setLargeIcon(bitmap)
696-
.setStyle(
697-
NotificationCompat.BigPictureStyle()
698-
.bigPicture(bitmap)
699-
.bigLargeIcon(null as Bitmap?)
700-
.setBigContentTitle(conversationTitle)
701-
)
702+
notificationBuilder.setStyle(
703+
NotificationCompat.BigPictureStyle()
704+
.bigPicture(bitmap)
705+
.bigLargeIcon(avatarBitmap)
706+
.setBigContentTitle(conversationTitle)
707+
)
708+
}
709+
}
710+
711+
private fun loadSenderAvatar(notificationUser: NotificationUser?): Bitmap? {
712+
val userType = notificationUser?.type
713+
if (userType != "user" && userType != "guest") return null
714+
715+
val baseUrl = signatureVerification.user!!.baseUrl
716+
val avatarUrl = if ("user" == userType) {
717+
ApiUtils.getUrlForAvatar(
718+
baseUrl!!,
719+
notificationUser.id,
720+
false,
721+
darkMode = DisplayUtils.isDarkModeOn(context!!)
722+
)
723+
} else {
724+
ApiUtils.getUrlForGuestAvatar(baseUrl!!, notificationUser.name, false)
702725
}
726+
return NotificationUtils.loadAvatarBitmapSync(avatarUrl, context!!)
703727
}
704728

705729
private fun loadImageBitmapSync(imageUrl: String): Bitmap? {
@@ -747,7 +771,11 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
747771
} else {
748772
ApiUtils.getUrlForGuestAvatar(baseUrl!!, notificationUser.name, false)
749773
}
750-
person.setIcon(loadAvatarSync(avatarUrl, context!!))
774+
val avatarBitmap = NotificationUtils.loadAvatarBitmapSync(avatarUrl, context!!)
775+
if (avatarBitmap != null) {
776+
person.setIcon(IconCompat.createWithBitmap(avatarBitmap))
777+
notificationBuilder.setLargeIcon(avatarBitmap)
778+
}
751779
}
752780
val deviceUser = Person.Builder()
753781
.setKey(signatureVerification.user!!.id.toString() + "@" + signatureVerification.user!!.userId)
@@ -756,6 +784,38 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
756784
notificationBuilder.setStyle(getStyle(deviceUser, person.build(), style))
757785
}
758786

787+
private fun pushConversationShortcut(notificationBuilder: NotificationCompat.Builder) {
788+
val notificationUser = pushMessage.notificationUser ?: return
789+
val roomToken = pushMessage.id ?: return
790+
791+
val shortcutId = "conversation_${signatureVerification.user!!.id}_$roomToken"
792+
793+
val personBuilder = Person.Builder()
794+
.setKey(signatureVerification.user!!.id.toString() + "@" + notificationUser.id)
795+
.setName(EmojiCompat.get().process(notificationUser.name!!))
796+
797+
val avatarBitmap = loadSenderAvatar(notificationUser)
798+
if (avatarBitmap != null) {
799+
personBuilder.setIcon(IconCompat.createWithBitmap(avatarBitmap))
800+
}
801+
802+
val intent = Intent(context, MainActivity::class.java).apply {
803+
action = Intent.ACTION_VIEW
804+
putExtra(KEY_ROOM_TOKEN, roomToken)
805+
putExtra(KEY_INTERNAL_USER_ID, signatureVerification.user!!.id)
806+
}
807+
808+
val shortcut = ShortcutInfoCompat.Builder(context!!, shortcutId)
809+
.setShortLabel(pushMessage.subject.ifEmpty { notificationUser.name ?: "Chat" })
810+
.setLongLived(true)
811+
.setIntent(intent)
812+
.setPerson(personBuilder.build())
813+
.build()
814+
815+
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
816+
notificationBuilder.setShortcutId(shortcutId)
817+
}
818+
759819
private fun buildIntentForAction(
760820
cls: Class<*>,
761821
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)