Notifications: render current user name and avatar.
This commit is contained in:
parent
afa06fb03e
commit
7e889e5c0a
6 changed files with 83 additions and 66 deletions
|
|
@ -16,21 +16,21 @@
|
||||||
|
|
||||||
package io.element.android.libraries.push.impl.notifications
|
package io.element.android.libraries.push.impl.notifications
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.HandlerThread
|
import android.os.HandlerThread
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
import io.element.android.libraries.androidutils.throttler.FirstThrottler
|
import io.element.android.libraries.androidutils.throttler.FirstThrottler
|
||||||
import io.element.android.libraries.core.cache.CircularCache
|
import io.element.android.libraries.core.cache.CircularCache
|
||||||
|
import io.element.android.libraries.core.data.tryOrNull
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
import io.element.android.libraries.di.ApplicationContext
|
|
||||||
import io.element.android.libraries.di.SingleIn
|
import io.element.android.libraries.di.SingleIn
|
||||||
|
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.core.ThreadId
|
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||||
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.api.store.PushDataStore
|
import io.element.android.libraries.push.api.store.PushDataStore
|
||||||
import io.element.android.libraries.push.impl.R
|
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
||||||
import io.element.android.libraries.push.impl.notifications.model.shouldIgnoreMessageEventInRoom
|
import io.element.android.libraries.push.impl.notifications.model.shouldIgnoreMessageEventInRoom
|
||||||
|
|
@ -38,6 +38,7 @@ import io.element.android.services.appnavstate.api.AppNavigationState
|
||||||
import io.element.android.services.appnavstate.api.AppNavigationStateService
|
import io.element.android.services.appnavstate.api.AppNavigationStateService
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
@ -48,7 +49,6 @@ import javax.inject.Inject
|
||||||
*/
|
*/
|
||||||
@SingleIn(AppScope::class)
|
@SingleIn(AppScope::class)
|
||||||
class NotificationDrawerManager @Inject constructor(
|
class NotificationDrawerManager @Inject constructor(
|
||||||
@ApplicationContext context: Context,
|
|
||||||
private val pushDataStore: PushDataStore,
|
private val pushDataStore: PushDataStore,
|
||||||
private val notifiableEventProcessor: NotifiableEventProcessor,
|
private val notifiableEventProcessor: NotifiableEventProcessor,
|
||||||
private val notificationRenderer: NotificationRenderer,
|
private val notificationRenderer: NotificationRenderer,
|
||||||
|
|
@ -57,6 +57,7 @@ class NotificationDrawerManager @Inject constructor(
|
||||||
private val appNavigationStateService: AppNavigationStateService,
|
private val appNavigationStateService: AppNavigationStateService,
|
||||||
private val coroutineScope: CoroutineScope,
|
private val coroutineScope: CoroutineScope,
|
||||||
private val buildMeta: BuildMeta,
|
private val buildMeta: BuildMeta,
|
||||||
|
private val matrixAuthenticationService: MatrixAuthenticationService,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val handlerThread: HandlerThread = HandlerThread("NotificationDrawerManager", Thread.MIN_PRIORITY)
|
private val handlerThread: HandlerThread = HandlerThread("NotificationDrawerManager", Thread.MIN_PRIORITY)
|
||||||
|
|
@ -66,7 +67,6 @@ class NotificationDrawerManager @Inject constructor(
|
||||||
* Lazily initializes the NotificationState as we rely on having a current session in order to fetch the persisted queue of events.
|
* Lazily initializes the NotificationState as we rely on having a current session in order to fetch the persisted queue of events.
|
||||||
*/
|
*/
|
||||||
private val notificationState by lazy { createInitialNotificationState() }
|
private val notificationState by lazy { createInitialNotificationState() }
|
||||||
private val avatarSize = context.resources.getDimensionPixelSize(R.dimen.profile_avatar_size)
|
|
||||||
private var currentAppNavigationState: AppNavigationState? = null
|
private var currentAppNavigationState: AppNavigationState? = null
|
||||||
private val firstThrottler = FirstThrottler(200)
|
private val firstThrottler = FirstThrottler(200)
|
||||||
|
|
||||||
|
|
@ -239,6 +239,7 @@ class NotificationDrawerManager @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WorkerThread
|
||||||
private fun renderEvents(eventsToRender: List<ProcessedEvent<NotifiableEvent>>) {
|
private fun renderEvents(eventsToRender: List<ProcessedEvent<NotifiableEvent>>) {
|
||||||
// Group by sessionId
|
// Group by sessionId
|
||||||
val eventsForSessions = eventsToRender.groupBy {
|
val eventsForSessions = eventsToRender.groupBy {
|
||||||
|
|
@ -246,17 +247,29 @@ class NotificationDrawerManager @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
eventsForSessions.forEach { (sessionId, notifiableEvents) ->
|
eventsForSessions.forEach { (sessionId, notifiableEvents) ->
|
||||||
// TODO EAx val user = session.getUserOrDefault(session.myUserId)
|
val currentUser = tryOrNull(
|
||||||
// myUserDisplayName cannot be empty else NotificationCompat.MessagingStyle() will crash
|
onError = { Timber.e(it, "Unable to retrieve info for user ${sessionId.value}") },
|
||||||
val myUserDisplayName = "Todo display name" // user.toMatrixItem().getBestName()
|
operation = {
|
||||||
// TODO EAx avatar URL
|
runBlocking {
|
||||||
val myUserAvatarUrl = null // session.contentUrlResolver().resolveThumbnail(
|
val client = matrixAuthenticationService.restoreSession(sessionId).getOrNull()
|
||||||
// contentUrl = user.avatarUrl,
|
|
||||||
// width = avatarSize,
|
// myUserDisplayName cannot be empty else NotificationCompat.MessagingStyle() will crash
|
||||||
// height = avatarSize,
|
val myUserDisplayName = client?.loadUserDisplayName()?.getOrNull() ?: sessionId.value
|
||||||
// method = ContentUrlResolver.ThumbnailMethod.SCALE
|
val userAvatarUrl = client?.loadUserAvatarURLString()?.getOrNull()
|
||||||
//)
|
MatrixUser(
|
||||||
notificationRenderer.render(sessionId, myUserDisplayName, myUserAvatarUrl, useCompleteNotificationFormat, notifiableEvents)
|
userId = sessionId,
|
||||||
|
displayName = myUserDisplayName,
|
||||||
|
avatarUrl = userAvatarUrl
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) ?: MatrixUser(
|
||||||
|
userId = sessionId,
|
||||||
|
displayName = sessionId.value,
|
||||||
|
avatarUrl = null
|
||||||
|
)
|
||||||
|
|
||||||
|
notificationRenderer.render(currentUser, useCompleteNotificationFormat, notifiableEvents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.notifications
|
||||||
|
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
||||||
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
|
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
||||||
|
|
@ -35,9 +35,7 @@ class NotificationFactory @Inject constructor(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun Map<RoomId, ProcessedMessageEvents>.toNotifications(
|
fun Map<RoomId, ProcessedMessageEvents>.toNotifications(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
myUserDisplayName: String,
|
|
||||||
myUserAvatarUrl: String?
|
|
||||||
): List<RoomNotification> {
|
): List<RoomNotification> {
|
||||||
return map { (roomId, events) ->
|
return map { (roomId, events) ->
|
||||||
when {
|
when {
|
||||||
|
|
@ -45,11 +43,9 @@ class NotificationFactory @Inject constructor(
|
||||||
else -> {
|
else -> {
|
||||||
val messageEvents = events.onlyKeptEvents().filterNot { it.isRedacted }
|
val messageEvents = events.onlyKeptEvents().filterNot { it.isRedacted }
|
||||||
roomGroupMessageCreator.createRoomMessage(
|
roomGroupMessageCreator.createRoomMessage(
|
||||||
sessionId = sessionId,
|
currentUser = currentUser,
|
||||||
events = messageEvents,
|
events = messageEvents,
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
userDisplayName = myUserDisplayName,
|
|
||||||
userAvatarUrl = myUserAvatarUrl
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +95,7 @@ class NotificationFactory @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createSummaryNotification(
|
fun createSummaryNotification(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
roomNotifications: List<RoomNotification>,
|
roomNotifications: List<RoomNotification>,
|
||||||
invitationNotifications: List<OneShotNotification>,
|
invitationNotifications: List<OneShotNotification>,
|
||||||
simpleNotifications: List<OneShotNotification>,
|
simpleNotifications: List<OneShotNotification>,
|
||||||
|
|
@ -112,7 +108,7 @@ class NotificationFactory @Inject constructor(
|
||||||
roomMeta.isEmpty() && invitationMeta.isEmpty() && simpleMeta.isEmpty() -> SummaryNotification.Removed
|
roomMeta.isEmpty() && invitationMeta.isEmpty() && simpleMeta.isEmpty() -> SummaryNotification.Removed
|
||||||
else -> SummaryNotification.Update(
|
else -> SummaryNotification.Update(
|
||||||
summaryGroupMessageCreator.createSummaryNotification(
|
summaryGroupMessageCreator.createSummaryNotification(
|
||||||
sessionId = sessionId,
|
currentUser = currentUser,
|
||||||
roomNotifications = roomMeta,
|
roomNotifications = roomMeta,
|
||||||
invitationNotifications = invitationMeta,
|
invitationNotifications = invitationMeta,
|
||||||
simpleNotifications = simpleMeta,
|
simpleNotifications = simpleMeta,
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.notifications
|
||||||
|
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
|
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
||||||
|
|
@ -34,19 +34,17 @@ class NotificationRenderer @Inject constructor(
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
fun render(
|
fun render(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
myUserDisplayName: String,
|
|
||||||
myUserAvatarUrl: String?,
|
|
||||||
useCompleteNotificationFormat: Boolean,
|
useCompleteNotificationFormat: Boolean,
|
||||||
eventsToProcess: List<ProcessedEvent<NotifiableEvent>>
|
eventsToProcess: List<ProcessedEvent<NotifiableEvent>>
|
||||||
) {
|
) {
|
||||||
val (roomEvents, simpleEvents, invitationEvents) = eventsToProcess.groupByType()
|
val (roomEvents, simpleEvents, invitationEvents) = eventsToProcess.groupByType()
|
||||||
with(notificationFactory) {
|
with(notificationFactory) {
|
||||||
val roomNotifications = roomEvents.toNotifications(sessionId, myUserDisplayName, myUserAvatarUrl)
|
val roomNotifications = roomEvents.toNotifications(currentUser)
|
||||||
val invitationNotifications = invitationEvents.toNotifications()
|
val invitationNotifications = invitationEvents.toNotifications()
|
||||||
val simpleNotifications = simpleEvents.toNotifications()
|
val simpleNotifications = simpleEvents.toNotifications()
|
||||||
val summaryNotification = createSummaryNotification(
|
val summaryNotification = createSummaryNotification(
|
||||||
sessionId = sessionId,
|
currentUser = currentUser,
|
||||||
roomNotifications = roomNotifications,
|
roomNotifications = roomNotifications,
|
||||||
invitationNotifications = invitationNotifications,
|
invitationNotifications = invitationNotifications,
|
||||||
simpleNotifications = simpleNotifications,
|
simpleNotifications = simpleNotifications,
|
||||||
|
|
@ -56,21 +54,27 @@ class NotificationRenderer @Inject constructor(
|
||||||
// Remove summary first to avoid briefly displaying it after dismissing the last notification
|
// Remove summary first to avoid briefly displaying it after dismissing the last notification
|
||||||
if (summaryNotification == SummaryNotification.Removed) {
|
if (summaryNotification == SummaryNotification.Removed) {
|
||||||
Timber.d("Removing summary notification")
|
Timber.d("Removing summary notification")
|
||||||
notificationDisplayer.cancelNotificationMessage(null, notificationIdProvider.getSummaryNotificationId(sessionId))
|
notificationDisplayer.cancelNotificationMessage(
|
||||||
|
tag = null,
|
||||||
|
id = notificationIdProvider.getSummaryNotificationId(currentUser.userId)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
roomNotifications.forEach { wrapper ->
|
roomNotifications.forEach { wrapper ->
|
||||||
when (wrapper) {
|
when (wrapper) {
|
||||||
is RoomNotification.Removed -> {
|
is RoomNotification.Removed -> {
|
||||||
Timber.d("Removing room messages notification ${wrapper.roomId}")
|
Timber.d("Removing room messages notification ${wrapper.roomId}")
|
||||||
notificationDisplayer.cancelNotificationMessage(wrapper.roomId.value, notificationIdProvider.getRoomMessagesNotificationId(sessionId))
|
notificationDisplayer.cancelNotificationMessage(
|
||||||
|
tag = wrapper.roomId.value,
|
||||||
|
id = notificationIdProvider.getRoomMessagesNotificationId(currentUser.userId)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
is RoomNotification.Message -> if (useCompleteNotificationFormat) {
|
is RoomNotification.Message -> if (useCompleteNotificationFormat) {
|
||||||
Timber.d("Updating room messages notification ${wrapper.meta.roomId}")
|
Timber.d("Updating room messages notification ${wrapper.meta.roomId}")
|
||||||
notificationDisplayer.showNotificationMessage(
|
notificationDisplayer.showNotificationMessage(
|
||||||
wrapper.meta.roomId.value,
|
tag = wrapper.meta.roomId.value,
|
||||||
notificationIdProvider.getRoomMessagesNotificationId(sessionId),
|
id = notificationIdProvider.getRoomMessagesNotificationId(currentUser.userId),
|
||||||
wrapper.notification
|
notification = wrapper.notification
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -80,14 +84,17 @@ class NotificationRenderer @Inject constructor(
|
||||||
when (wrapper) {
|
when (wrapper) {
|
||||||
is OneShotNotification.Removed -> {
|
is OneShotNotification.Removed -> {
|
||||||
Timber.d("Removing invitation notification ${wrapper.key}")
|
Timber.d("Removing invitation notification ${wrapper.key}")
|
||||||
notificationDisplayer.cancelNotificationMessage(wrapper.key, notificationIdProvider.getRoomInvitationNotificationId(sessionId))
|
notificationDisplayer.cancelNotificationMessage(
|
||||||
|
tag = wrapper.key,
|
||||||
|
id = notificationIdProvider.getRoomInvitationNotificationId(currentUser.userId)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
is OneShotNotification.Append -> if (useCompleteNotificationFormat) {
|
is OneShotNotification.Append -> if (useCompleteNotificationFormat) {
|
||||||
Timber.d("Updating invitation notification ${wrapper.meta.key}")
|
Timber.d("Updating invitation notification ${wrapper.meta.key}")
|
||||||
notificationDisplayer.showNotificationMessage(
|
notificationDisplayer.showNotificationMessage(
|
||||||
wrapper.meta.key,
|
tag = wrapper.meta.key,
|
||||||
notificationIdProvider.getRoomInvitationNotificationId(sessionId),
|
id = notificationIdProvider.getRoomInvitationNotificationId(currentUser.userId),
|
||||||
wrapper.notification
|
notification = wrapper.notification
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -97,14 +104,17 @@ class NotificationRenderer @Inject constructor(
|
||||||
when (wrapper) {
|
when (wrapper) {
|
||||||
is OneShotNotification.Removed -> {
|
is OneShotNotification.Removed -> {
|
||||||
Timber.d("Removing simple notification ${wrapper.key}")
|
Timber.d("Removing simple notification ${wrapper.key}")
|
||||||
notificationDisplayer.cancelNotificationMessage(wrapper.key, notificationIdProvider.getRoomEventNotificationId(sessionId))
|
notificationDisplayer.cancelNotificationMessage(
|
||||||
|
tag = wrapper.key,
|
||||||
|
id = notificationIdProvider.getRoomEventNotificationId(currentUser.userId)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
is OneShotNotification.Append -> if (useCompleteNotificationFormat) {
|
is OneShotNotification.Append -> if (useCompleteNotificationFormat) {
|
||||||
Timber.d("Updating simple notification ${wrapper.meta.key}")
|
Timber.d("Updating simple notification ${wrapper.meta.key}")
|
||||||
notificationDisplayer.showNotificationMessage(
|
notificationDisplayer.showNotificationMessage(
|
||||||
wrapper.meta.key,
|
tag = wrapper.meta.key,
|
||||||
notificationIdProvider.getRoomEventNotificationId(sessionId),
|
id = notificationIdProvider.getRoomEventNotificationId(currentUser.userId),
|
||||||
wrapper.notification
|
notification = wrapper.notification
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -114,9 +124,9 @@ class NotificationRenderer @Inject constructor(
|
||||||
if (summaryNotification is SummaryNotification.Update) {
|
if (summaryNotification is SummaryNotification.Update) {
|
||||||
Timber.d("Updating summary notification")
|
Timber.d("Updating summary notification")
|
||||||
notificationDisplayer.showNotificationMessage(
|
notificationDisplayer.showNotificationMessage(
|
||||||
null,
|
tag = null,
|
||||||
notificationIdProvider.getSummaryNotificationId(sessionId),
|
id = notificationIdProvider.getSummaryNotificationId(currentUser.userId),
|
||||||
summaryNotification.notification
|
notification = summaryNotification.notification
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import android.graphics.Bitmap
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.Person
|
import androidx.core.app.Person
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.impl.R
|
import io.element.android.libraries.push.impl.R
|
||||||
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
||||||
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
|
||||||
|
|
@ -37,19 +37,17 @@ class RoomGroupMessageCreator @Inject constructor(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun createRoomMessage(
|
fun createRoomMessage(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
events: List<NotifiableMessageEvent>,
|
events: List<NotifiableMessageEvent>,
|
||||||
roomId: RoomId,
|
roomId: RoomId,
|
||||||
userDisplayName: String,
|
|
||||||
userAvatarUrl: String?
|
|
||||||
): RoomNotification.Message {
|
): RoomNotification.Message {
|
||||||
val lastKnownRoomEvent = events.last()
|
val lastKnownRoomEvent = events.last()
|
||||||
val roomName = lastKnownRoomEvent.roomName ?: lastKnownRoomEvent.senderName ?: "Room name (${roomId.value.take(8)}…)"
|
val roomName = lastKnownRoomEvent.roomName ?: lastKnownRoomEvent.senderName ?: "Room name (${roomId.value.take(8)}…)"
|
||||||
val roomIsGroup = !lastKnownRoomEvent.roomIsDirect
|
val roomIsGroup = !lastKnownRoomEvent.roomIsDirect
|
||||||
val style = NotificationCompat.MessagingStyle(
|
val style = NotificationCompat.MessagingStyle(
|
||||||
Person.Builder()
|
Person.Builder()
|
||||||
.setName(userDisplayName)
|
.setName(currentUser.displayName)
|
||||||
.setIcon(bitmapLoader.getUserIcon(userAvatarUrl))
|
.setIcon(bitmapLoader.getUserIcon(currentUser.avatarUrl))
|
||||||
.setKey(lastKnownRoomEvent.sessionId.value)
|
.setKey(lastKnownRoomEvent.sessionId.value)
|
||||||
.build()
|
.build()
|
||||||
).also {
|
).also {
|
||||||
|
|
@ -80,7 +78,7 @@ class RoomGroupMessageCreator @Inject constructor(
|
||||||
notificationFactory.createMessagesListNotification(
|
notificationFactory.createMessagesListNotification(
|
||||||
style,
|
style,
|
||||||
RoomEventGroupInfo(
|
RoomEventGroupInfo(
|
||||||
sessionId = sessionId,
|
sessionId = currentUser.userId,
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
roomDisplayName = roomName,
|
roomDisplayName = roomName,
|
||||||
isDirect = !roomIsGroup,
|
isDirect = !roomIsGroup,
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl.notifications
|
||||||
|
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.impl.R
|
import io.element.android.libraries.push.impl.R
|
||||||
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
import io.element.android.libraries.push.impl.notifications.factories.NotificationFactory
|
||||||
import io.element.android.services.toolbox.api.strings.StringProvider
|
import io.element.android.services.toolbox.api.strings.StringProvider
|
||||||
|
|
@ -44,7 +44,7 @@ class SummaryGroupMessageCreator @Inject constructor(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun createSummaryNotification(
|
fun createSummaryNotification(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
roomNotifications: List<RoomNotification.Message.Meta>,
|
roomNotifications: List<RoomNotification.Message.Meta>,
|
||||||
invitationNotifications: List<OneShotNotification.Append.Meta>,
|
invitationNotifications: List<OneShotNotification.Append.Meta>,
|
||||||
simpleNotifications: List<OneShotNotification.Append.Meta>,
|
simpleNotifications: List<OneShotNotification.Append.Meta>,
|
||||||
|
|
@ -74,7 +74,7 @@ class SummaryGroupMessageCreator @Inject constructor(
|
||||||
.setSummaryText(stringProvider.getQuantityString(R.plurals.notification_unread_notified_messages, nbEvents, nbEvents))
|
.setSummaryText(stringProvider.getQuantityString(R.plurals.notification_unread_notified_messages, nbEvents, nbEvents))
|
||||||
return if (useCompleteNotificationFormat) {
|
return if (useCompleteNotificationFormat) {
|
||||||
notificationFactory.createSummaryListNotification(
|
notificationFactory.createSummaryListNotification(
|
||||||
sessionId,
|
currentUser,
|
||||||
summaryInboxStyle,
|
summaryInboxStyle,
|
||||||
sumTitle,
|
sumTitle,
|
||||||
noisy = summaryIsNoisy,
|
noisy = summaryIsNoisy,
|
||||||
|
|
@ -82,7 +82,7 @@ class SummaryGroupMessageCreator @Inject constructor(
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
processSimpleGroupSummary(
|
processSimpleGroupSummary(
|
||||||
sessionId,
|
currentUser,
|
||||||
summaryIsNoisy,
|
summaryIsNoisy,
|
||||||
messageCount,
|
messageCount,
|
||||||
simpleNotifications.size,
|
simpleNotifications.size,
|
||||||
|
|
@ -94,7 +94,7 @@ class SummaryGroupMessageCreator @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun processSimpleGroupSummary(
|
private fun processSimpleGroupSummary(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
summaryIsNoisy: Boolean,
|
summaryIsNoisy: Boolean,
|
||||||
messageEventsCount: Int,
|
messageEventsCount: Int,
|
||||||
simpleEventsCount: Int,
|
simpleEventsCount: Int,
|
||||||
|
|
@ -167,7 +167,7 @@ class SummaryGroupMessageCreator @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return notificationFactory.createSummaryListNotification(
|
return notificationFactory.createSummaryListNotification(
|
||||||
sessionId = sessionId,
|
currentUser = currentUser,
|
||||||
style = null,
|
style = null,
|
||||||
compatSummary = privacyTitle,
|
compatSummary = privacyTitle,
|
||||||
noisy = summaryIsNoisy,
|
noisy = summaryIsNoisy,
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.res.ResourcesCompat
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
import io.element.android.libraries.di.ApplicationContext
|
import io.element.android.libraries.di.ApplicationContext
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
|
||||||
import io.element.android.libraries.matrix.api.core.ThreadId
|
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||||
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.push.impl.R
|
import io.element.android.libraries.push.impl.R
|
||||||
import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo
|
import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo
|
||||||
import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels
|
import io.element.android.libraries.push.impl.notifications.channels.NotificationChannels
|
||||||
|
|
@ -226,7 +226,7 @@ class NotificationFactory @Inject constructor(
|
||||||
* Create the summary notification.
|
* Create the summary notification.
|
||||||
*/
|
*/
|
||||||
fun createSummaryListNotification(
|
fun createSummaryListNotification(
|
||||||
sessionId: SessionId,
|
currentUser: MatrixUser,
|
||||||
style: NotificationCompat.InboxStyle?,
|
style: NotificationCompat.InboxStyle?,
|
||||||
compatSummary: String,
|
compatSummary: String,
|
||||||
noisy: Boolean,
|
noisy: Boolean,
|
||||||
|
|
@ -240,12 +240,12 @@ class NotificationFactory @Inject constructor(
|
||||||
// used in compat < N, after summary is built based on child notifications
|
// used in compat < N, after summary is built based on child notifications
|
||||||
.setWhen(lastMessageTimestamp)
|
.setWhen(lastMessageTimestamp)
|
||||||
.setStyle(style)
|
.setStyle(style)
|
||||||
.setContentTitle(sessionId.value)
|
.setContentTitle(currentUser.userId.value)
|
||||||
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
||||||
.setSmallIcon(smallIcon)
|
.setSmallIcon(smallIcon)
|
||||||
// set content text to support devices running API level < 24
|
// set content text to support devices running API level < 24
|
||||||
.setContentText(compatSummary)
|
.setContentText(compatSummary)
|
||||||
.setGroup(sessionId.value)
|
.setGroup(currentUser.userId.value)
|
||||||
// set this notification as the summary for the group
|
// set this notification as the summary for the group
|
||||||
.setGroupSummary(true)
|
.setGroupSummary(true)
|
||||||
.setColor(accentColor)
|
.setColor(accentColor)
|
||||||
|
|
@ -264,8 +264,8 @@ class NotificationFactory @Inject constructor(
|
||||||
priority = NotificationCompat.PRIORITY_LOW
|
priority = NotificationCompat.PRIORITY_LOW
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.setContentIntent(pendingIntentFactory.createOpenSessionPendingIntent(sessionId))
|
.setContentIntent(pendingIntentFactory.createOpenSessionPendingIntent(currentUser.userId))
|
||||||
.setDeleteIntent(pendingIntentFactory.createDismissSummaryPendingIntent(sessionId))
|
.setDeleteIntent(pendingIntentFactory.createDismissSummaryPendingIntent(currentUser.userId))
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue