Do not expose AnnouncementState in the api module

This commit is contained in:
Benoit Marty 2025-10-03 11:57:06 +02:00
parent 1edd3b6314
commit 717932a111
13 changed files with 16 additions and 30 deletions

View file

@ -174,8 +174,8 @@ class RootFlowNode(
state = state, state = state,
modifier = modifier, modifier = modifier,
onOpenBugReport = this::onOpenBugReport, onOpenBugReport = this::onOpenBugReport,
announcementRenderer = { state, announcementModifier -> announcementRenderer = { announcementModifier ->
announcementService.Render(state, announcementModifier) announcementService.Render(announcementModifier)
} }
) { ) {
val backstackSlider = rememberBackstackSlider<NavTarget>( val backstackSlider = rememberBackstackSlider<NavTarget>(

View file

@ -13,7 +13,6 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import im.vector.app.features.analytics.plan.SuperProperties 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.crash.CrashDetectionState
import io.element.android.features.rageshake.api.detection.RageshakeDetectionState import io.element.android.features.rageshake.api.detection.RageshakeDetectionState
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
@ -25,7 +24,6 @@ import io.element.android.services.apperror.api.AppErrorStateService
class RootPresenter( class RootPresenter(
private val crashDetectionPresenter: Presenter<CrashDetectionState>, private val crashDetectionPresenter: Presenter<CrashDetectionState>,
private val rageshakeDetectionPresenter: Presenter<RageshakeDetectionState>, private val rageshakeDetectionPresenter: Presenter<RageshakeDetectionState>,
private val announcementPresenter: Presenter<AnnouncementState>,
private val appErrorStateService: AppErrorStateService, private val appErrorStateService: AppErrorStateService,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
private val sdkMetadata: SdkMetadata, private val sdkMetadata: SdkMetadata,
@ -34,7 +32,6 @@ class RootPresenter(
override fun present(): RootState { override fun present(): RootState {
val rageshakeDetectionState = rageshakeDetectionPresenter.present() val rageshakeDetectionState = rageshakeDetectionPresenter.present()
val crashDetectionState = crashDetectionPresenter.present() val crashDetectionState = crashDetectionPresenter.present()
val announcementState = announcementPresenter.present()
val appErrorState by appErrorStateService.appErrorStateFlow.collectAsState() val appErrorState by appErrorStateService.appErrorStateFlow.collectAsState()
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
@ -51,7 +48,6 @@ class RootPresenter(
rageshakeDetectionState = rageshakeDetectionState, rageshakeDetectionState = rageshakeDetectionState,
crashDetectionState = crashDetectionState, crashDetectionState = crashDetectionState,
errorState = appErrorState, errorState = appErrorState,
announcementState = announcementState,
) )
} }
} }

View file

@ -8,7 +8,6 @@
package io.element.android.appnav.root package io.element.android.appnav.root
import androidx.compose.runtime.Immutable 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.crash.CrashDetectionState
import io.element.android.features.rageshake.api.detection.RageshakeDetectionState import io.element.android.features.rageshake.api.detection.RageshakeDetectionState
import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorState
@ -18,5 +17,4 @@ data class RootState(
val rageshakeDetectionState: RageshakeDetectionState, val rageshakeDetectionState: RageshakeDetectionState,
val crashDetectionState: CrashDetectionState, val crashDetectionState: CrashDetectionState,
val errorState: AppErrorState, val errorState: AppErrorState,
val announcementState: AnnouncementState,
) )

View file

@ -8,7 +8,6 @@
package io.element.android.appnav.root package io.element.android.appnav.root
import androidx.compose.ui.tooling.preview.PreviewParameterProvider 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.crash.aCrashDetectionState
import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState
import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorState
@ -34,6 +33,5 @@ open class RootStateProvider : PreviewParameterProvider<RootState> {
fun aRootState() = RootState( fun aRootState() = RootState(
rageshakeDetectionState = aRageshakeDetectionState(), rageshakeDetectionState = aRageshakeDetectionState(),
crashDetectionState = aCrashDetectionState(), crashDetectionState = aCrashDetectionState(),
announcementState = anAnnouncementState(),
errorState = AppErrorState.NoError, errorState = AppErrorState.NoError,
) )

View file

@ -14,7 +14,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter 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.CrashDetectionEvents
import io.element.android.features.rageshake.api.crash.CrashDetectionView import io.element.android.features.rageshake.api.crash.CrashDetectionView
import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents
@ -28,7 +27,7 @@ import io.element.android.services.apperror.impl.AppErrorView
fun RootView( fun RootView(
state: RootState, state: RootState,
onOpenBugReport: () -> Unit, onOpenBugReport: () -> Unit,
announcementRenderer: @Composable (AnnouncementState, Modifier) -> Unit, announcementRenderer: @Composable (Modifier) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
children: @Composable BoxScope.() -> Unit, children: @Composable BoxScope.() -> Unit,
) { ) {
@ -45,10 +44,7 @@ fun RootView(
onOpenBugReport.invoke() onOpenBugReport.invoke()
} }
announcementRenderer( announcementRenderer(Modifier)
state.announcementState,
Modifier,
)
RageshakeDetectionView( RageshakeDetectionView(
state = state.rageshakeDetectionState, state = state.rageshakeDetectionState,
@ -70,7 +66,7 @@ internal fun RootViewPreview(@PreviewParameter(RootStateProvider::class) rootSta
RootView( RootView(
state = rootState, state = rootState,
onOpenBugReport = {}, onOpenBugReport = {},
announcementRenderer = { _, _ -> }, announcementRenderer = { },
) { ) {
Text("Children") Text("Children")
} }

View file

@ -12,7 +12,6 @@ import app.cash.molecule.moleculeFlow
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.appnav.root.RootPresenter 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.crash.aCrashDetectionState
import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState import io.element.android.features.rageshake.api.detection.aRageshakeDetectionState
import io.element.android.libraries.matrix.test.FakeSdkMetadata import io.element.android.libraries.matrix.test.FakeSdkMetadata
@ -72,7 +71,6 @@ class RootPresenterTest {
return RootPresenter( return RootPresenter(
crashDetectionPresenter = { aCrashDetectionState() }, crashDetectionPresenter = { aCrashDetectionState() },
rageshakeDetectionPresenter = { aRageshakeDetectionState() }, rageshakeDetectionPresenter = { aRageshakeDetectionState() },
announcementPresenter = { anAnnouncementState() },
appErrorStateService = appErrorService, appErrorStateService = appErrorService,
analyticsService = FakeAnalyticsService(), analyticsService = FakeAnalyticsService(),
sdkMetadata = FakeSdkMetadata("sha") sdkMetadata = FakeSdkMetadata("sha")

View file

@ -15,7 +15,6 @@ interface AnnouncementService {
@Composable @Composable
fun Render( fun Render(
state: AnnouncementState,
modifier: Modifier, modifier: Modifier,
) )
} }

View file

@ -12,7 +12,6 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import dev.zacsweers.metro.Inject 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.features.announcement.impl.store.AnnouncementStore
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map

View file

@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details. * 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( data class AnnouncementState(
val showSpaceAnnouncement: Boolean, val showSpaceAnnouncement: Boolean,

View file

@ -18,7 +18,6 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import io.element.android.features.announcement.api.AnnouncementService 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.SpaceAnnouncementState
import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementView import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementView
import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.AnnouncementStore
@ -29,6 +28,7 @@ import kotlinx.coroutines.flow.first
@Inject @Inject
class DefaultAnnouncementService( class DefaultAnnouncementService(
private val announcementStore: AnnouncementStore, private val announcementStore: AnnouncementStore,
private val announcementPresenter: Presenter<AnnouncementState>,
private val spaceAnnouncementPresenter: Presenter<SpaceAnnouncementState>, private val spaceAnnouncementPresenter: Presenter<SpaceAnnouncementState>,
) : AnnouncementService { ) : AnnouncementService {
override suspend fun onEnteringSpaceTab() { override suspend fun onEnteringSpaceTab() {
@ -39,10 +39,11 @@ class DefaultAnnouncementService(
} }
@Composable @Composable
override fun Render(state: AnnouncementState, modifier: Modifier) { override fun Render(modifier: Modifier) {
val announcementState = announcementPresenter.present()
Box(modifier = modifier.fillMaxSize()) { Box(modifier = modifier.fillMaxSize()) {
AnimatedVisibility( AnimatedVisibility(
visible = state.showSpaceAnnouncement, visible = announcementState.showSpaceAnnouncement,
enter = fadeIn(), enter = fadeIn(),
exit = fadeOut(), exit = fadeOut(),
) { ) {

View file

@ -11,8 +11,8 @@ import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.Binds import dev.zacsweers.metro.Binds
import dev.zacsweers.metro.ContributesTo 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.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.SpaceAnnouncementPresenter
import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementState import io.element.android.features.announcement.impl.spaces.SpaceAnnouncementState
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter

View file

@ -36,9 +36,11 @@ class DefaultAnnouncementServiceTest {
private fun createDefaultAnnouncementService( private fun createDefaultAnnouncementService(
announcementStore: AnnouncementStore = InMemoryAnnouncementStore(), announcementStore: AnnouncementStore = InMemoryAnnouncementStore(),
announcementPresenter: Presenter<AnnouncementState> = Presenter { anAnnouncementState() },
spaceAnnouncementPresenter: Presenter<SpaceAnnouncementState> = Presenter { aSpaceAnnouncementState() }, spaceAnnouncementPresenter: Presenter<SpaceAnnouncementState> = Presenter { aSpaceAnnouncementState() },
) = DefaultAnnouncementService( ) = DefaultAnnouncementService(
announcementStore = announcementStore, announcementStore = announcementStore,
announcementPresenter = announcementPresenter,
spaceAnnouncementPresenter = spaceAnnouncementPresenter, spaceAnnouncementPresenter = spaceAnnouncementPresenter,
) )
} }

View file

@ -10,19 +10,18 @@ package io.element.android.features.rageshake.test.logs
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import io.element.android.features.announcement.api.AnnouncementService import io.element.android.features.announcement.api.AnnouncementService
import io.element.android.features.announcement.api.AnnouncementState
import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaError
class FakeAnnouncementService( class FakeAnnouncementService(
val onEnteringSpaceTabResult: () -> Unit = { lambdaError() }, val onEnteringSpaceTabResult: () -> Unit = { lambdaError() },
val renderResult: (AnnouncementState, Modifier) -> Unit = { _, _ -> lambdaError() }, val renderResult: (Modifier) -> Unit = { lambdaError() },
) : AnnouncementService { ) : AnnouncementService {
override suspend fun onEnteringSpaceTab() { override suspend fun onEnteringSpaceTab() {
onEnteringSpaceTabResult() onEnteringSpaceTabResult()
} }
@Composable @Composable
override fun Render(state: AnnouncementState, modifier: Modifier) { override fun Render(modifier: Modifier) {
renderResult(state, modifier) renderResult(modifier)
} }
} }