diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenter.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenter.kt index d7e63e6ebe..432aad4a0a 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenter.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenter.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import dev.zacsweers.metro.Inject import io.element.android.features.announcement.api.Announcement +import io.element.android.features.announcement.impl.store.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.flow.map @@ -25,7 +26,7 @@ class AnnouncementPresenter( override fun present(): AnnouncementState { val showSpaceAnnouncement by remember { announcementStore.announcementStatusFlow(Announcement.Space).map { - it == AnnouncementStore.AnnouncementStatus.Show + it == AnnouncementStatus.Show } }.collectAsState(false) return AnnouncementState( 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 e373e46f5a..6d616f14e9 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 @@ -21,6 +21,7 @@ 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 +import io.element.android.features.announcement.impl.store.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.flow.Flow @@ -38,13 +39,13 @@ class DefaultAnnouncementService( when (announcement) { Announcement.Space -> showSpaceAnnouncement() Announcement.NewNotificationSound -> { - announcementStore.setAnnouncementStatus(Announcement.NewNotificationSound, AnnouncementStore.AnnouncementStatus.Show) + announcementStore.setAnnouncementStatus(Announcement.NewNotificationSound, AnnouncementStatus.Show) } } } override suspend fun onAnnouncementDismissed(announcement: Announcement) { - announcementStore.setAnnouncementStatus(announcement, AnnouncementStore.AnnouncementStatus.Shown) + announcementStore.setAnnouncementStatus(announcement, AnnouncementStatus.Shown) } override fun announcementsToShowFlow(): Flow> { @@ -53,10 +54,10 @@ class DefaultAnnouncementService( announcementStore.announcementStatusFlow(Announcement.NewNotificationSound), ) { spaceAnnouncementStatus, newNotificationSoundStatus -> buildList { - if (spaceAnnouncementStatus == AnnouncementStore.AnnouncementStatus.Show) { + if (spaceAnnouncementStatus == AnnouncementStatus.Show) { add(Announcement.Space) } - if (newNotificationSoundStatus == AnnouncementStore.AnnouncementStatus.Show) { + if (newNotificationSoundStatus == AnnouncementStatus.Show) { add(Announcement.NewNotificationSound) } } @@ -65,8 +66,8 @@ class DefaultAnnouncementService( private suspend fun showSpaceAnnouncement() { val currentValue = announcementStore.announcementStatusFlow(Announcement.Space).first() - if (currentValue == AnnouncementStore.AnnouncementStatus.NeverShown) { - announcementStore.setAnnouncementStatus(Announcement.Space, AnnouncementStore.AnnouncementStatus.Show) + if (currentValue == AnnouncementStatus.NeverShown) { + announcementStore.setAnnouncementStatus(Announcement.Space, AnnouncementStatus.Show) } } diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenter.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenter.kt index eb693d8a07..4d1b2f3e4b 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenter.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenter.kt @@ -11,8 +11,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import dev.zacsweers.metro.Inject import io.element.android.features.announcement.api.Announcement +import io.element.android.features.announcement.impl.store.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore -import io.element.android.features.announcement.impl.store.AnnouncementStore.AnnouncementStatus import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.launch diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStatus.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStatus.kt new file mode 100644 index 0000000000..e275a140e1 --- /dev/null +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStatus.kt @@ -0,0 +1,14 @@ +/* + * 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.impl.store + +enum class AnnouncementStatus { + NeverShown, + Show, + Shown, +} diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStore.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStore.kt index 6742adf468..3385165c52 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStore.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/AnnouncementStore.kt @@ -21,10 +21,4 @@ interface AnnouncementStore { ): Flow suspend fun reset() - - enum class AnnouncementStatus { - NeverShown, - Show, - Shown, - } } diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/DefaultAnnouncementStore.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/DefaultAnnouncementStore.kt index 7cdab9c82a..37acf9f6b4 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/DefaultAnnouncementStore.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/store/DefaultAnnouncementStore.kt @@ -27,23 +27,23 @@ class DefaultAnnouncementStore( ) : AnnouncementStore { private val store = preferenceDataStoreFactory.create("elementx_announcement") - override suspend fun setAnnouncementStatus(announcement: Announcement, status: AnnouncementStore.AnnouncementStatus) { + override suspend fun setAnnouncementStatus(announcement: Announcement, status: AnnouncementStatus) { val key = announcement.toKey() store.edit { prefs -> prefs[key] = status.ordinal } } - override fun announcementStatusFlow(announcement: Announcement): Flow { + override fun announcementStatusFlow(announcement: Announcement): Flow { val key = announcement.toKey() // For NewNotificationSound, a migration will set it to Show on application upgrade (see AppMigration08) val defaultStatus = when (announcement) { - Announcement.Space -> AnnouncementStore.AnnouncementStatus.NeverShown - Announcement.NewNotificationSound -> AnnouncementStore.AnnouncementStatus.Shown + Announcement.Space -> AnnouncementStatus.NeverShown + Announcement.NewNotificationSound -> AnnouncementStatus.Shown } return store.data.map { prefs -> val ordinal = prefs[key] ?: defaultStatus.ordinal - AnnouncementStore.AnnouncementStatus.entries.getOrElse(ordinal) { defaultStatus } + AnnouncementStatus.entries.getOrElse(ordinal) { defaultStatus } } } diff --git a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenterTest.kt b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenterTest.kt index 747c5e9ce0..9290773b30 100644 --- a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenterTest.kt +++ b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/AnnouncementPresenterTest.kt @@ -9,6 +9,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.store.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.InMemoryAnnouncementStore import io.element.android.tests.testutils.test @@ -34,10 +35,10 @@ class AnnouncementPresenterTest { presenter.test { val state = awaitItem() assertThat(state.showSpaceAnnouncement).isFalse() - store.setAnnouncementStatus(Announcement.Space, AnnouncementStore.AnnouncementStatus.Show) + store.setAnnouncementStatus(Announcement.Space, AnnouncementStatus.Show) val updatedState = awaitItem() assertThat(updatedState.showSpaceAnnouncement).isTrue() - store.setAnnouncementStatus(Announcement.Space, AnnouncementStore.AnnouncementStatus.Shown) + store.setAnnouncementStatus(Announcement.Space, AnnouncementStatus.Shown) val finalState = awaitItem() assertThat(finalState.showSpaceAnnouncement).isFalse() } 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 6188894a44..f16d7db26d 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 @@ -11,6 +11,7 @@ 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.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.InMemoryAnnouncementStore import io.element.android.libraries.architecture.Presenter @@ -25,14 +26,14 @@ class DefaultAnnouncementServiceTest { val sut = createDefaultAnnouncementService( announcementStore = announcementStore, ) - assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStore.AnnouncementStatus.NeverShown) + assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStatus.NeverShown) sut.showAnnouncement(Announcement.Space) - assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStore.AnnouncementStatus.Show) + assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStatus.Show) // Simulate user close the announcement sut.onAnnouncementDismissed(Announcement.Space) // Entering again the space tab should not change the value sut.showAnnouncement(Announcement.Space) - assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStore.AnnouncementStatus.Shown) + assertThat(announcementStore.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStatus.Shown) } private fun createDefaultAnnouncementService( diff --git a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenterTest.kt b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenterTest.kt index c8dd199018..2c35bccf41 100644 --- a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenterTest.kt +++ b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/spaces/SpaceAnnouncementPresenterTest.kt @@ -9,6 +9,7 @@ package io.element.android.features.announcement.impl.spaces import com.google.common.truth.Truth.assertThat import io.element.android.features.announcement.api.Announcement +import io.element.android.features.announcement.impl.store.AnnouncementStatus import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.InMemoryAnnouncementStore import io.element.android.tests.testutils.test @@ -24,10 +25,10 @@ class SpaceAnnouncementPresenterTest { announcementStore = store, ) presenter.test { - assertThat(store.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStore.AnnouncementStatus.NeverShown) + assertThat(store.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStatus.NeverShown) val state = awaitItem() state.eventSink(SpaceAnnouncementEvents.Continue) - assertThat(store.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStore.AnnouncementStatus.Shown) + assertThat(store.announcementStatusFlow(Announcement.Space).first()).isEqualTo(AnnouncementStatus.Shown) } } } diff --git a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/store/InMemoryAnnouncementStore.kt b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/store/InMemoryAnnouncementStore.kt index bac711c59c..f7d438784a 100644 --- a/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/store/InMemoryAnnouncementStore.kt +++ b/features/announcement/impl/src/test/kotlin/io/element/android/features/announcement/impl/store/InMemoryAnnouncementStore.kt @@ -13,23 +13,23 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow class InMemoryAnnouncementStore( - initialSpaceAnnouncementStatus: AnnouncementStore.AnnouncementStatus = AnnouncementStore.AnnouncementStatus.NeverShown, - initialNewNotificationSoundAnnouncementStatus: AnnouncementStore.AnnouncementStatus = AnnouncementStore.AnnouncementStatus.NeverShown, + initialSpaceAnnouncementStatus: AnnouncementStatus = AnnouncementStatus.NeverShown, + initialNewNotificationSoundAnnouncementStatus: AnnouncementStatus = AnnouncementStatus.NeverShown, ) : AnnouncementStore { private val spaceAnnouncement = MutableStateFlow(initialSpaceAnnouncementStatus) private val newNotificationSoundAnnouncement = MutableStateFlow(initialNewNotificationSoundAnnouncementStatus) - override suspend fun setAnnouncementStatus(announcement: Announcement, status: AnnouncementStore.AnnouncementStatus) { + override suspend fun setAnnouncementStatus(announcement: Announcement, status: AnnouncementStatus) { announcement.toMutableStateFlow().value = status } - override fun announcementStatusFlow(announcement: Announcement): Flow { + override fun announcementStatusFlow(announcement: Announcement): Flow { return announcement.toMutableStateFlow().asStateFlow() } override suspend fun reset() { - spaceAnnouncement.value = AnnouncementStore.AnnouncementStatus.NeverShown - newNotificationSoundAnnouncement.value = AnnouncementStore.AnnouncementStatus.NeverShown + spaceAnnouncement.value = AnnouncementStatus.NeverShown + newNotificationSoundAnnouncement.value = AnnouncementStatus.NeverShown } private fun Announcement.toMutableStateFlow() = when (this) {