@@ -30,6 +30,9 @@ import androidx.core.app.ActivityCompat
3030import androidx.core.app.NotificationCompat
3131import androidx.core.app.NotificationManagerCompat
3232import 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
3336import androidx.core.app.RemoteInput
3437import androidx.core.content.ContextCompat
3538import androidx.core.graphics.drawable.toBitmap
@@ -76,7 +79,6 @@ import com.nextcloud.talk.utils.NotificationUtils.cancelAllNotificationsForAccou
7679import com.nextcloud.talk.utils.NotificationUtils.cancelNotification
7780import com.nextcloud.talk.utils.NotificationUtils.findNotificationForRoom
7881import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri
79- import com.nextcloud.talk.utils.NotificationUtils.loadAvatarSync
8082import com.nextcloud.talk.utils.ParticipantPermissions
8183import com.nextcloud.talk.utils.PushUtils
8284import 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 ,
0 commit comments