DeveloperSettingsEvents -> DeveloperSettingsEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:09:09 +02:00
parent d8e7031709
commit 7952721ffe
7 changed files with 38 additions and 38 deletions
@@ -10,11 +10,11 @@ package io.element.android.features.preferences.impl.developer
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
sealed interface DeveloperSettingsEvents { sealed interface DeveloperSettingsEvent {
data class SetShowColorPicker(val show: Boolean) : DeveloperSettingsEvents data class SetShowColorPicker(val show: Boolean) : DeveloperSettingsEvent
data class ChangeBrandColor(val color: Color?) : DeveloperSettingsEvents data class ChangeBrandColor(val color: Color?) : DeveloperSettingsEvent
data object ClearCache : DeveloperSettingsEvents data object ClearCache : DeveloperSettingsEvent
data object VacuumStores : DeveloperSettingsEvents data object VacuumStores : DeveloperSettingsEvent
data class MarkAllRoomsAsRead(val needsConfirmation: Boolean) : DeveloperSettingsEvents data class MarkAllRoomsAsRead(val needsConfirmation: Boolean) : DeveloperSettingsEvent
data object DismissMarkAllRoomsAsReadConfirmation : DeveloperSettingsEvents data object DismissMarkAllRoomsAsReadConfirmation : DeveloperSettingsEvent
} }
@@ -79,10 +79,10 @@ class DeveloperSettingsPresenter(
computeCacheSize(cacheSize) computeCacheSize(cacheSize)
} }
fun handleEvent(event: DeveloperSettingsEvents) { fun handleEvent(event: DeveloperSettingsEvent) {
when (event) { when (event) {
DeveloperSettingsEvents.ClearCache -> coroutineScope.clearCache(clearCacheAction) DeveloperSettingsEvent.ClearCache -> coroutineScope.clearCache(clearCacheAction)
is DeveloperSettingsEvents.ChangeBrandColor -> coroutineScope.launch { is DeveloperSettingsEvent.ChangeBrandColor -> coroutineScope.launch {
showColorPicker = false showColorPicker = false
val color = event.color val color = event.color
?.toArgb() ?.toArgb()
@@ -91,13 +91,13 @@ class DeveloperSettingsPresenter(
?.padStart(7, '#') ?.padStart(7, '#')
enterpriseService.overrideBrandColor(sessionId, color) enterpriseService.overrideBrandColor(sessionId, color)
} }
is DeveloperSettingsEvents.SetShowColorPicker -> { is DeveloperSettingsEvent.SetShowColorPicker -> {
showColorPicker = event.show showColorPicker = event.show
} }
DeveloperSettingsEvents.VacuumStores -> coroutineScope.launch { DeveloperSettingsEvent.VacuumStores -> coroutineScope.launch {
vacuumStoresUseCase() vacuumStoresUseCase()
} }
is DeveloperSettingsEvents.MarkAllRoomsAsRead -> { is DeveloperSettingsEvent.MarkAllRoomsAsRead -> {
if (event.needsConfirmation) { if (event.needsConfirmation) {
markAllRoomsAsReadAction.value = AsyncAction.ConfirmingNoParams markAllRoomsAsReadAction.value = AsyncAction.ConfirmingNoParams
} else { } else {
@@ -106,7 +106,7 @@ class DeveloperSettingsPresenter(
) )
} }
} }
DeveloperSettingsEvents.DismissMarkAllRoomsAsReadConfirmation -> { DeveloperSettingsEvent.DismissMarkAllRoomsAsReadConfirmation -> {
markAllRoomsAsReadAction.value = AsyncAction.Uninitialized markAllRoomsAsReadAction.value = AsyncAction.Uninitialized
} }
} }
@@ -23,7 +23,7 @@ data class DeveloperSettingsState(
val isEnterpriseBuild: Boolean, val isEnterpriseBuild: Boolean,
val showColorPicker: Boolean, val showColorPicker: Boolean,
val deviceId: DeviceId, val deviceId: DeviceId,
val eventSink: (DeveloperSettingsEvents) -> Unit val eventSink: (DeveloperSettingsEvent) -> Unit
) { ) {
val showLoader = clearCacheAction is AsyncAction.Loading || markAllRoomsAsReadAction is AsyncAction.Loading val showLoader = clearCacheAction is AsyncAction.Loading || markAllRoomsAsReadAction is AsyncAction.Loading
} }
@@ -42,7 +42,7 @@ fun aDeveloperSettingsState(
isEnterpriseBuild: Boolean = false, isEnterpriseBuild: Boolean = false,
showColorPicker: Boolean = false, showColorPicker: Boolean = false,
deviceId: DeviceId = DeviceId("ILAKNDNASDLK"), deviceId: DeviceId = DeviceId("ILAKNDNASDLK"),
eventSink: (DeveloperSettingsEvents) -> Unit = {}, eventSink: (DeveloperSettingsEvent) -> Unit = {},
) = DeveloperSettingsState( ) = DeveloperSettingsState(
appDeveloperSettingsState = appDeveloperSettingsState, appDeveloperSettingsState = appDeveloperSettingsState,
cacheSize = AsyncData.Success("1.2 MB"), cacheSize = AsyncData.Success("1.2 MB"),
@@ -56,8 +56,8 @@ fun DeveloperSettingsView(
title = "Are you sure you want to mark all the rooms as read?", title = "Are you sure you want to mark all the rooms as read?",
content = "", content = "",
submitText = stringResource(CommonStrings.action_yes), submitText = stringResource(CommonStrings.action_yes),
onSubmitClick = { state.eventSink(DeveloperSettingsEvents.MarkAllRoomsAsRead(needsConfirmation = false)) }, onSubmitClick = { state.eventSink(DeveloperSettingsEvent.MarkAllRoomsAsRead(needsConfirmation = false)) },
onDismiss = { state.eventSink(DeveloperSettingsEvents.DismissMarkAllRoomsAsReadConfirmation) }, onDismiss = { state.eventSink(DeveloperSettingsEvent.DismissMarkAllRoomsAsReadConfirmation) },
) )
} }
BackHandler( BackHandler(
@@ -89,7 +89,7 @@ fun DeveloperSettingsView(
Text("Change brand color") Text("Change brand color")
}, },
onClick = { onClick = {
state.eventSink(DeveloperSettingsEvents.SetShowColorPicker(true)) state.eventSink(DeveloperSettingsEvent.SetShowColorPicker(true))
} }
) )
ListItem( ListItem(
@@ -97,7 +97,7 @@ fun DeveloperSettingsView(
Text("Reset brand color") Text("Reset brand color")
}, },
onClick = { onClick = {
state.eventSink(DeveloperSettingsEvents.ChangeBrandColor(null)) state.eventSink(DeveloperSettingsEvent.ChangeBrandColor(null))
} }
) )
} }
@@ -131,7 +131,7 @@ fun DeveloperSettingsView(
Text("Vacuum stores") Text("Vacuum stores")
}, },
onClick = { onClick = {
state.eventSink(DeveloperSettingsEvents.VacuumStores) state.eventSink(DeveloperSettingsEvent.VacuumStores)
} }
) )
ListItem( ListItem(
@@ -152,7 +152,7 @@ fun DeveloperSettingsView(
}, },
onClick = { onClick = {
if (state.clearCacheAction.isLoading().not()) { if (state.clearCacheAction.isLoading().not()) {
state.eventSink(DeveloperSettingsEvents.ClearCache) state.eventSink(DeveloperSettingsEvent.ClearCache)
} }
} }
) )
@@ -164,10 +164,10 @@ fun DeveloperSettingsView(
showAlphaBar = false, showAlphaBar = false,
), ),
onDismissRequest = { onDismissRequest = {
state.eventSink(DeveloperSettingsEvents.SetShowColorPicker(false)) state.eventSink(DeveloperSettingsEvent.SetShowColorPicker(false))
}, },
onPickedColor = { onPickedColor = {
state.eventSink(DeveloperSettingsEvents.ChangeBrandColor(it)) state.eventSink(DeveloperSettingsEvent.ChangeBrandColor(it))
}, },
) )
} }
@@ -210,7 +210,7 @@ private fun MarkAllRoomsAsReadCategory(state: DeveloperSettingsState) {
}, },
enabled = !state.showLoader, enabled = !state.showLoader,
onClick = { onClick = {
state.eventSink(DeveloperSettingsEvents.MarkAllRoomsAsRead(needsConfirmation = true)) state.eventSink(DeveloperSettingsEvent.MarkAllRoomsAsRead(needsConfirmation = true))
}, },
) )
} }
@@ -88,7 +88,7 @@ class DeveloperSettingsPresenterTest {
skipItems(2) skipItems(2)
assertThat(clearCacheUseCase.executeHasBeenCalled).isFalse() assertThat(clearCacheUseCase.executeHasBeenCalled).isFalse()
awaitItem().also { state -> awaitItem().also { state ->
state.eventSink(DeveloperSettingsEvents.ClearCache) state.eventSink(DeveloperSettingsEvent.ClearCache)
} }
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.clearCacheAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.clearCacheAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -117,13 +117,13 @@ class DeveloperSettingsPresenterTest {
skipItems(1) skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.isEnterpriseBuild).isTrue() assertThat(initialState.isEnterpriseBuild).isTrue()
initialState.eventSink(DeveloperSettingsEvents.SetShowColorPicker(true)) initialState.eventSink(DeveloperSettingsEvent.SetShowColorPicker(true))
assertThat(awaitItem().showColorPicker).isTrue() assertThat(awaitItem().showColorPicker).isTrue()
initialState.eventSink(DeveloperSettingsEvents.SetShowColorPicker(false)) initialState.eventSink(DeveloperSettingsEvent.SetShowColorPicker(false))
assertThat(awaitItem().showColorPicker).isFalse() assertThat(awaitItem().showColorPicker).isFalse()
initialState.eventSink(DeveloperSettingsEvents.SetShowColorPicker(true)) initialState.eventSink(DeveloperSettingsEvent.SetShowColorPicker(true))
assertThat(awaitItem().showColorPicker).isTrue() assertThat(awaitItem().showColorPicker).isTrue()
initialState.eventSink(DeveloperSettingsEvents.ChangeBrandColor(Color.Green)) initialState.eventSink(DeveloperSettingsEvent.ChangeBrandColor(Color.Green))
assertThat(awaitItem().showColorPicker).isFalse() assertThat(awaitItem().showColorPicker).isFalse()
skipItems(1) skipItems(1)
overrideBrandColorResult.assertions().isCalledOnce() overrideBrandColorResult.assertions().isCalledOnce()
@@ -138,10 +138,10 @@ class DeveloperSettingsPresenterTest {
presenter.test { presenter.test {
skipItems(2) skipItems(2)
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(DeveloperSettingsEvents.MarkAllRoomsAsRead(needsConfirmation = true)) initialState.eventSink(DeveloperSettingsEvent.MarkAllRoomsAsRead(needsConfirmation = true))
val stateWithConfirmation = awaitItem() val stateWithConfirmation = awaitItem()
assertThat(stateWithConfirmation.markAllRoomsAsReadAction.isConfirming()).isTrue() assertThat(stateWithConfirmation.markAllRoomsAsReadAction.isConfirming()).isTrue()
stateWithConfirmation.eventSink(DeveloperSettingsEvents.MarkAllRoomsAsRead(needsConfirmation = false)) stateWithConfirmation.eventSink(DeveloperSettingsEvent.MarkAllRoomsAsRead(needsConfirmation = false))
awaitItem().also { state -> awaitItem().also { state ->
assertThat(state.markAllRoomsAsReadAction.isConfirming()).isFalse() assertThat(state.markAllRoomsAsReadAction.isConfirming()).isFalse()
assertThat(state.markAllRoomsAsReadAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(state.markAllRoomsAsReadAction).isInstanceOf(AsyncAction.Loading::class.java)
@@ -164,7 +164,7 @@ class DeveloperSettingsPresenterTest {
presenter.test { presenter.test {
val state = awaitItem() val state = awaitItem()
assertThat(vacuumCalled).isFalse() assertThat(vacuumCalled).isFalse()
state.eventSink(DeveloperSettingsEvents.VacuumStores) state.eventSink(DeveloperSettingsEvent.VacuumStores)
skipItems(1) skipItems(1)
assertThat(vacuumCalled).isTrue() assertThat(vacuumCalled).isTrue()
} }
@@ -30,7 +30,7 @@ import org.robolectric.annotation.Config
class DeveloperSettingsViewTest : RobolectricTest() { class DeveloperSettingsViewTest : RobolectricTest() {
@Test @Test
fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on back invokes the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<DeveloperSettingsEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setDeveloperSettingsView( setDeveloperSettingsView(
state = aDeveloperSettingsState( state = aDeveloperSettingsState(
@@ -45,7 +45,7 @@ class DeveloperSettingsViewTest : RobolectricTest() {
@Config(qualifiers = "h2400dp") @Config(qualifiers = "h2400dp")
@Test @Test
fun `clicking on push history notification invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on push history notification invokes the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<DeveloperSettingsEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setDeveloperSettingsView( setDeveloperSettingsView(
state = aDeveloperSettingsState( state = aDeveloperSettingsState(
@@ -60,7 +60,7 @@ class DeveloperSettingsViewTest : RobolectricTest() {
@Config(qualifiers = "h2000dp") @Config(qualifiers = "h2000dp")
@Test @Test
fun `clicking on open showkase invokes the expected callback`() = runAndroidComposeUiTest { fun `clicking on open showkase invokes the expected callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<DeveloperSettingsEvent>(expectEvents = false)
ensureCalledOnce { ensureCalledOnce {
setDeveloperSettingsView( setDeveloperSettingsView(
state = aDeveloperSettingsState( state = aDeveloperSettingsState(
@@ -75,14 +75,14 @@ class DeveloperSettingsViewTest : RobolectricTest() {
@Config(qualifiers = "h2400dp") @Config(qualifiers = "h2400dp")
@Test @Test
fun `clicking on clear cache emits the expected event`() = runAndroidComposeUiTest { fun `clicking on clear cache emits the expected event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<DeveloperSettingsEvents>() val eventsRecorder = EventsRecorder<DeveloperSettingsEvent>()
setDeveloperSettingsView( setDeveloperSettingsView(
state = aDeveloperSettingsState( state = aDeveloperSettingsState(
eventSink = eventsRecorder eventSink = eventsRecorder
), ),
) )
onNodeWithText("Clear cache").performScrollTo().performClick() onNodeWithText("Clear cache").performScrollTo().performClick()
eventsRecorder.assertSingle(DeveloperSettingsEvents.ClearCache) eventsRecorder.assertSingle(DeveloperSettingsEvent.ClearCache)
} }
} }