From d7f39c332f2ff65f059d08058ab9ad5daa9ec6e8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Oct 2025 12:03:06 +0200 Subject: [PATCH] Introduce Announcement enum. --- .../features/announcement/api/Announcement.kt | 12 ++++++++++++ .../features/announcement/api/AnnouncementService.kt | 2 +- .../announcement/impl/DefaultAnnouncementService.kt | 9 ++++++++- .../impl/DefaultAnnouncementServiceTest.kt | 7 ++++--- .../rageshake/test/logs/FakeAnnouncementService.kt | 7 ++++--- .../android/features/home/impl/HomePresenter.kt | 3 ++- .../android/features/home/impl/HomePresenterTest.kt | 11 +++++++---- 7 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/Announcement.kt diff --git a/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/Announcement.kt b/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/Announcement.kt new file mode 100644 index 0000000000..96fd738903 --- /dev/null +++ b/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/Announcement.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.features.announcement.api + +enum class Announcement { + Space, +} diff --git a/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementService.kt b/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementService.kt index de822c8873..62944d727e 100644 --- a/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementService.kt +++ b/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementService.kt @@ -11,7 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier interface AnnouncementService { - suspend fun onEnteringSpaceTab() + suspend fun showAnnouncement(announcement: Announcement) @Composable fun Render( diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementService.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementService.kt index ef6314b82e..e9b6310544 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementService.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementService.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject +import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.AnnouncementService import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementState import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementView @@ -31,7 +32,13 @@ class DefaultAnnouncementService( private val announcementPresenter: Presenter, private val spaceAnnouncementPresenter: Presenter, ) : AnnouncementService { - override suspend fun onEnteringSpaceTab() { + override suspend fun showAnnouncement(announcement: Announcement) { + when (announcement) { + Announcement.Space -> showSpaceAnnouncement() + } + } + + private suspend fun showSpaceAnnouncement() { val currentValue = announcementStore.spaceAnnouncementFlow().first() if (currentValue == AnnouncementStore.SpaceAnnouncement.NeverShown) { announcementStore.setSpaceAnnouncementValue(AnnouncementStore.SpaceAnnouncement.Show) diff --git a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementServiceTest.kt b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementServiceTest.kt index 4e6249787a..74155ce13b 100644 --- a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementServiceTest.kt +++ b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/DefaultAnnouncementServiceTest.kt @@ -8,6 +8,7 @@ package io.element.android.features.announcement.impl import com.google.common.truth.Truth.assertThat +import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementState import io.element.android.features.announcement.impl.spaces.aSpaceAnnouncementState import io.element.android.features.announcement.impl.store.AnnouncementStore @@ -19,18 +20,18 @@ import org.junit.Test class DefaultAnnouncementServiceTest { @Test - fun `when entering space tab, space announcement is set to show only if it was never shown`() = runTest { + fun `when showing Space announcement, space announcement is set to show only if it was never shown`() = runTest { val announcementStore = InMemoryAnnouncementStore() val sut = createDefaultAnnouncementService( announcementStore = announcementStore, ) assertThat(announcementStore.spaceAnnouncementFlow().first()).isEqualTo(AnnouncementStore.SpaceAnnouncement.NeverShown) - sut.onEnteringSpaceTab() + sut.showAnnouncement(Announcement.Space) assertThat(announcementStore.spaceAnnouncementFlow().first()).isEqualTo(AnnouncementStore.SpaceAnnouncement.Show) // Simulate user close the announcement announcementStore.setSpaceAnnouncementValue(AnnouncementStore.SpaceAnnouncement.Shown) // Entering again the space tab should not change the value - sut.onEnteringSpaceTab() + sut.showAnnouncement(Announcement.Space) assertThat(announcementStore.spaceAnnouncementFlow().first()).isEqualTo(AnnouncementStore.SpaceAnnouncement.Shown) } diff --git a/features/announcement/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeAnnouncementService.kt b/features/announcement/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeAnnouncementService.kt index a9f5452efc..a9d56e975c 100644 --- a/features/announcement/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeAnnouncementService.kt +++ b/features/announcement/test/src/main/kotlin/io/element/android/features/rageshake/test/logs/FakeAnnouncementService.kt @@ -9,15 +9,16 @@ package io.element.android.features.rageshake.test.logs import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.AnnouncementService import io.element.android.tests.testutils.lambda.lambdaError class FakeAnnouncementService( - val onEnteringSpaceTabResult: () -> Unit = { lambdaError() }, + val showAnnouncementResult: (Announcement) -> Unit = { lambdaError() }, val renderResult: (Modifier) -> Unit = { lambdaError() }, ) : AnnouncementService { - override suspend fun onEnteringSpaceTab() { - onEnteringSpaceTabResult() + override suspend fun showAnnouncement(announcement: Announcement) { + showAnnouncementResult(announcement) } @Composable diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt index d5f3e68898..e3ca9612d1 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import dev.zacsweers.metro.Inject +import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.AnnouncementService import io.element.android.features.home.impl.roomlist.RoomListState import io.element.android.features.home.impl.spaces.HomeSpacesState @@ -88,7 +89,7 @@ class HomePresenter( when (event) { is HomeEvents.SelectHomeNavigationBarItem -> coroutineState.launch { if (event.item == HomeNavigationBarItem.Spaces) { - announcementService.onEnteringSpaceTab() + announcementService.showAnnouncement(Announcement.Space) } currentHomeNavigationBarItemOrdinal = event.item.ordinal } diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt index aa5a612760..8048564e2b 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt @@ -11,6 +11,7 @@ import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat +import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.AnnouncementService import io.element.android.features.home.impl.roomlist.aRoomListState import io.element.android.features.home.impl.spaces.HomeSpacesState @@ -40,6 +41,7 @@ import io.element.android.libraries.sessionstorage.test.aSessionData import io.element.android.tests.testutils.MutablePresenter import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest @@ -168,13 +170,13 @@ class HomePresenterTest { @Test fun `present - NavigationBar change`() = runTest { - val onEnteringSpaceTabResult = lambdaRecorder { } + val showAnnouncementResult = lambdaRecorder { } val presenter = createHomePresenter( sessionStore = InMemorySessionStore( updateUserProfileResult = { _, _, _ -> }, ), announcementService = FakeAnnouncementService( - onEnteringSpaceTabResult = onEnteringSpaceTabResult, + showAnnouncementResult = showAnnouncementResult, ) ) moleculeFlow(RecompositionMode.Immediate) { @@ -185,7 +187,8 @@ class HomePresenterTest { initialState.eventSink(HomeEvents.SelectHomeNavigationBarItem(HomeNavigationBarItem.Spaces)) val finalState = awaitItem() assertThat(finalState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Spaces) - onEnteringSpaceTabResult.assertions().isCalledOnce() + showAnnouncementResult.assertions().isCalledOnce() + .with(value(Announcement.Space)) } } @@ -201,7 +204,7 @@ class HomePresenterTest { ), homeSpacesPresenter = homeSpacesPresenter, announcementService = FakeAnnouncementService( - onEnteringSpaceTabResult = {}, + showAnnouncementResult = {}, ) ) presenter.test {