Merge pull request #3203 from element-hq/feature/bma/clearNotificationWhenMarkAsRead
Clear existing notification when a room is marked as read
This commit is contained in:
commit
abcc93e616
13 changed files with 92 additions and 89 deletions
|
|
@ -34,7 +34,7 @@ import io.element.android.libraries.architecture.runUpdatingState
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
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.room.join.JoinRoom
|
import io.element.android.libraries.matrix.api.room.join.JoinRoom
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
|
|
@ -44,7 +44,7 @@ import kotlin.jvm.optionals.getOrNull
|
||||||
class AcceptDeclineInvitePresenter @Inject constructor(
|
class AcceptDeclineInvitePresenter @Inject constructor(
|
||||||
private val client: MatrixClient,
|
private val client: MatrixClient,
|
||||||
private val joinRoom: JoinRoom,
|
private val joinRoom: JoinRoom,
|
||||||
private val notificationDrawerManager: NotificationDrawerManager,
|
private val notificationCleaner: NotificationCleaner,
|
||||||
) : Presenter<AcceptDeclineInviteState> {
|
) : Presenter<AcceptDeclineInviteState> {
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): AcceptDeclineInviteState {
|
override fun present(): AcceptDeclineInviteState {
|
||||||
|
|
@ -112,7 +112,7 @@ class AcceptDeclineInvitePresenter @Inject constructor(
|
||||||
trigger = JoinedRoom.Trigger.Invite,
|
trigger = JoinedRoom.Trigger.Invite,
|
||||||
)
|
)
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
notificationDrawerManager.clearMembershipNotificationForRoom(client.sessionId, roomId)
|
notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId)
|
||||||
}
|
}
|
||||||
.map { roomId }
|
.map { roomId }
|
||||||
}
|
}
|
||||||
|
|
@ -122,7 +122,7 @@ class AcceptDeclineInvitePresenter @Inject constructor(
|
||||||
suspend {
|
suspend {
|
||||||
client.getRoom(roomId)?.use {
|
client.getRoom(roomId)?.use {
|
||||||
it.leave().getOrThrow()
|
it.leave().getOrThrow()
|
||||||
notificationDrawerManager.clearMembershipNotificationForRoom(client.sessionId, roomId)
|
notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId)
|
||||||
}
|
}
|
||||||
roomId
|
roomId
|
||||||
}.runCatchingUpdatingState(declinedAction)
|
}.runCatchingUpdatingState(declinedAction)
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,8 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||||
import io.element.android.libraries.matrix.test.room.join.FakeJoinRoom
|
import io.element.android.libraries.matrix.test.room.join.FakeJoinRoom
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import io.element.android.libraries.push.test.notifications.FakeNotificationDrawerManager
|
import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
|
||||||
import io.element.android.tests.testutils.WarmUpRule
|
import io.element.android.tests.testutils.WarmUpRule
|
||||||
import io.element.android.tests.testutils.lambda.assert
|
import io.element.android.tests.testutils.lambda.assert
|
||||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||||
|
|
@ -133,7 +133,7 @@ class AcceptDeclineInvitePresenterTest {
|
||||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ ->
|
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ ->
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
}
|
}
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda
|
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda
|
||||||
)
|
)
|
||||||
val declineInviteSuccess = lambdaRecorder { ->
|
val declineInviteSuccess = lambdaRecorder { ->
|
||||||
|
|
@ -149,7 +149,7 @@ class AcceptDeclineInvitePresenterTest {
|
||||||
}
|
}
|
||||||
val presenter = createAcceptDeclineInvitePresenter(
|
val presenter = createAcceptDeclineInvitePresenter(
|
||||||
client = client,
|
client = client,
|
||||||
notificationDrawerManager = notificationDrawerManager,
|
notificationCleaner = fakeNotificationCleaner,
|
||||||
)
|
)
|
||||||
presenter.test {
|
presenter.test {
|
||||||
val inviteData = anInviteData()
|
val inviteData = anInviteData()
|
||||||
|
|
@ -219,7 +219,7 @@ class AcceptDeclineInvitePresenterTest {
|
||||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ ->
|
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ ->
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
}
|
}
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda
|
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda
|
||||||
)
|
)
|
||||||
val joinRoomSuccess = lambdaRecorder { _: RoomId, _: List<String>, _: JoinedRoom.Trigger ->
|
val joinRoomSuccess = lambdaRecorder { _: RoomId, _: List<String>, _: JoinedRoom.Trigger ->
|
||||||
|
|
@ -227,7 +227,7 @@ class AcceptDeclineInvitePresenterTest {
|
||||||
}
|
}
|
||||||
val presenter = createAcceptDeclineInvitePresenter(
|
val presenter = createAcceptDeclineInvitePresenter(
|
||||||
joinRoomLambda = joinRoomSuccess,
|
joinRoomLambda = joinRoomSuccess,
|
||||||
notificationDrawerManager = notificationDrawerManager,
|
notificationCleaner = fakeNotificationCleaner,
|
||||||
)
|
)
|
||||||
presenter.test {
|
presenter.test {
|
||||||
val inviteData = anInviteData()
|
val inviteData = anInviteData()
|
||||||
|
|
@ -274,12 +274,12 @@ class AcceptDeclineInvitePresenterTest {
|
||||||
joinRoomLambda: (RoomId, List<String>, JoinedRoom.Trigger) -> Result<Unit> = { _, _, _ ->
|
joinRoomLambda: (RoomId, List<String>, JoinedRoom.Trigger) -> Result<Unit> = { _, _, _ ->
|
||||||
Result.success(Unit)
|
Result.success(Unit)
|
||||||
},
|
},
|
||||||
notificationDrawerManager: NotificationDrawerManager = FakeNotificationDrawerManager(),
|
notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
|
||||||
): AcceptDeclineInvitePresenter {
|
): AcceptDeclineInvitePresenter {
|
||||||
return AcceptDeclineInvitePresenter(
|
return AcceptDeclineInvitePresenter(
|
||||||
client = client,
|
client = client,
|
||||||
joinRoom = FakeJoinRoom(joinRoomLambda),
|
joinRoom = FakeJoinRoom(joinRoomLambda),
|
||||||
notificationDrawerManager = notificationDrawerManager,
|
notificationCleaner = notificationCleaner,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ dependencies {
|
||||||
implementation(projects.libraries.permissions.api)
|
implementation(projects.libraries.permissions.api)
|
||||||
implementation(projects.libraries.permissions.noop)
|
implementation(projects.libraries.permissions.noop)
|
||||||
implementation(projects.libraries.preferences.api)
|
implementation(projects.libraries.preferences.api)
|
||||||
|
implementation(projects.libraries.push.api)
|
||||||
implementation(projects.features.invite.api)
|
implementation(projects.features.invite.api)
|
||||||
implementation(projects.features.networkmonitor.api)
|
implementation(projects.features.networkmonitor.api)
|
||||||
implementation(projects.features.leaveroom.api)
|
implementation(projects.features.leaveroom.api)
|
||||||
|
|
@ -79,6 +80,7 @@ dependencies {
|
||||||
testImplementation(projects.libraries.permissions.noop)
|
testImplementation(projects.libraries.permissions.noop)
|
||||||
testImplementation(projects.libraries.permissions.test)
|
testImplementation(projects.libraries.permissions.test)
|
||||||
testImplementation(projects.libraries.preferences.test)
|
testImplementation(projects.libraries.preferences.test)
|
||||||
|
testImplementation(projects.libraries.push.test)
|
||||||
testImplementation(projects.services.analytics.test)
|
testImplementation(projects.services.analytics.test)
|
||||||
testImplementation(projects.services.toolbox.test)
|
testImplementation(projects.services.toolbox.test)
|
||||||
testImplementation(projects.features.networkmonitor.test)
|
testImplementation(projects.features.networkmonitor.test)
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ import io.element.android.libraries.matrix.api.sync.SyncService
|
||||||
import io.element.android.libraries.matrix.api.sync.SyncState
|
import io.element.android.libraries.matrix.api.sync.SyncState
|
||||||
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
||||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
|
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
|
||||||
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import io.element.android.services.analytics.api.AnalyticsService
|
import io.element.android.services.analytics.api.AnalyticsService
|
||||||
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
|
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
|
|
@ -97,6 +98,7 @@ class RoomListPresenter @Inject constructor(
|
||||||
private val analyticsService: AnalyticsService,
|
private val analyticsService: AnalyticsService,
|
||||||
private val acceptDeclineInvitePresenter: Presenter<AcceptDeclineInviteState>,
|
private val acceptDeclineInvitePresenter: Presenter<AcceptDeclineInviteState>,
|
||||||
private val fullScreenIntentPermissionsPresenter: FullScreenIntentPermissionsPresenter,
|
private val fullScreenIntentPermissionsPresenter: FullScreenIntentPermissionsPresenter,
|
||||||
|
private val notificationCleaner: NotificationCleaner,
|
||||||
) : Presenter<RoomListState> {
|
) : Presenter<RoomListState> {
|
||||||
private val encryptionService: EncryptionService = client.encryptionService()
|
private val encryptionService: EncryptionService = client.encryptionService()
|
||||||
private val syncService: SyncService = client.syncService()
|
private val syncService: SyncService = client.syncService()
|
||||||
|
|
@ -268,6 +270,7 @@ class RoomListPresenter @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CoroutineScope.markAsRead(roomId: RoomId) = launch {
|
private fun CoroutineScope.markAsRead(roomId: RoomId) = launch {
|
||||||
|
notificationCleaner.clearMessagesForRoom(client.sessionId, roomId)
|
||||||
client.getRoom(roomId)?.use { room ->
|
client.getRoom(roomId)?.use { room ->
|
||||||
room.setUnreadFlag(isUnread = false)
|
room.setUnreadFlag(isUnread = false)
|
||||||
val receiptType = if (sessionPreferencesStore.isSendPublicReadReceiptsEnabled().first()) {
|
val receiptType = if (sessionPreferencesStore.isSendPublicReadReceiptsEnabled().first()) {
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ import io.element.android.libraries.fullscreenintent.test.FakeFullScreenIntentPe
|
||||||
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
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.encryption.BackupState
|
import io.element.android.libraries.matrix.api.encryption.BackupState
|
||||||
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
import io.element.android.libraries.matrix.api.encryption.RecoveryState
|
||||||
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
||||||
|
|
@ -62,6 +63,9 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
|
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
|
||||||
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
||||||
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
|
import io.element.android.libraries.matrix.test.A_ROOM_ID_2
|
||||||
|
import io.element.android.libraries.matrix.test.A_ROOM_ID_3
|
||||||
|
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID
|
import io.element.android.libraries.matrix.test.A_USER_ID
|
||||||
import io.element.android.libraries.matrix.test.A_USER_NAME
|
import io.element.android.libraries.matrix.test.A_USER_NAME
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
|
|
@ -75,6 +79,8 @@ import io.element.android.libraries.matrix.test.sync.FakeSyncService
|
||||||
import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService
|
import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService
|
||||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
|
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
|
||||||
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
|
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
|
||||||
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
|
import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
|
||||||
import io.element.android.services.analytics.api.AnalyticsService
|
import io.element.android.services.analytics.api.AnalyticsService
|
||||||
import io.element.android.services.analytics.test.FakeAnalyticsService
|
import io.element.android.services.analytics.test.FakeAnalyticsService
|
||||||
import io.element.android.tests.testutils.EventsRecorder
|
import io.element.android.tests.testutils.EventsRecorder
|
||||||
|
|
@ -503,35 +509,54 @@ class RoomListPresenterTest {
|
||||||
@Test
|
@Test
|
||||||
fun `present - check that the room is marked as read with correct RR and as unread`() = runTest {
|
fun `present - check that the room is marked as read with correct RR and as unread`() = runTest {
|
||||||
val room = FakeMatrixRoom()
|
val room = FakeMatrixRoom()
|
||||||
|
val room2 = FakeMatrixRoom(roomId = A_ROOM_ID_2)
|
||||||
|
val room3 = FakeMatrixRoom(roomId = A_ROOM_ID_3)
|
||||||
|
val allRooms = setOf(room, room2, room3)
|
||||||
val sessionPreferencesStore = InMemorySessionPreferencesStore()
|
val sessionPreferencesStore = InMemorySessionPreferencesStore()
|
||||||
val matrixClient = FakeMatrixClient().apply {
|
val matrixClient = FakeMatrixClient().apply {
|
||||||
givenGetRoomResult(A_ROOM_ID, room)
|
givenGetRoomResult(A_ROOM_ID, room)
|
||||||
|
givenGetRoomResult(A_ROOM_ID_2, room2)
|
||||||
|
givenGetRoomResult(A_ROOM_ID_3, room3)
|
||||||
}
|
}
|
||||||
val analyticsService = FakeAnalyticsService()
|
val analyticsService = FakeAnalyticsService()
|
||||||
val scope = CoroutineScope(coroutineContext + SupervisorJob())
|
val scope = CoroutineScope(coroutineContext + SupervisorJob())
|
||||||
|
val clearMessagesForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
|
val notificationCleaner = FakeNotificationCleaner(
|
||||||
|
clearMessagesForRoomLambda = clearMessagesForRoomLambda,
|
||||||
|
)
|
||||||
val presenter = createRoomListPresenter(
|
val presenter = createRoomListPresenter(
|
||||||
client = matrixClient,
|
client = matrixClient,
|
||||||
coroutineScope = scope,
|
coroutineScope = scope,
|
||||||
sessionPreferencesStore = sessionPreferencesStore,
|
sessionPreferencesStore = sessionPreferencesStore,
|
||||||
analyticsService = analyticsService,
|
analyticsService = analyticsService,
|
||||||
|
notificationCleaner = notificationCleaner,
|
||||||
)
|
)
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(room.markAsReadCalls).isEmpty()
|
allRooms.forEach {
|
||||||
assertThat(room.setUnreadFlagCalls).isEmpty()
|
assertThat(it.markAsReadCalls).isEmpty()
|
||||||
|
assertThat(it.setUnreadFlagCalls).isEmpty()
|
||||||
|
}
|
||||||
initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID))
|
initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID))
|
||||||
assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ))
|
assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ))
|
||||||
assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false))
|
assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false))
|
||||||
initialState.eventSink.invoke(RoomListEvents.MarkAsUnread(A_ROOM_ID))
|
clearMessagesForRoomLambda.assertions().isCalledOnce()
|
||||||
assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ))
|
.with(value(A_SESSION_ID), value(A_ROOM_ID))
|
||||||
assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false, true))
|
initialState.eventSink.invoke(RoomListEvents.MarkAsUnread(A_ROOM_ID_2))
|
||||||
|
assertThat(room2.markAsReadCalls).isEqualTo(emptyList<ReceiptType>())
|
||||||
|
assertThat(room2.setUnreadFlagCalls).isEqualTo(listOf(true))
|
||||||
// Test again with private read receipts
|
// Test again with private read receipts
|
||||||
sessionPreferencesStore.setSendPublicReadReceipts(false)
|
sessionPreferencesStore.setSendPublicReadReceipts(false)
|
||||||
initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID))
|
initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID_3))
|
||||||
assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ, ReceiptType.READ_PRIVATE))
|
assertThat(room3.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ_PRIVATE))
|
||||||
assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false, true, false))
|
assertThat(room3.setUnreadFlagCalls).isEqualTo(listOf(false))
|
||||||
|
clearMessagesForRoomLambda.assertions().isCalledExactly(2)
|
||||||
|
.withSequence(
|
||||||
|
listOf(value(A_SESSION_ID), value(A_ROOM_ID)),
|
||||||
|
listOf(value(A_SESSION_ID), value(A_ROOM_ID_3)),
|
||||||
|
)
|
||||||
assertThat(analyticsService.capturedEvents).containsExactly(
|
assertThat(analyticsService.capturedEvents).containsExactly(
|
||||||
Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle),
|
Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle),
|
||||||
Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle),
|
Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle),
|
||||||
|
|
@ -633,6 +658,7 @@ class RoomListPresenterTest {
|
||||||
filtersPresenter: Presenter<RoomListFiltersState> = Presenter { aRoomListFiltersState() },
|
filtersPresenter: Presenter<RoomListFiltersState> = Presenter { aRoomListFiltersState() },
|
||||||
searchPresenter: Presenter<RoomListSearchState> = Presenter { aRoomListSearchState() },
|
searchPresenter: Presenter<RoomListSearchState> = Presenter { aRoomListSearchState() },
|
||||||
acceptDeclineInvitePresenter: Presenter<AcceptDeclineInviteState> = Presenter { anAcceptDeclineInviteState() },
|
acceptDeclineInvitePresenter: Presenter<AcceptDeclineInviteState> = Presenter { anAcceptDeclineInviteState() },
|
||||||
|
notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
|
||||||
) = RoomListPresenter(
|
) = RoomListPresenter(
|
||||||
client = client,
|
client = client,
|
||||||
networkMonitor = networkMonitor,
|
networkMonitor = networkMonitor,
|
||||||
|
|
@ -660,5 +686,6 @@ class RoomListPresenterTest {
|
||||||
analyticsService = analyticsService,
|
analyticsService = analyticsService,
|
||||||
acceptDeclineInvitePresenter = acceptDeclineInvitePresenter,
|
acceptDeclineInvitePresenter = acceptDeclineInvitePresenter,
|
||||||
fullScreenIntentPermissionsPresenter = FakeFullScreenIntentPermissionsPresenter(),
|
fullScreenIntentPermissionsPresenter = FakeFullScreenIntentPermissionsPresenter(),
|
||||||
|
notificationCleaner = notificationCleaner,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ val A_SPACE_ID = SpaceId("!aSpaceId:domain")
|
||||||
val A_SPACE_ID_2 = SpaceId("!aSpaceId2:domain")
|
val A_SPACE_ID_2 = SpaceId("!aSpaceId2:domain")
|
||||||
val A_ROOM_ID = RoomId("!aRoomId:domain")
|
val A_ROOM_ID = RoomId("!aRoomId:domain")
|
||||||
val A_ROOM_ID_2 = RoomId("!aRoomId2:domain")
|
val A_ROOM_ID_2 = RoomId("!aRoomId2:domain")
|
||||||
|
val A_ROOM_ID_3 = RoomId("!aRoomId3:domain")
|
||||||
val A_THREAD_ID = ThreadId("\$aThreadId")
|
val A_THREAD_ID = ThreadId("\$aThreadId")
|
||||||
val A_THREAD_ID_2 = ThreadId("\$aThreadId2")
|
val A_THREAD_ID_2 = ThreadId("\$aThreadId2")
|
||||||
val AN_EVENT_ID = EventId("\$anEventId")
|
val AN_EVENT_ID = EventId("\$anEventId")
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import io.element.android.libraries.matrix.api.core.EventId
|
||||||
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
|
||||||
|
|
||||||
interface NotificationDrawerManager {
|
interface NotificationCleaner {
|
||||||
fun clearAllMessagesEvents(sessionId: SessionId)
|
fun clearAllMessagesEvents(sessionId: SessionId)
|
||||||
fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId)
|
fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId)
|
||||||
fun clearEvent(sessionId: SessionId, eventId: EventId)
|
fun clearEvent(sessionId: SessionId, eventId: EventId)
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2023 New Vector Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.element.android.libraries.push.impl.di
|
|
||||||
|
|
||||||
import com.squareup.anvil.annotations.ContributesTo
|
|
||||||
import dagger.Binds
|
|
||||||
import dagger.Module
|
|
||||||
import io.element.android.libraries.di.AppScope
|
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
|
||||||
import io.element.android.libraries.push.impl.notifications.DefaultNotificationDrawerManager
|
|
||||||
|
|
||||||
@Module
|
|
||||||
@ContributesTo(AppScope::class)
|
|
||||||
abstract class PushBindsModule {
|
|
||||||
@Binds
|
|
||||||
abstract fun bindNotificationDrawerManager(
|
|
||||||
defaultNotificationDrawerManager: DefaultNotificationDrawerManager
|
|
||||||
): NotificationDrawerManager
|
|
||||||
}
|
|
||||||
|
|
@ -18,6 +18,7 @@ package io.element.android.libraries.push.impl.notifications
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting
|
import androidx.annotation.VisibleForTesting
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import com.squareup.anvil.annotations.ContributesBinding
|
||||||
import io.element.android.libraries.core.data.tryOrNull
|
import io.element.android.libraries.core.data.tryOrNull
|
||||||
import io.element.android.libraries.core.log.logger.LoggerTag
|
import io.element.android.libraries.core.log.logger.LoggerTag
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
|
|
@ -30,7 +31,7 @@ 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.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder
|
import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationIdProvider
|
import io.element.android.libraries.push.api.notifications.NotificationIdProvider
|
||||||
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.shouldIgnoreEventInRoom
|
import io.element.android.libraries.push.impl.notifications.model.shouldIgnoreEventInRoom
|
||||||
|
|
@ -46,11 +47,12 @@ import javax.inject.Inject
|
||||||
private val loggerTag = LoggerTag("DefaultNotificationDrawerManager", LoggerTag.NotificationLoggerTag)
|
private val loggerTag = LoggerTag("DefaultNotificationDrawerManager", LoggerTag.NotificationLoggerTag)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The NotificationDrawerManager receives notification events as they arrive (from event stream or fcm) and
|
* This class receives notification events as they arrive from the PushHandler calling [onNotifiableEventReceived] and
|
||||||
* organise them in order to display them in the notification drawer.
|
* organise them in order to display them in the notification drawer.
|
||||||
* Events can be grouped into the same notification, old (already read) events can be removed to do some cleaning.
|
* Events can be grouped into the same notification, old (already read) events can be removed to do some cleaning.
|
||||||
*/
|
*/
|
||||||
@SingleIn(AppScope::class)
|
@SingleIn(AppScope::class)
|
||||||
|
@ContributesBinding(AppScope::class)
|
||||||
class DefaultNotificationDrawerManager @Inject constructor(
|
class DefaultNotificationDrawerManager @Inject constructor(
|
||||||
private val notificationManager: NotificationManagerCompat,
|
private val notificationManager: NotificationManagerCompat,
|
||||||
private val notificationRenderer: NotificationRenderer,
|
private val notificationRenderer: NotificationRenderer,
|
||||||
|
|
@ -59,7 +61,7 @@ class DefaultNotificationDrawerManager @Inject constructor(
|
||||||
private val matrixClientProvider: MatrixClientProvider,
|
private val matrixClientProvider: MatrixClientProvider,
|
||||||
private val imageLoaderHolder: ImageLoaderHolder,
|
private val imageLoaderHolder: ImageLoaderHolder,
|
||||||
private val activeNotificationsProvider: ActiveNotificationsProvider,
|
private val activeNotificationsProvider: ActiveNotificationsProvider,
|
||||||
) : NotificationDrawerManager {
|
) : NotificationCleaner {
|
||||||
private var appNavigationStateObserver: Job? = null
|
private var appNavigationStateObserver: Job? = null
|
||||||
|
|
||||||
// TODO EAx add a setting per user for this
|
// TODO EAx add a setting per user for this
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.matrix.api.room.isDm
|
import io.element.android.libraries.matrix.api.room.isDm
|
||||||
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
||||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
|
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import io.element.android.libraries.push.impl.R
|
import io.element.android.libraries.push.impl.R
|
||||||
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.push.OnNotifiableEventReceived
|
import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived
|
||||||
|
|
@ -47,7 +47,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor(
|
||||||
private val appCoroutineScope: CoroutineScope,
|
private val appCoroutineScope: CoroutineScope,
|
||||||
private val matrixClientProvider: MatrixClientProvider,
|
private val matrixClientProvider: MatrixClientProvider,
|
||||||
private val sessionPreferencesStore: SessionPreferencesStoreFactory,
|
private val sessionPreferencesStore: SessionPreferencesStoreFactory,
|
||||||
private val notificationDrawerManager: NotificationDrawerManager,
|
private val notificationCleaner: NotificationCleaner,
|
||||||
private val actionIds: NotificationActionIds,
|
private val actionIds: NotificationActionIds,
|
||||||
private val systemClock: SystemClock,
|
private val systemClock: SystemClock,
|
||||||
private val onNotifiableEventReceived: OnNotifiableEventReceived,
|
private val onNotifiableEventReceived: OnNotifiableEventReceived,
|
||||||
|
|
@ -66,26 +66,26 @@ class NotificationBroadcastReceiverHandler @Inject constructor(
|
||||||
handleSmartReply(sessionId, roomId, threadId, intent)
|
handleSmartReply(sessionId, roomId, threadId, intent)
|
||||||
}
|
}
|
||||||
actionIds.dismissRoom -> if (roomId != null) {
|
actionIds.dismissRoom -> if (roomId != null) {
|
||||||
notificationDrawerManager.clearMessagesForRoom(sessionId, roomId)
|
notificationCleaner.clearMessagesForRoom(sessionId, roomId)
|
||||||
}
|
}
|
||||||
actionIds.dismissSummary ->
|
actionIds.dismissSummary ->
|
||||||
notificationDrawerManager.clearAllMessagesEvents(sessionId)
|
notificationCleaner.clearAllMessagesEvents(sessionId)
|
||||||
actionIds.dismissInvite -> if (roomId != null) {
|
actionIds.dismissInvite -> if (roomId != null) {
|
||||||
notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId)
|
notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId)
|
||||||
}
|
}
|
||||||
actionIds.dismissEvent -> if (eventId != null) {
|
actionIds.dismissEvent -> if (eventId != null) {
|
||||||
notificationDrawerManager.clearEvent(sessionId, eventId)
|
notificationCleaner.clearEvent(sessionId, eventId)
|
||||||
}
|
}
|
||||||
actionIds.markRoomRead -> if (roomId != null) {
|
actionIds.markRoomRead -> if (roomId != null) {
|
||||||
notificationDrawerManager.clearMessagesForRoom(sessionId, roomId)
|
notificationCleaner.clearMessagesForRoom(sessionId, roomId)
|
||||||
handleMarkAsRead(sessionId, roomId)
|
handleMarkAsRead(sessionId, roomId)
|
||||||
}
|
}
|
||||||
actionIds.join -> if (roomId != null) {
|
actionIds.join -> if (roomId != null) {
|
||||||
notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId)
|
notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId)
|
||||||
handleJoinRoom(sessionId, roomId)
|
handleJoinRoom(sessionId, roomId)
|
||||||
}
|
}
|
||||||
actionIds.reject -> if (roomId != null) {
|
actionIds.reject -> if (roomId != null) {
|
||||||
notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId)
|
notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId)
|
||||||
handleRejectRoom(sessionId, roomId)
|
handleRejectRoom(sessionId, roomId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,11 +40,11 @@ import io.element.android.libraries.preferences.api.store.SessionPreferencesStor
|
||||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
|
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
|
||||||
import io.element.android.libraries.preferences.test.FakeSessionPreferencesStoreFactory
|
import io.element.android.libraries.preferences.test.FakeSessionPreferencesStoreFactory
|
||||||
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
|
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
|
||||||
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
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.push.FakeOnNotifiableEventReceived
|
import io.element.android.libraries.push.impl.push.FakeOnNotifiableEventReceived
|
||||||
import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived
|
import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived
|
||||||
import io.element.android.libraries.push.test.notifications.FakeNotificationDrawerManager
|
import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
|
||||||
import io.element.android.services.toolbox.api.strings.StringProvider
|
import io.element.android.services.toolbox.api.strings.StringProvider
|
||||||
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
||||||
import io.element.android.services.toolbox.test.strings.FakeStringProvider
|
import io.element.android.services.toolbox.test.strings.FakeStringProvider
|
||||||
|
|
@ -90,11 +90,11 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Test dismiss room`() = runTest {
|
fun `Test dismiss room`() = runTest {
|
||||||
val clearMessagesForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
val clearMessagesForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMessagesForRoomLambda = clearMessagesForRoomLambda,
|
clearMessagesForRoomLambda = clearMessagesForRoomLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -111,11 +111,11 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Test dismiss summary`() = runTest {
|
fun `Test dismiss summary`() = runTest {
|
||||||
val clearAllMessagesEventsLambda = lambdaRecorder<SessionId, Unit> { _ -> }
|
val clearAllMessagesEventsLambda = lambdaRecorder<SessionId, Unit> { _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearAllMessagesEventsLambda = clearAllMessagesEventsLambda,
|
clearAllMessagesEventsLambda = clearAllMessagesEventsLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -140,11 +140,11 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Test dismiss Invite`() = runTest {
|
fun `Test dismiss Invite`() = runTest {
|
||||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -170,11 +170,11 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Test dismiss Event`() = runTest {
|
fun `Test dismiss Event`() = runTest {
|
||||||
val clearEventLambda = lambdaRecorder<SessionId, EventId, Unit> { _, _ -> }
|
val clearEventLambda = lambdaRecorder<SessionId, EventId, Unit> { _, _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearEventLambda = clearEventLambda,
|
clearEventLambda = clearEventLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -227,13 +227,13 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
)
|
)
|
||||||
val clearMessagesForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
val clearMessagesForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
val matrixRoom = FakeMatrixRoom()
|
val matrixRoom = FakeMatrixRoom()
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMessagesForRoomLambda = clearMessagesForRoomLambda,
|
clearMessagesForRoomLambda = clearMessagesForRoomLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
sessionPreferencesStore = sessionPreferencesStore,
|
sessionPreferencesStore = sessionPreferencesStore,
|
||||||
matrixRoom = matrixRoom,
|
matrixRoom = matrixRoom,
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -262,12 +262,12 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
fun `Test join room`() = runTest {
|
fun `Test join room`() = runTest {
|
||||||
val joinRoom = lambdaRecorder<RoomId, Result<Unit>> { _ -> Result.success(Unit) }
|
val joinRoom = lambdaRecorder<RoomId, Result<Unit>> { _ -> Result.success(Unit) }
|
||||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
joinRoom = joinRoom,
|
joinRoom = joinRoom,
|
||||||
notificationDrawerManager = notificationDrawerManager,
|
notificationCleaner = fakeNotificationCleaner,
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -301,12 +301,12 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
leaveRoomLambda = leaveRoom
|
leaveRoomLambda = leaveRoom
|
||||||
}
|
}
|
||||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||||
val notificationDrawerManager = FakeNotificationDrawerManager(
|
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
||||||
)
|
)
|
||||||
val sut = createNotificationBroadcastReceiverHandler(
|
val sut = createNotificationBroadcastReceiverHandler(
|
||||||
matrixRoom = matrixRoom,
|
matrixRoom = matrixRoom,
|
||||||
notificationDrawerManager = notificationDrawerManager
|
notificationCleaner = fakeNotificationCleaner
|
||||||
)
|
)
|
||||||
sut.onReceive(
|
sut.onReceive(
|
||||||
createIntent(
|
createIntent(
|
||||||
|
|
@ -447,7 +447,7 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
joinRoomLambda = joinRoom
|
joinRoomLambda = joinRoom
|
||||||
},
|
},
|
||||||
sessionPreferencesStore: SessionPreferencesStoreFactory = FakeSessionPreferencesStoreFactory(),
|
sessionPreferencesStore: SessionPreferencesStoreFactory = FakeSessionPreferencesStoreFactory(),
|
||||||
notificationDrawerManager: NotificationDrawerManager = FakeNotificationDrawerManager(),
|
notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
|
||||||
systemClock: SystemClock = FakeSystemClock(),
|
systemClock: SystemClock = FakeSystemClock(),
|
||||||
onNotifiableEventReceived: OnNotifiableEventReceived = FakeOnNotifiableEventReceived(),
|
onNotifiableEventReceived: OnNotifiableEventReceived = FakeOnNotifiableEventReceived(),
|
||||||
stringProvider: StringProvider = FakeStringProvider(),
|
stringProvider: StringProvider = FakeStringProvider(),
|
||||||
|
|
@ -463,7 +463,7 @@ class NotificationBroadcastReceiverHandlerTest {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
sessionPreferencesStore = sessionPreferencesStore,
|
sessionPreferencesStore = sessionPreferencesStore,
|
||||||
notificationDrawerManager = notificationDrawerManager,
|
notificationCleaner = notificationCleaner,
|
||||||
actionIds = actionIds,
|
actionIds = actionIds,
|
||||||
systemClock = systemClock,
|
systemClock = systemClock,
|
||||||
onNotifiableEventReceived = onNotifiableEventReceived,
|
onNotifiableEventReceived = onNotifiableEventReceived,
|
||||||
|
|
|
||||||
|
|
@ -19,16 +19,16 @@ package io.element.android.libraries.push.test.notifications
|
||||||
import io.element.android.libraries.matrix.api.core.EventId
|
import io.element.android.libraries.matrix.api.core.EventId
|
||||||
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.push.api.notifications.NotificationDrawerManager
|
import io.element.android.libraries.push.api.notifications.NotificationCleaner
|
||||||
import io.element.android.tests.testutils.lambda.lambdaError
|
import io.element.android.tests.testutils.lambda.lambdaError
|
||||||
|
|
||||||
class FakeNotificationDrawerManager(
|
class FakeNotificationCleaner(
|
||||||
private val clearAllMessagesEventsLambda: (SessionId) -> Unit = { lambdaError() },
|
private val clearAllMessagesEventsLambda: (SessionId) -> Unit = { lambdaError() },
|
||||||
private val clearMessagesForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() },
|
private val clearMessagesForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() },
|
||||||
private val clearEventLambda: (SessionId, EventId) -> Unit = { _, _ -> lambdaError() },
|
private val clearEventLambda: (SessionId, EventId) -> Unit = { _, _ -> lambdaError() },
|
||||||
private val clearMembershipNotificationForSessionLambda: (SessionId) -> Unit = { lambdaError() },
|
private val clearMembershipNotificationForSessionLambda: (SessionId) -> Unit = { lambdaError() },
|
||||||
private val clearMembershipNotificationForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() }
|
private val clearMembershipNotificationForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() }
|
||||||
) : NotificationDrawerManager {
|
) : NotificationCleaner {
|
||||||
override fun clearAllMessagesEvents(sessionId: SessionId) {
|
override fun clearAllMessagesEvents(sessionId: SessionId) {
|
||||||
clearAllMessagesEventsLambda(sessionId)
|
clearAllMessagesEventsLambda(sessionId)
|
||||||
}
|
}
|
||||||
|
|
@ -56,7 +56,7 @@ import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
|
||||||
import io.element.android.libraries.matrix.api.timeline.Timeline
|
import io.element.android.libraries.matrix.api.timeline.Timeline
|
||||||
import io.element.android.libraries.matrix.impl.room.join.DefaultJoinRoom
|
import io.element.android.libraries.matrix.impl.room.join.DefaultJoinRoom
|
||||||
import io.element.android.libraries.preferences.impl.store.DefaultSessionPreferencesStore
|
import io.element.android.libraries.preferences.impl.store.DefaultSessionPreferencesStore
|
||||||
import io.element.android.libraries.push.test.notifications.FakeNotificationDrawerManager
|
import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
|
||||||
import io.element.android.services.analytics.noop.NoopAnalyticsService
|
import io.element.android.services.analytics.noop.NoopAnalyticsService
|
||||||
import io.element.android.services.toolbox.impl.strings.AndroidStringProvider
|
import io.element.android.services.toolbox.impl.strings.AndroidStringProvider
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -144,7 +144,7 @@ class RoomListScreen(
|
||||||
acceptDeclineInvitePresenter = AcceptDeclineInvitePresenter(
|
acceptDeclineInvitePresenter = AcceptDeclineInvitePresenter(
|
||||||
client = matrixClient,
|
client = matrixClient,
|
||||||
joinRoom = DefaultJoinRoom(matrixClient, NoopAnalyticsService()),
|
joinRoom = DefaultJoinRoom(matrixClient, NoopAnalyticsService()),
|
||||||
notificationDrawerManager = FakeNotificationDrawerManager(),
|
notificationCleaner = FakeNotificationCleaner(),
|
||||||
),
|
),
|
||||||
analyticsService = NoopAnalyticsService(),
|
analyticsService = NoopAnalyticsService(),
|
||||||
fullScreenIntentPermissionsPresenter = object : FullScreenIntentPermissionsPresenter {
|
fullScreenIntentPermissionsPresenter = object : FullScreenIntentPermissionsPresenter {
|
||||||
|
|
@ -158,6 +158,7 @@ class RoomListScreen(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
notificationCleaner = FakeNotificationCleaner(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue