@@ -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
@@ -74,7 +77,6 @@ import com.nextcloud.talk.utils.NotificationUtils.cancelAllNotificationsForAccou
7477import com.nextcloud.talk.utils.NotificationUtils.cancelNotification
7578import com.nextcloud.talk.utils.NotificationUtils.findNotificationForRoom
7679import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri
77- import com.nextcloud.talk.utils.NotificationUtils.loadAvatarSync
7880import com.nextcloud.talk.utils.ParticipantPermissions
7981import com.nextcloud.talk.utils.PushUtils
8082import 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 ,
0 commit comments