diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt index 0972eb3eb8..73a82a71f5 100644 --- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt @@ -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.core.RoomId 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.launch import java.util.Optional @@ -44,7 +44,7 @@ import kotlin.jvm.optionals.getOrNull class AcceptDeclineInvitePresenter @Inject constructor( private val client: MatrixClient, private val joinRoom: JoinRoom, - private val notificationDrawerManager: NotificationDrawerManager, + private val notificationCleaner: NotificationCleaner, ) : Presenter { @Composable override fun present(): AcceptDeclineInviteState { @@ -112,7 +112,7 @@ class AcceptDeclineInvitePresenter @Inject constructor( trigger = JoinedRoom.Trigger.Invite, ) .onSuccess { - notificationDrawerManager.clearMembershipNotificationForRoom(client.sessionId, roomId) + notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId) } .map { roomId } } @@ -122,7 +122,7 @@ class AcceptDeclineInvitePresenter @Inject constructor( suspend { client.getRoom(roomId)?.use { it.leave().getOrThrow() - notificationDrawerManager.clearMembershipNotificationForRoom(client.sessionId, roomId) + notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId) } roomId }.runCatchingUpdatingState(declinedAction) diff --git a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt index faa1388fea..9a12e33b33 100644 --- a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt +++ b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt @@ -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.room.FakeMatrixRoom 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.test.notifications.FakeNotificationDrawerManager +import io.element.android.libraries.push.api.notifications.NotificationCleaner +import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder @@ -133,7 +133,7 @@ class AcceptDeclineInvitePresenterTest { val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> Result.success(Unit) } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda ) val declineInviteSuccess = lambdaRecorder { -> @@ -149,7 +149,7 @@ class AcceptDeclineInvitePresenterTest { } val presenter = createAcceptDeclineInvitePresenter( client = client, - notificationDrawerManager = notificationDrawerManager, + notificationCleaner = fakeNotificationCleaner, ) presenter.test { val inviteData = anInviteData() @@ -219,7 +219,7 @@ class AcceptDeclineInvitePresenterTest { val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> Result.success(Unit) } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda ) val joinRoomSuccess = lambdaRecorder { _: RoomId, _: List, _: JoinedRoom.Trigger -> @@ -227,7 +227,7 @@ class AcceptDeclineInvitePresenterTest { } val presenter = createAcceptDeclineInvitePresenter( joinRoomLambda = joinRoomSuccess, - notificationDrawerManager = notificationDrawerManager, + notificationCleaner = fakeNotificationCleaner, ) presenter.test { val inviteData = anInviteData() @@ -274,12 +274,12 @@ class AcceptDeclineInvitePresenterTest { joinRoomLambda: (RoomId, List, JoinedRoom.Trigger) -> Result = { _, _, _ -> Result.success(Unit) }, - notificationDrawerManager: NotificationDrawerManager = FakeNotificationDrawerManager(), + notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), ): AcceptDeclineInvitePresenter { return AcceptDeclineInvitePresenter( client = client, joinRoom = FakeJoinRoom(joinRoomLambda), - notificationDrawerManager = notificationDrawerManager, + notificationCleaner = notificationCleaner, ) } } diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index dac4e1c507..60403b25b0 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { implementation(projects.libraries.permissions.api) implementation(projects.libraries.permissions.noop) implementation(projects.libraries.preferences.api) + implementation(projects.libraries.push.api) implementation(projects.features.invite.api) implementation(projects.features.networkmonitor.api) implementation(projects.features.leaveroom.api) @@ -79,6 +80,7 @@ dependencies { testImplementation(projects.libraries.permissions.noop) testImplementation(projects.libraries.permissions.test) testImplementation(projects.libraries.preferences.test) + testImplementation(projects.libraries.push.test) testImplementation(projects.services.analytics.test) testImplementation(projects.services.toolbox.test) testImplementation(projects.features.networkmonitor.test) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 493047bc8b..d5f9404eff 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -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.timeline.ReceiptType 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.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.toPersistentList @@ -97,6 +98,7 @@ class RoomListPresenter @Inject constructor( private val analyticsService: AnalyticsService, private val acceptDeclineInvitePresenter: Presenter, private val fullScreenIntentPermissionsPresenter: FullScreenIntentPermissionsPresenter, + private val notificationCleaner: NotificationCleaner, ) : Presenter { private val encryptionService: EncryptionService = client.encryptionService() private val syncService: SyncService = client.syncService() @@ -268,6 +270,7 @@ class RoomListPresenter @Inject constructor( } private fun CoroutineScope.markAsRead(roomId: RoomId) = launch { + notificationCleaner.clearMessagesForRoom(client.sessionId, roomId) client.getRoom(roomId)?.use { room -> room.setUnreadFlag(isUnread = false) val receiptType = if (sessionPreferencesStore.isSendPublicReadReceiptsEnabled().first()) { diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index e1e0970756..9528def3e1 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -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.matrix.api.MatrixClient 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.RecoveryState 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_EXCEPTION 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_NAME 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.preferences.api.store.SessionPreferencesStore 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.test.FakeAnalyticsService import io.element.android.tests.testutils.EventsRecorder @@ -503,35 +509,54 @@ class RoomListPresenterTest { @Test fun `present - check that the room is marked as read with correct RR and as unread`() = runTest { 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 matrixClient = FakeMatrixClient().apply { givenGetRoomResult(A_ROOM_ID, room) + givenGetRoomResult(A_ROOM_ID_2, room2) + givenGetRoomResult(A_ROOM_ID_3, room3) } val analyticsService = FakeAnalyticsService() val scope = CoroutineScope(coroutineContext + SupervisorJob()) + val clearMessagesForRoomLambda = lambdaRecorder { _, _ -> } + val notificationCleaner = FakeNotificationCleaner( + clearMessagesForRoomLambda = clearMessagesForRoomLambda, + ) val presenter = createRoomListPresenter( client = matrixClient, coroutineScope = scope, sessionPreferencesStore = sessionPreferencesStore, analyticsService = analyticsService, + notificationCleaner = notificationCleaner, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { val initialState = awaitItem() - assertThat(room.markAsReadCalls).isEmpty() - assertThat(room.setUnreadFlagCalls).isEmpty() + allRooms.forEach { + assertThat(it.markAsReadCalls).isEmpty() + assertThat(it.setUnreadFlagCalls).isEmpty() + } initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID)) assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ)) assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false)) - initialState.eventSink.invoke(RoomListEvents.MarkAsUnread(A_ROOM_ID)) - assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ)) - assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false, true)) + clearMessagesForRoomLambda.assertions().isCalledOnce() + .with(value(A_SESSION_ID), value(A_ROOM_ID)) + initialState.eventSink.invoke(RoomListEvents.MarkAsUnread(A_ROOM_ID_2)) + assertThat(room2.markAsReadCalls).isEqualTo(emptyList()) + assertThat(room2.setUnreadFlagCalls).isEqualTo(listOf(true)) // Test again with private read receipts sessionPreferencesStore.setSendPublicReadReceipts(false) - initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID)) - assertThat(room.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ, ReceiptType.READ_PRIVATE)) - assertThat(room.setUnreadFlagCalls).isEqualTo(listOf(false, true, false)) + initialState.eventSink.invoke(RoomListEvents.MarkAsRead(A_ROOM_ID_3)) + assertThat(room3.markAsReadCalls).isEqualTo(listOf(ReceiptType.READ_PRIVATE)) + 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( Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle), Interaction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle), @@ -633,6 +658,7 @@ class RoomListPresenterTest { filtersPresenter: Presenter = Presenter { aRoomListFiltersState() }, searchPresenter: Presenter = Presenter { aRoomListSearchState() }, acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() }, + notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), ) = RoomListPresenter( client = client, networkMonitor = networkMonitor, @@ -660,5 +686,6 @@ class RoomListPresenterTest { analyticsService = analyticsService, acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, fullScreenIntentPermissionsPresenter = FakeFullScreenIntentPermissionsPresenter(), + notificationCleaner = notificationCleaner, ) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt index d10d1ad0d2..a84fe1edf6 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt @@ -48,6 +48,7 @@ val A_SPACE_ID = SpaceId("!aSpaceId:domain") val A_SPACE_ID_2 = SpaceId("!aSpaceId2:domain") val A_ROOM_ID = RoomId("!aRoomId: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_2 = ThreadId("\$aThreadId2") val AN_EVENT_ID = EventId("\$anEventId") diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationCleaner.kt similarity index 96% rename from libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt rename to libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationCleaner.kt index f7babb1e35..4183aa36c7 100644 --- a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationDrawerManager.kt +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/NotificationCleaner.kt @@ -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.SessionId -interface NotificationDrawerManager { +interface NotificationCleaner { fun clearAllMessagesEvents(sessionId: SessionId) fun clearMessagesForRoom(sessionId: SessionId, roomId: RoomId) fun clearEvent(sessionId: SessionId, eventId: EventId) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/di/PushBindsModule.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/di/PushBindsModule.kt deleted file mode 100644 index 63c5198514..0000000000 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/di/PushBindsModule.kt +++ /dev/null @@ -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 -} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt index f485e29847..5610356c55 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotificationDrawerManager.kt @@ -18,6 +18,7 @@ package io.element.android.libraries.push.impl.notifications import androidx.annotation.VisibleForTesting 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.log.logger.LoggerTag 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.user.MatrixUser 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.impl.notifications.model.NotifiableEvent 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) /** - * 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. * Events can be grouped into the same notification, old (already read) events can be removed to do some cleaning. */ @SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) class DefaultNotificationDrawerManager @Inject constructor( private val notificationManager: NotificationManagerCompat, private val notificationRenderer: NotificationRenderer, @@ -59,7 +61,7 @@ class DefaultNotificationDrawerManager @Inject constructor( private val matrixClientProvider: MatrixClientProvider, private val imageLoaderHolder: ImageLoaderHolder, private val activeNotificationsProvider: ActiveNotificationsProvider, -) : NotificationDrawerManager { +) : NotificationCleaner { private var appNavigationStateObserver: Job? = null // TODO EAx add a setting per user for this diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt index b1d26ce7ab..f5c407101e 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt @@ -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.timeline.ReceiptType 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.notifications.model.NotifiableMessageEvent import io.element.android.libraries.push.impl.push.OnNotifiableEventReceived @@ -47,7 +47,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor( private val appCoroutineScope: CoroutineScope, private val matrixClientProvider: MatrixClientProvider, private val sessionPreferencesStore: SessionPreferencesStoreFactory, - private val notificationDrawerManager: NotificationDrawerManager, + private val notificationCleaner: NotificationCleaner, private val actionIds: NotificationActionIds, private val systemClock: SystemClock, private val onNotifiableEventReceived: OnNotifiableEventReceived, @@ -66,26 +66,26 @@ class NotificationBroadcastReceiverHandler @Inject constructor( handleSmartReply(sessionId, roomId, threadId, intent) } actionIds.dismissRoom -> if (roomId != null) { - notificationDrawerManager.clearMessagesForRoom(sessionId, roomId) + notificationCleaner.clearMessagesForRoom(sessionId, roomId) } actionIds.dismissSummary -> - notificationDrawerManager.clearAllMessagesEvents(sessionId) + notificationCleaner.clearAllMessagesEvents(sessionId) actionIds.dismissInvite -> if (roomId != null) { - notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId) } actionIds.dismissEvent -> if (eventId != null) { - notificationDrawerManager.clearEvent(sessionId, eventId) + notificationCleaner.clearEvent(sessionId, eventId) } actionIds.markRoomRead -> if (roomId != null) { - notificationDrawerManager.clearMessagesForRoom(sessionId, roomId) + notificationCleaner.clearMessagesForRoom(sessionId, roomId) handleMarkAsRead(sessionId, roomId) } actionIds.join -> if (roomId != null) { - notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId) handleJoinRoom(sessionId, roomId) } actionIds.reject -> if (roomId != null) { - notificationDrawerManager.clearMembershipNotificationForRoom(sessionId, roomId) + notificationCleaner.clearMembershipNotificationForRoom(sessionId, roomId) handleRejectRoom(sessionId, roomId) } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt index 1948c7eb0c..d4706461d8 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt @@ -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.test.FakeSessionPreferencesStoreFactory 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.push.FakeOnNotifiableEventReceived 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.systemclock.SystemClock import io.element.android.services.toolbox.test.strings.FakeStringProvider @@ -90,11 +90,11 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test dismiss room`() = runTest { val clearMessagesForRoomLambda = lambdaRecorder { _, _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMessagesForRoomLambda = clearMessagesForRoomLambda, ) val sut = createNotificationBroadcastReceiverHandler( - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -111,11 +111,11 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test dismiss summary`() = runTest { val clearAllMessagesEventsLambda = lambdaRecorder { _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearAllMessagesEventsLambda = clearAllMessagesEventsLambda, ) val sut = createNotificationBroadcastReceiverHandler( - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -140,11 +140,11 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test dismiss Invite`() = runTest { val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, ) val sut = createNotificationBroadcastReceiverHandler( - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -170,11 +170,11 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test dismiss Event`() = runTest { val clearEventLambda = lambdaRecorder { _, _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearEventLambda = clearEventLambda, ) val sut = createNotificationBroadcastReceiverHandler( - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -227,13 +227,13 @@ class NotificationBroadcastReceiverHandlerTest { ) val clearMessagesForRoomLambda = lambdaRecorder { _, _ -> } val matrixRoom = FakeMatrixRoom() - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMessagesForRoomLambda = clearMessagesForRoomLambda, ) val sut = createNotificationBroadcastReceiverHandler( sessionPreferencesStore = sessionPreferencesStore, matrixRoom = matrixRoom, - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -262,12 +262,12 @@ class NotificationBroadcastReceiverHandlerTest { fun `Test join room`() = runTest { val joinRoom = lambdaRecorder> { _ -> Result.success(Unit) } val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, ) val sut = createNotificationBroadcastReceiverHandler( joinRoom = joinRoom, - notificationDrawerManager = notificationDrawerManager, + notificationCleaner = fakeNotificationCleaner, ) sut.onReceive( createIntent( @@ -301,12 +301,12 @@ class NotificationBroadcastReceiverHandlerTest { leaveRoomLambda = leaveRoom } val clearMembershipNotificationForRoomLambda = lambdaRecorder { _, _ -> } - val notificationDrawerManager = FakeNotificationDrawerManager( + val fakeNotificationCleaner = FakeNotificationCleaner( clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda, ) val sut = createNotificationBroadcastReceiverHandler( matrixRoom = matrixRoom, - notificationDrawerManager = notificationDrawerManager + notificationCleaner = fakeNotificationCleaner ) sut.onReceive( createIntent( @@ -447,7 +447,7 @@ class NotificationBroadcastReceiverHandlerTest { joinRoomLambda = joinRoom }, sessionPreferencesStore: SessionPreferencesStoreFactory = FakeSessionPreferencesStoreFactory(), - notificationDrawerManager: NotificationDrawerManager = FakeNotificationDrawerManager(), + notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), systemClock: SystemClock = FakeSystemClock(), onNotifiableEventReceived: OnNotifiableEventReceived = FakeOnNotifiableEventReceived(), stringProvider: StringProvider = FakeStringProvider(), @@ -463,7 +463,7 @@ class NotificationBroadcastReceiverHandlerTest { } }, sessionPreferencesStore = sessionPreferencesStore, - notificationDrawerManager = notificationDrawerManager, + notificationCleaner = notificationCleaner, actionIds = actionIds, systemClock = systemClock, onNotifiableEventReceived = onNotifiableEventReceived, diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationCleaner.kt similarity index 96% rename from libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt rename to libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationCleaner.kt index b42f05aa5f..eeb3688730 100644 --- a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationDrawerManager.kt +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeNotificationCleaner.kt @@ -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.RoomId 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 -class FakeNotificationDrawerManager( +class FakeNotificationCleaner( private val clearAllMessagesEventsLambda: (SessionId) -> Unit = { lambdaError() }, private val clearMessagesForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() }, private val clearEventLambda: (SessionId, EventId) -> Unit = { _, _ -> lambdaError() }, private val clearMembershipNotificationForSessionLambda: (SessionId) -> Unit = { lambdaError() }, private val clearMembershipNotificationForRoomLambda: (SessionId, RoomId) -> Unit = { _, _ -> lambdaError() } -) : NotificationDrawerManager { +) : NotificationCleaner { override fun clearAllMessagesEvents(sessionId: SessionId) { clearAllMessagesEventsLambda(sessionId) } diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt index fa19762800..b91daeecfd 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt @@ -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.impl.room.join.DefaultJoinRoom 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.toolbox.impl.strings.AndroidStringProvider import kotlinx.coroutines.launch @@ -144,7 +144,7 @@ class RoomListScreen( acceptDeclineInvitePresenter = AcceptDeclineInvitePresenter( client = matrixClient, joinRoom = DefaultJoinRoom(matrixClient, NoopAnalyticsService()), - notificationDrawerManager = FakeNotificationDrawerManager(), + notificationCleaner = FakeNotificationCleaner(), ), analyticsService = NoopAnalyticsService(), fullScreenIntentPermissionsPresenter = object : FullScreenIntentPermissionsPresenter { @@ -158,6 +158,7 @@ class RoomListScreen( ) } }, + notificationCleaner = FakeNotificationCleaner(), ) @Composable