Space announcement: iterate on wording.

This commit is contained in:
Benoit Marty 2025-10-03 15:11:55 +02:00
parent 4660fe428d
commit bfcd926bd1
6 changed files with 10 additions and 45 deletions

View file

@ -13,12 +13,10 @@ import dev.zacsweers.metro.Inject
import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.AnnouncementStore
import io.element.android.features.announcement.impl.store.AnnouncementStore.SpaceAnnouncement import io.element.android.features.announcement.impl.store.AnnouncementStore.SpaceAnnouncement
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildMeta
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Inject @Inject
class SpaceAnnouncementPresenter( class SpaceAnnouncementPresenter(
private val buildMeta: BuildMeta,
private val announcementStore: AnnouncementStore, private val announcementStore: AnnouncementStore,
) : Presenter<SpaceAnnouncementState> { ) : Presenter<SpaceAnnouncementState> {
@Composable @Composable
@ -34,8 +32,6 @@ class SpaceAnnouncementPresenter(
} }
return SpaceAnnouncementState( return SpaceAnnouncementState(
applicationName = buildMeta.applicationName,
desktopApplicationName = buildMeta.desktopApplicationName,
eventSink = ::handleEvents eventSink = ::handleEvents
) )
} }

View file

@ -8,7 +8,5 @@
package io.element.android.features.announcement.impl.spaces package io.element.android.features.announcement.impl.spaces
data class SpaceAnnouncementState( data class SpaceAnnouncementState(
val applicationName: String,
val desktopApplicationName: String,
val eventSink: (SpaceAnnouncementEvents) -> Unit val eventSink: (SpaceAnnouncementEvents) -> Unit
) )

View file

@ -17,11 +17,7 @@ open class SpaceAnnouncementStateProvider : PreviewParameterProvider<SpaceAnnoun
} }
fun aSpaceAnnouncementState( fun aSpaceAnnouncementState(
applicationName: String = "Element",
desktopApplicationName: String = "Element",
eventSink: (SpaceAnnouncementEvents) -> Unit = {}, eventSink: (SpaceAnnouncementEvents) -> Unit = {},
) = SpaceAnnouncementState( ) = SpaceAnnouncementState(
applicationName = applicationName,
desktopApplicationName = desktopApplicationName,
eventSink = eventSink, eventSink = eventSink,
) )

View file

@ -55,11 +55,10 @@ fun SpaceAnnouncementView(
isScrollable = true, isScrollable = true,
contentPadding = PaddingValues(top = 24.dp, start = 16.dp, end = 16.dp, bottom = 24.dp), contentPadding = PaddingValues(top = 24.dp, start = 16.dp, end = 16.dp, bottom = 24.dp),
header = { header = {
SpaceAnnouncementHeader(state = state) SpaceAnnouncementHeader()
}, },
content = { content = {
SpaceAnnouncementContent( SpaceAnnouncementContent(
state = state,
modifier = Modifier.padding(horizontal = 8.dp), modifier = Modifier.padding(horizontal = 8.dp),
) )
}, },
@ -73,17 +72,13 @@ fun SpaceAnnouncementView(
@Composable @Composable
private fun SpaceAnnouncementHeader( private fun SpaceAnnouncementHeader(
state: SpaceAnnouncementState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
IconTitleSubtitleMolecule( IconTitleSubtitleMolecule(
modifier = modifier.padding(top = 16.dp, bottom = 16.dp), modifier = modifier.padding(top = 16.dp, bottom = 16.dp),
title = stringResource(id = R.string.screen_space_announcement_title), title = stringResource(id = R.string.screen_space_announcement_title),
showBetaLabel = true, showBetaLabel = true,
subTitle = stringResource( subTitle = stringResource(id = R.string.screen_space_announcement_subtitle),
id = R.string.screen_space_announcement_subtitle,
state.applicationName
),
iconStyle = BigIcon.Style.Default( iconStyle = BigIcon.Style.Default(
vectorIcon = CompoundIcons.WorkspaceSolid(), vectorIcon = CompoundIcons.WorkspaceSolid(),
usePrimaryTint = true, usePrimaryTint = true,
@ -93,7 +88,6 @@ private fun SpaceAnnouncementHeader(
@Composable @Composable
private fun SpaceAnnouncementContent( private fun SpaceAnnouncementContent(
state: SpaceAnnouncementState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Column( Column(
@ -103,7 +97,7 @@ private fun SpaceAnnouncementContent(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
items = persistentListOf( items = persistentListOf(
InfoListItem( InfoListItem(
message = stringResource(id = R.string.screen_space_announcement_item1, state.desktopApplicationName), message = stringResource(id = R.string.screen_space_announcement_item1),
iconVector = CompoundIcons.VisibilityOn(), iconVector = CompoundIcons.VisibilityOn(),
), ),
InfoListItem( InfoListItem(
@ -116,11 +110,11 @@ private fun SpaceAnnouncementContent(
), ),
InfoListItem( InfoListItem(
message = stringResource(id = R.string.screen_space_announcement_item4), message = stringResource(id = R.string.screen_space_announcement_item4),
iconVector = CompoundIcons.Leave(), iconVector = CompoundIcons.Explore(),
), ),
InfoListItem( InfoListItem(
message = stringResource(id = R.string.screen_space_announcement_item5), message = stringResource(id = R.string.screen_space_announcement_item5),
iconVector = CompoundIcons.Explore(), iconVector = CompoundIcons.Leave(),
), ),
), ),
textStyle = ElementTheme.typography.fontBodyLgMedium, textStyle = ElementTheme.typography.fontBodyLgMedium,

View file

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"View spaces youve created or joined on %1$s desktop"</string> <string name="screen_space_announcement_item1">"View spaces you\'ve created or joined"</string>
<string name="screen_space_announcement_item2">"Accept or decline invites to spaces"</string> <string name="screen_space_announcement_item2">"Accept or decline invites to spaces"</string>
<string name="screen_space_announcement_item3">"Discover any rooms you can join in your spaces"</string> <string name="screen_space_announcement_item3">"Discover any rooms you can join in your spaces"</string>
<string name="screen_space_announcement_item4">"Leave any spaces youve joined"</string> <string name="screen_space_announcement_item4">"Join public spaces"</string>
<string name="screen_space_announcement_item5">"Join public spaces"</string> <string name="screen_space_announcement_item5">"Leave any spaces youve joined"</string>
<string name="screen_space_announcement_notice">"More features will be added in the future, such as creating or managing spaces on mobile."</string> <string name="screen_space_announcement_notice">"Creating and managing spaces is coming soon."</string>
<string name="screen_space_announcement_subtitle">"Welcome to the beta version of Spaces on %1$s mobile! With this first version you can:"</string> <string name="screen_space_announcement_subtitle">"Welcome to the beta version of Spaces! With this first version you can:"</string>
<string name="screen_space_announcement_title">"Introducing Spaces"</string> <string name="screen_space_announcement_title">"Introducing Spaces"</string>
</resources> </resources>

View file

@ -10,26 +10,12 @@ package io.element.android.features.announcement.impl.spaces
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.features.announcement.impl.store.AnnouncementStore import io.element.android.features.announcement.impl.store.AnnouncementStore
import io.element.android.features.announcement.impl.store.InMemoryAnnouncementStore import io.element.android.features.announcement.impl.store.InMemoryAnnouncementStore
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.matrix.test.AN_APPLICATION_NAME
import io.element.android.libraries.matrix.test.AN_APPLICATION_NAME_DESKTOP
import io.element.android.libraries.matrix.test.core.aBuildMeta
import io.element.android.tests.testutils.test import io.element.android.tests.testutils.test
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
class SpaceAnnouncementPresenterTest { class SpaceAnnouncementPresenterTest {
@Test
fun `present - initial state`() = runTest {
val presenter = createSpaceAnnouncementPresenter()
presenter.test {
val state = awaitItem()
assertThat(state.applicationName).isEqualTo(AN_APPLICATION_NAME)
assertThat(state.desktopApplicationName).isEqualTo(AN_APPLICATION_NAME_DESKTOP)
}
}
@Test @Test
fun `present - when user continues, the store is updated`() = runTest { fun `present - when user continues, the store is updated`() = runTest {
val store = InMemoryAnnouncementStore() val store = InMemoryAnnouncementStore()
@ -46,12 +32,7 @@ class SpaceAnnouncementPresenterTest {
} }
private fun createSpaceAnnouncementPresenter( private fun createSpaceAnnouncementPresenter(
buildMeta: BuildMeta = aBuildMeta(
applicationName = AN_APPLICATION_NAME,
desktopApplicationName = AN_APPLICATION_NAME_DESKTOP,
),
announcementStore: AnnouncementStore = InMemoryAnnouncementStore(), announcementStore: AnnouncementStore = InMemoryAnnouncementStore(),
) = SpaceAnnouncementPresenter( ) = SpaceAnnouncementPresenter(
buildMeta = buildMeta,
announcementStore = announcementStore, announcementStore = announcementStore,
) )