From 717932a11137c1bca899e1cf5e3888eb4f1a203d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Oct 2025 11:57:06 +0200 Subject: [PATCH] Do not expose `AnnouncementState` in the api module --- .../kotlin/io/element/android/appnav/RootFlowNode.kt | 4 ++-- .../io/element/android/appnav/root/RootPresenter.kt | 4 ---- .../kotlin/io/element/android/appnav/root/RootState.kt | 2 -- .../element/android/appnav/root/RootStateProvider.kt | 2 -- .../kotlin/io/element/android/appnav/root/RootView.kt | 10 +++------- .../io/element/android/appnav/RootPresenterTest.kt | 2 -- .../features/announcement/api/AnnouncementService.kt | 1 - .../announcement/impl/AnnouncementPresenter.kt | 1 - .../features/announcement/impl}/AnnouncementState.kt | 2 +- .../announcement/impl/DefaultAnnouncementService.kt | 7 ++++--- .../announcement/impl/di/AnnouncementModule.kt | 2 +- .../impl/DefaultAnnouncementServiceTest.kt | 2 ++ .../rageshake/test/logs/FakeAnnouncementService.kt | 7 +++---- 13 files changed, 16 insertions(+), 30 deletions(-) rename features/announcement/{api/src/main/kotlin/io/element/android/features/announcement/api => impl/src/main/kotlin/io/element/android/features/announcement/impl}/AnnouncementState.kt (88%) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index c01b42af37..4498a44e07 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -174,8 +174,8 @@ class RootFlowNode( state = state, modifier = modifier, onOpenBugReport = this::onOpenBugReport, - announcementRenderer = { state, announcementModifier -> - announcementService.Render(state, announcementModifier) + announcementRenderer = { announcementModifier -> + announcementService.Render(announcementModifier) } ) { val backstackSlider = rememberBackstackSlider( diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt index 928e551a56..d987c2a7ec 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt @@ -13,7 +13,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import dev.zacsweers.metro.Inject import im.vector.app.features.analytics.plan.SuperProperties -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.features.rageshake.api.crash.CrashDetectionState import io.element.android.features.rageshake.api.detection.RageshakeDetectionState import io.element.android.libraries.architecture.Presenter @@ -25,7 +24,6 @@ import io.element.android.services.apperror.api.AppErrorStateService class RootPresenter( private val crashDetectionPresenter: Presenter, private val rageshakeDetectionPresenter: Presenter, - private val announcementPresenter: Presenter, private val appErrorStateService: AppErrorStateService, private val analyticsService: AnalyticsService, private val sdkMetadata: SdkMetadata, @@ -34,7 +32,6 @@ class RootPresenter( override fun present(): RootState { val rageshakeDetectionState = rageshakeDetectionPresenter.present() val crashDetectionState = crashDetectionPresenter.present() - val announcementState = announcementPresenter.present() val appErrorState by appErrorStateService.appErrorStateFlow.collectAsState() LaunchedEffect(Unit) { @@ -51,7 +48,6 @@ class RootPresenter( rageshakeDetectionState = rageshakeDetectionState, crashDetectionState = crashDetectionState, errorState = appErrorState, - announcementState = announcementState, ) } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt index 5ab995246f..3ea7362efa 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt @@ -8,7 +8,6 @@ package io.element.android.appnav.root import androidx.compose.runtime.Immutable -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.features.rageshake.api.crash.CrashDetectionState import io.element.android.features.rageshake.api.detection.RageshakeDetectionState import io.element.android.services.apperror.api.AppErrorState @@ -18,5 +17,4 @@ data class RootState( val rageshakeDetectionState: RageshakeDetectionState, val crashDetectionState: CrashDetectionState, val errorState: AppErrorState, - val announcementState: AnnouncementState, ) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt index 896e62d820..4d84e06070 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt @@ -8,7 +8,6 @@ package io.element.android.appnav.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.announcement.api.anAnnouncementState import io.element.android.features.rageshake.api.crash.aCrashDetectionState import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState import io.element.android.services.apperror.api.AppErrorState @@ -34,6 +33,5 @@ open class RootStateProvider : PreviewParameterProvider { fun aRootState() = RootState( rageshakeDetectionState = aRageshakeDetectionState(), crashDetectionState = aCrashDetectionState(), - announcementState = anAnnouncementState(), errorState = AppErrorState.NoError, ) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt index 275ccaae84..2913407fc1 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt @@ -14,7 +14,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewParameter -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.features.rageshake.api.crash.CrashDetectionEvents import io.element.android.features.rageshake.api.crash.CrashDetectionView import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents @@ -28,7 +27,7 @@ import io.element.android.services.apperror.impl.AppErrorView fun RootView( state: RootState, onOpenBugReport: () -> Unit, - announcementRenderer: @Composable (AnnouncementState, Modifier) -> Unit, + announcementRenderer: @Composable (Modifier) -> Unit, modifier: Modifier = Modifier, children: @Composable BoxScope.() -> Unit, ) { @@ -45,10 +44,7 @@ fun RootView( onOpenBugReport.invoke() } - announcementRenderer( - state.announcementState, - Modifier, - ) + announcementRenderer(Modifier) RageshakeDetectionView( state = state.rageshakeDetectionState, @@ -70,7 +66,7 @@ internal fun RootViewPreview(@PreviewParameter(RootStateProvider::class) rootSta RootView( state = rootState, onOpenBugReport = {}, - announcementRenderer = { _, _ -> }, + announcementRenderer = { }, ) { Text("Children") } diff --git a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt index 9d0d1e9572..2a343a1592 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -12,7 +12,6 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.appnav.root.RootPresenter -import io.element.android.features.announcement.api.anAnnouncementState import io.element.android.features.rageshake.api.crash.aCrashDetectionState import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState import io.element.android.libraries.matrix.test.FakeSdkMetadata @@ -72,7 +71,6 @@ class RootPresenterTest { return RootPresenter( crashDetectionPresenter = { aCrashDetectionState() }, rageshakeDetectionPresenter = { aRageshakeDetectionState() }, - announcementPresenter = { anAnnouncementState() }, appErrorStateService = appErrorService, analyticsService = FakeAnalyticsService(), sdkMetadata = FakeSdkMetadata("sha") 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 abd50aef3b..de822c8873 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 @@ -15,7 +15,6 @@ interface AnnouncementService { @Composable fun Render( - state: AnnouncementState, modifier: Modifier, ) } 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 435d69d1f5..76746bf44e 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 @@ -12,7 +12,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import dev.zacsweers.metro.Inject -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.flow.map diff --git a/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementState.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementState.kt similarity index 88% rename from features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementState.kt rename to features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementState.kt index eccdbd237c..c8ea728d64 100644 --- a/features/announcement/api/src/main/kotlin/io/element/android/features/announcement/api/AnnouncementState.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/AnnouncementState.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.announcement.api +package io.element.android.features.announcement.impl data class AnnouncementState( val showSpaceAnnouncement: Boolean, 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 a5ebb1716a..ef6314b82e 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 @@ -18,7 +18,6 @@ import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject import io.element.android.features.announcement.api.AnnouncementService -import io.element.android.features.announcement.api.AnnouncementState 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.AnnouncementStore @@ -29,6 +28,7 @@ import kotlinx.coroutines.flow.first @Inject class DefaultAnnouncementService( private val announcementStore: AnnouncementStore, + private val announcementPresenter: Presenter, private val spaceAnnouncementPresenter: Presenter, ) : AnnouncementService { override suspend fun onEnteringSpaceTab() { @@ -39,10 +39,11 @@ class DefaultAnnouncementService( } @Composable - override fun Render(state: AnnouncementState, modifier: Modifier) { + override fun Render(modifier: Modifier) { + val announcementState = announcementPresenter.present() Box(modifier = modifier.fillMaxSize()) { AnimatedVisibility( - visible = state.showSpaceAnnouncement, + visible = announcementState.showSpaceAnnouncement, enter = fadeIn(), exit = fadeOut(), ) { diff --git a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/di/AnnouncementModule.kt b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/di/AnnouncementModule.kt index 282f653aa7..4fbc9118bc 100644 --- a/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/di/AnnouncementModule.kt +++ b/features/announcement/impl/src/main/kotlin/io/element/android/features/announcement/impl/di/AnnouncementModule.kt @@ -11,8 +11,8 @@ import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.Binds import dev.zacsweers.metro.ContributesTo -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.features.announcement.impl.AnnouncementPresenter +import io.element.android.features.announcement.impl.AnnouncementState import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementPresenter import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementState import io.element.android.libraries.architecture.Presenter 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 5882549785..4e6249787a 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 @@ -36,9 +36,11 @@ class DefaultAnnouncementServiceTest { private fun createDefaultAnnouncementService( announcementStore: AnnouncementStore = InMemoryAnnouncementStore(), + announcementPresenter: Presenter = Presenter { anAnnouncementState() }, spaceAnnouncementPresenter: Presenter = Presenter { aSpaceAnnouncementState() }, ) = DefaultAnnouncementService( announcementStore = announcementStore, + announcementPresenter = announcementPresenter, spaceAnnouncementPresenter = spaceAnnouncementPresenter, ) } 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 3d3bbfcaba..a9f5452efc 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 @@ -10,19 +10,18 @@ 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.AnnouncementService -import io.element.android.features.announcement.api.AnnouncementState import io.element.android.tests.testutils.lambda.lambdaError class FakeAnnouncementService( val onEnteringSpaceTabResult: () -> Unit = { lambdaError() }, - val renderResult: (AnnouncementState, Modifier) -> Unit = { _, _ -> lambdaError() }, + val renderResult: (Modifier) -> Unit = { lambdaError() }, ) : AnnouncementService { override suspend fun onEnteringSpaceTab() { onEnteringSpaceTabResult() } @Composable - override fun Render(state: AnnouncementState, modifier: Modifier) { - renderResult(state, modifier) + override fun Render(modifier: Modifier) { + renderResult(modifier) } }