Merge branch 'develop' into fix/6371-save-file-name-conflicts

This commit is contained in:
Benoit Marty
2026-08-24 18:14:03 +02:00
committed by GitHub
478 changed files with 987 additions and 842 deletions
+2 -2
View File
@@ -37,7 +37,7 @@ PRs must meet these rules.
- Create previews for **all main states** of a Composable. - Create previews for **all main states** of a Composable.
- Use `@PreviewsDayNight` for consistency. - Use `@PreviewsDayNight` for consistency.
- Use `PreviewParameterProvider` (e.g., `FooStateProvider`) to provide states. - Use `PreviewParameterProvider` (e.g., `FooStatePreviewParam`) to provide states.
- Wrap previews in `ElementPreview { ... }`. - Wrap previews in `ElementPreview { ... }`.
- When writing tests, never try to record the screenshots, the CI will do it. - When writing tests, never try to record the screenshots, the CI will do it.
@@ -89,7 +89,7 @@ We use [Appyx](https://bumble-tech.github.io/appyx/) for navigation and [Molecul
| `FooView.kt` | Stateless Composable rendering the UI from `FooState`. | | `FooView.kt` | Stateless Composable rendering the UI from `FooState`. |
| `FooState.kt` | Data class representing the immutable UI state. | | `FooState.kt` | Data class representing the immutable UI state. |
| `FooEvent.kt` | Sealed interface for UI actions sent to the Presenter. | | `FooEvent.kt` | Sealed interface for UI actions sent to the Presenter. |
| `FooStateProvider.kt` | Provides sample states for Previews and Screenshot tests. | | `FooStatePreviewParam.kt` | Provides sample states for Previews and Screenshot tests. |
| `FooPresenterTest.kt` | Unit tests for the Presenter logic using Turbine. | | `FooPresenterTest.kt` | Unit tests for the Presenter logic using Turbine. |
--- ---
@@ -14,16 +14,16 @@ import kotlin.reflect.KClass
* Adds Node to the specified component graph. * Adds Node to the specified component graph.
* Equivalent to the following declaration: * Equivalent to the following declaration:
* *
* ```
* @BindingContainer * @BindingContainer
* @ContributesTo(Scope::class) * @ContributesTo(Scope::class)
* abstract class YourNodeModule { * interface YourNodeBindingContainer {
* @Binds
* @Binds * @IntoMap
* @IntoMap * @NodeKey(YourNode::class)
* @NodeKey(YourNode::class) * fun bindYourNodeAssistedFactory(factory: YourNodeAssistedFactory): AssistedNodeFactory<*>
* abstract fun bindYourNodeFactory(factory: YourNode.Factory): AssistedNodeFactory<*> * }
*} * ```
*/ */
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
annotation class ContributesNode( annotation class ContributesNode(
@@ -38,7 +38,7 @@ import java.io.File
@BindingContainer @BindingContainer
@ContributesTo(AppScope::class) @ContributesTo(AppScope::class)
object AppModule { object AppBindingContainer {
@Provides @Provides
@BaseDirectory @BaseDirectory
fun providesBaseDirectory(@ApplicationContext context: Context): File { fun providesBaseDirectory(@ApplicationContext context: Context): File {
@@ -111,7 +111,7 @@ object AppModule {
@Provides @Provides
@SingleIn(AppScope::class) @SingleIn(AppScope::class)
fun provideSnackbarDispatcher(): SnackbarDispatcher { fun providesSnackbarDispatcher(): SnackbarDispatcher {
return SnackbarDispatcher() return SnackbarDispatcher()
} }
} }
@@ -30,8 +30,6 @@ import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.encryption.RecoveryState import io.element.android.libraries.matrix.api.encryption.RecoveryState
@@ -67,7 +65,6 @@ class LoggedInPresenter(
private val buildMeta: BuildMeta, private val buildMeta: BuildMeta,
private val networkMonitor: NetworkMonitor, private val networkMonitor: NetworkMonitor,
private val localNetworkPermissionAdvisor: LocalNetworkPermissionAdvisor, private val localNetworkPermissionAdvisor: LocalNetworkPermissionAdvisor,
private val featureFlagService: FeatureFlagService,
permissionsPresenterFactory: PermissionsPresenter.Factory, permissionsPresenterFactory: PermissionsPresenter.Factory,
) : Presenter<LoggedInState> { ) : Presenter<LoggedInState> {
private val localNetworkPermissionsPresenter: PermissionsPresenter = private val localNetworkPermissionsPresenter: PermissionsPresenter =
@@ -124,13 +121,9 @@ class LoggedInPresenter(
} }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
// Keep automatic call status (m.call) in sync with the feature flag and homeserver support. // Keep automatic call status (m.call) in sync with homeserver support.
featureFlagService.isFeatureEnabledFlow(FeatureFlags.UserStatus) val enabled = matrixClient.isUserStatusSupported().getOrDefault(false)
.onEach { isUserStatusEnabled -> matrixClient.enableAutomaticCallStatus(enabled)
val enabled = isUserStatusEnabled && matrixClient.isUserStatusSupported().getOrDefault(false)
matrixClient.enableAutomaticCallStatus(enabled)
}
.launchIn(this)
} }
val networkConnectivity by networkMonitor.connectivity.collectAsState() val networkConnectivity by networkMonitor.connectivity.collectAsState()
@@ -13,7 +13,7 @@ import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.permissions.api.localnetwork.LocalNetworkPermissionDialog import io.element.android.libraries.permissions.api.localnetwork.LocalNetworkPermissionDialog
import io.element.android.libraries.push.api.PusherRegistrationFailure import io.element.android.libraries.push.api.PusherRegistrationFailure
open class LoggedInStateProvider : PreviewParameterProvider<LoggedInState> { open class LoggedInStatePreviewParam : PreviewParameterProvider<LoggedInState> {
override val values: Sequence<LoggedInState> override val values: Sequence<LoggedInState>
get() = sequenceOf( get() = sequenceOf(
aLoggedInState(), aLoggedInState(),
@@ -124,7 +124,7 @@ private fun ForceNativeSlidingSyncMigrationDialog(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun LoggedInViewPreview(@PreviewParameter(LoggedInStateProvider::class) state: LoggedInState) = ElementPreview { internal fun LoggedInViewPreview(@PreviewParameter(LoggedInStatePreviewParam::class) state: LoggedInState) = ElementPreview {
LoggedInView( LoggedInView(
state = state, state = state,
navigateToNotificationTroubleshoot = {}, navigateToNotificationTroubleshoot = {},
@@ -29,7 +29,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.designsystem.utils.DelayedVisibility import io.element.android.libraries.designsystem.utils.DelayedVisibility
import io.element.android.libraries.matrix.ui.room.LoadingRoomState import io.element.android.libraries.matrix.ui.room.LoadingRoomState
import io.element.android.libraries.matrix.ui.room.LoadingRoomStateProvider import io.element.android.libraries.matrix.ui.room.LoadingRoomStatePreviewParam
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
@@ -84,7 +84,7 @@ private fun LoadingRoomTopBar(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun LoadingRoomNodeViewPreview(@PreviewParameter(LoadingRoomStateProvider::class) state: LoadingRoomState) = ElementPreview { internal fun LoadingRoomNodeViewPreview(@PreviewParameter(LoadingRoomStatePreviewParam::class) state: LoadingRoomState) = ElementPreview {
LoadingRoomNodeView( LoadingRoomNodeView(
state = state, state = state,
onBackClick = {} onBackClick = {}
@@ -14,7 +14,7 @@ import io.element.android.features.rageshake.api.detection.aRageshakeDetectionSt
import io.element.android.services.apperror.api.AppErrorState import io.element.android.services.apperror.api.AppErrorState
import io.element.android.services.apperror.api.aAppErrorState import io.element.android.services.apperror.api.aAppErrorState
open class RootStateProvider : PreviewParameterProvider<RootState> { open class RootStatePreviewParam : PreviewParameterProvider<RootState> {
override val values: Sequence<RootState> override val values: Sequence<RootState>
get() = sequenceOf( get() = sequenceOf(
aRootState().copy( aRootState().copy(
@@ -60,7 +60,7 @@ fun RootView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RootViewPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview { internal fun RootViewPreview(@PreviewParameter(RootStatePreviewParam::class) rootState: RootState) = ElementPreview {
RootView( RootView(
state = rootState, state = rootState,
onOpenBugReport = {}, onOpenBugReport = {},
@@ -17,9 +17,6 @@ import im.vector.app.features.analytics.plan.UserProperties
import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.networkmonitor.api.NetworkStatus
import io.element.android.features.networkmonitor.test.FakeNetworkMonitor import io.element.android.features.networkmonitor.test.FakeNetworkMonitor
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.EncryptionService
@@ -131,7 +128,6 @@ class LoggedInPresenterTest {
buildMeta = buildMeta, buildMeta = buildMeta,
networkMonitor = networkMonitor, networkMonitor = networkMonitor,
localNetworkPermissionAdvisor = FakeLocalNetworkPermissionAdvisor(), localNetworkPermissionAdvisor = FakeLocalNetworkPermissionAdvisor(),
featureFlagService = FakeFeatureFlagService(),
permissionsPresenterFactory = FakePermissionsPresenterFactory(), permissionsPresenterFactory = FakePermissionsPresenterFactory(),
).test { ).test {
encryptionService.emitRecoveryState(RecoveryState.UNKNOWN) encryptionService.emitRecoveryState(RecoveryState.UNKNOWN)
@@ -362,9 +358,6 @@ class LoggedInPresenterTest {
} }
createLoggedInPresenter( createLoggedInPresenter(
matrixClient = matrixClient, matrixClient = matrixClient,
featureFlagService = FakeFeatureFlagService(
initialState = mapOf(FeatureFlags.UserStatus.key to true),
),
).test { ).test {
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()
assert(enableAutomaticCallStatusLambda) assert(enableAutomaticCallStatusLambda)
@@ -374,7 +367,7 @@ class LoggedInPresenterTest {
} }
@Test @Test
fun `present - reacts to user status flag being toggled at runtime`() = runTest { fun `present - enables automatic call status when server supports it`() = runTest {
val enableAutomaticCallStatusLambda = lambdaRecorder<Boolean, Unit> { } val enableAutomaticCallStatusLambda = lambdaRecorder<Boolean, Unit> { }
val matrixClient = FakeMatrixClient( val matrixClient = FakeMatrixClient(
accountManagementUrlResult = { Result.success(null) }, accountManagementUrlResult = { Result.success(null) },
@@ -382,23 +375,13 @@ class LoggedInPresenterTest {
).apply { ).apply {
isUserStatusSupportedResult = Result.success(true) isUserStatusSupportedResult = Result.success(true)
} }
val featureFlagService = FakeFeatureFlagService(
initialState = mapOf(FeatureFlags.UserStatus.key to false),
)
createLoggedInPresenter( createLoggedInPresenter(
matrixClient = matrixClient, matrixClient = matrixClient,
featureFlagService = featureFlagService,
).test { ).test {
awaitItem()
// Turning the flag on at runtime enables it.
featureFlagService.setFeatureEnabled(FeatureFlags.UserStatus, true)
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()
assert(enableAutomaticCallStatusLambda) assert(enableAutomaticCallStatusLambda)
.isCalledExactly(2) .isCalledOnce()
.withSequence( .with(value(true))
listOf(value(false)),
listOf(value(true)),
)
} }
} }
@@ -418,7 +401,6 @@ class LoggedInPresenterTest {
), ),
buildMeta: BuildMeta = aBuildMeta(), buildMeta: BuildMeta = aBuildMeta(),
networkMonitor: FakeNetworkMonitor = FakeNetworkMonitor(), networkMonitor: FakeNetworkMonitor = FakeNetworkMonitor(),
featureFlagService: FeatureFlagService = FakeFeatureFlagService(),
): LoggedInPresenter { ): LoggedInPresenter {
return LoggedInPresenter( return LoggedInPresenter(
matrixClient = matrixClient, matrixClient = matrixClient,
@@ -430,7 +412,6 @@ class LoggedInPresenterTest {
buildMeta = buildMeta, buildMeta = buildMeta,
networkMonitor = networkMonitor, networkMonitor = networkMonitor,
localNetworkPermissionAdvisor = FakeLocalNetworkPermissionAdvisor(), localNetworkPermissionAdvisor = FakeLocalNetworkPermissionAdvisor(),
featureFlagService = featureFlagService,
permissionsPresenterFactory = FakePermissionsPresenterFactory(), permissionsPresenterFactory = FakePermissionsPresenterFactory(),
) )
} }
@@ -61,32 +61,32 @@ class ContributesNodeProcessor(
if (config.enableLogging) { if (config.enableLogging) {
logger.warn("Processing ${ksClass.qualifiedName?.asString()}") logger.warn("Processing ${ksClass.qualifiedName?.asString()}")
} }
generateModule(ksClass) generateBindingContainer(ksClass)
generateFactory(ksClass) generateFactory(ksClass)
} }
return invalidSymbols return invalidSymbols
} }
private fun generateModule(ksClass: KSClassDeclaration) { private fun generateBindingContainer(ksClass: KSClassDeclaration) {
val annotation = ksClass.annotations.find { it.shortName.asString() == "ContributesNode" }!! val annotation = ksClass.annotations.find { it.shortName.asString() == "ContributesNode" }!!
val scope = annotation.arguments.find { it.name?.asString() == "scope" }!!.value as KSType val scope = annotation.arguments.find { it.name?.asString() == "scope" }!!.value as KSType
val modulePackage = ksClass.packageName.asString() val bindingContainerPackage = ksClass.packageName.asString()
val moduleClassName = "${ksClass.simpleName.asString()}_Module" val bindingContainerClassName = "${ksClass.simpleName.asString()}BindingContainer"
val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString()) val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString())
val content = FileSpec.builder( val content = FileSpec.builder(
packageName = modulePackage, packageName = bindingContainerPackage,
fileName = moduleClassName, fileName = bindingContainerClassName,
) )
.addType( .addType(
TypeSpec.interfaceBuilder(moduleClassName) TypeSpec.interfaceBuilder(bindingContainerClassName)
.addAnnotation(AnnotationSpec.builder(Origin::class).addMember(CLASS_PLACEHOLDER, nodeClassName).build()) .addAnnotation(AnnotationSpec.builder(Origin::class).addMember(CLASS_PLACEHOLDER, nodeClassName).build())
.addAnnotation(BindingContainer::class) .addAnnotation(BindingContainer::class)
.addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember(CLASS_PLACEHOLDER, scope.toTypeName()).build()) .addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember(CLASS_PLACEHOLDER, scope.toTypeName()).build())
.addFunction( .addFunction(
FunSpec.builder("bind${ksClass.simpleName.asString()}Factory") FunSpec.builder("bind${ksClass.simpleName.asString()}AssistedFactory")
.addModifiers(KModifier.ABSTRACT) .addModifiers(KModifier.ABSTRACT)
.addParameter("factory", ClassName(modulePackage, "${ksClass.simpleName.asString()}_AssistedFactory")) .addParameter("factory", ClassName(bindingContainerPackage, "${ksClass.simpleName.asString()}AssistedFactory"))
.returns(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(STAR)) .returns(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(STAR))
.addAnnotation(Binds::class) .addAnnotation(Binds::class)
.addAnnotation(IntoMap::class) .addAnnotation(IntoMap::class)
@@ -114,7 +114,7 @@ class ContributesNodeProcessor(
@OptIn(KspExperimental::class) @OptIn(KspExperimental::class)
private fun generateFactory(ksClass: KSClassDeclaration) { private fun generateFactory(ksClass: KSClassDeclaration) {
val generatedPackage = ksClass.packageName.asString() val generatedPackage = ksClass.packageName.asString()
val assistedFactoryClassName = "${ksClass.simpleName.asString()}_AssistedFactory" val assistedFactoryClassName = "${ksClass.simpleName.asString()}AssistedFactory"
val constructor = ksClass.getConstructors().first { it.parameters.isNotEmpty() } val constructor = ksClass.getConstructors().first { it.parameters.isNotEmpty() }
val assistedParameters = constructor.parameters.filter { it.isAnnotationPresent(Assisted::class) } val assistedParameters = constructor.parameters.filter { it.isAnnotationPresent(Assisted::class) }
if (assistedParameters.size != 2) { if (assistedParameters.size != 2) {
+4 -4
View File
@@ -322,10 +322,10 @@ Example for a new feature called RoomDetails:
4. Verify that the structure looks ok and click on Finish 4. Verify that the structure looks ok and click on Finish
5. The modules api/impl should be created under `features/roomdetails` directory. 5. The modules api/impl should be created under `features/roomdetails` directory.
6. Sync project with Gradle so the modules are recognized (no need to add them to settings.gradle). 6. Sync project with Gradle so the modules are recognized (no need to add them to settings.gradle).
7. You can now add more Presentation classes (Events, State, StateProvider, View, Presenter) in the impl module with the `Template Presentation Classes`. 7. You can now add more Presentation classes (Events, State, StatePreviewParam, View, Presenter) in the impl module with the `Template Presentation Classes`.
To use it, just right click on the package where you want to generate classes, and click on `New` / `Template Presentation Classes`. To use it, just right click on the package where you want to generate classes, and click on `New` / `Template Presentation Classes`.
Fill the text field with the base name of the classes: the generated files are `<BaseName>Event.kt`, `<BaseName>State.kt`, Fill the text field with the base name of the classes: the generated files are `<BaseName>Event.kt`, `<BaseName>State.kt`,
`<BaseName>StateProvider.kt`, `<BaseName>Presenter.kt`, `<BaseName>Node.kt` and `<BaseName>View.kt`. For instance `<BaseName>StatePreviewParam.kt`, `<BaseName>Presenter.kt`, `<BaseName>Node.kt` and `<BaseName>View.kt`. For instance
`PreferencesRoot` in the `features/preferences/impl/root` package. `PreferencesRoot` in the `features/preferences/impl/root` package.
@@ -360,9 +360,9 @@ We have 3 tests frameworks in place, and this should be sufficient to guarantee
- Maestro to test the global usage of the application. See the related [documentation](../.maestro/README.md). - Maestro to test the global usage of the application. See the related [documentation](../.maestro/README.md).
- Combination of [Showkase](https://github.com/airbnb/Showkase) and [Paparazzi](https://github.com/cashapp/paparazzi), to test UI pixel perfect. To add test, - Combination of [Showkase](https://github.com/airbnb/Showkase) and [Paparazzi](https://github.com/cashapp/paparazzi), to test UI pixel perfect. To add test,
just add `@Preview` for the composable you are adding. See the related [documentation](screenshot_testing.md) and see in the template the just add `@Preview` for the composable you are adding. See the related [documentation](screenshot_testing.md) and see in the template the
file [TemplateView.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateView.kt). We create PreviewProvider to provide file [TemplateView.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateView.kt). We create PreviewParam classes to provide
different states. See for instance the different states. See for instance the
file [TemplateStateProvider.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateStateProvider.kt) file [TemplateStatePreviewParam.kt](../features/template/src/main/kotlin/io/element/android/features/template/TemplateStatePreviewParam.kt)
- Tests on presenter with [Molecule](https://github.com/cashapp/molecule) and [Turbine](https://github.com/cashapp/turbine). See in the template the class [TemplatePresenterTests](../features/template/src/test/kotlin/io/element/android/features/template/TemplatePresenterTests.kt). - Tests on presenter with [Molecule](https://github.com/cashapp/molecule) and [Turbine](https://github.com/cashapp/turbine). See in the template the class [TemplatePresenterTests](../features/template/src/test/kotlin/io/element/android/features/template/TemplatePresenterTests.kt).
**Note** For now we want to avoid using class mocking (with library such as *mockk*), because this should be not necessary. We prefer to create Fake **Note** For now we want to avoid using class mocking (with library such as *mockk*), because this should be not necessary. We prefer to create Fake
@@ -10,7 +10,7 @@ package io.element.android.features.analytics.api.preferences
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
open class AnalyticsPreferencesStateProvider : PreviewParameterProvider<AnalyticsPreferencesState> { open class AnalyticsPreferencesStatePreviewParam : PreviewParameterProvider<AnalyticsPreferencesState> {
override val values: Sequence<AnalyticsPreferencesState> override val values: Sequence<AnalyticsPreferencesState>
get() = sequenceOf( get() = sequenceOf(
aAnalyticsPreferencesState().copy(isEnabled = true), aAnalyticsPreferencesState().copy(isEnabled = true),
@@ -66,7 +66,7 @@ fun AnalyticsPreferencesView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AnalyticsPreferencesViewPreview(@PreviewParameter(AnalyticsPreferencesStateProvider::class) state: AnalyticsPreferencesState) = internal fun AnalyticsPreferencesViewPreview(@PreviewParameter(AnalyticsPreferencesStatePreviewParam::class) state: AnalyticsPreferencesState) =
ElementPreview { ElementPreview {
AnalyticsPreferencesView( AnalyticsPreferencesView(
state = state, state = state,
@@ -10,7 +10,7 @@ package io.element.android.features.analytics.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
open class AnalyticsOptInStateProvider : PreviewParameterProvider<AnalyticsOptInState> { open class AnalyticsOptInStatePreviewParam : PreviewParameterProvider<AnalyticsOptInState> {
override val values: Sequence<AnalyticsOptInState> override val values: Sequence<AnalyticsOptInState>
get() = sequenceOf( get() = sequenceOf(
aAnalyticsOptInState(), aAnalyticsOptInState(),
@@ -171,7 +171,7 @@ private fun AnalyticsOptInFooter(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AnalyticsOptInViewPreview(@PreviewParameter(AnalyticsOptInStateProvider::class) state: AnalyticsOptInState) = ElementPreview { internal fun AnalyticsOptInViewPreview(@PreviewParameter(AnalyticsOptInStatePreviewParam::class) state: AnalyticsOptInState) = ElementPreview {
AnalyticsOptInView( AnalyticsOptInView(
state = state, state = state,
onClickTerms = {}, onClickTerms = {},
@@ -18,7 +18,7 @@ import io.element.android.libraries.architecture.Presenter
@ContributesTo(AppScope::class) @ContributesTo(AppScope::class)
@BindingContainer @BindingContainer
interface AnalyticsModule { interface AnalyticsBindingContainer {
@Binds @Binds
fun bindAnalyticsPreferencesPresenter(presenter: AnalyticsPreferencesPresenter): Presenter<AnalyticsPreferencesState> fun bindAnalyticsPreferencesPresenter(presenter: AnalyticsPreferencesPresenter): Presenter<AnalyticsPreferencesState>
} }
@@ -11,7 +11,7 @@ package io.element.android.features.announcement.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.Announcement
open class AnnouncementStateProvider : PreviewParameterProvider<AnnouncementState> { open class AnnouncementStatePreviewParam : PreviewParameterProvider<AnnouncementState> {
override val values: Sequence<AnnouncementState> override val values: Sequence<AnnouncementState>
get() = sequenceOf( get() = sequenceOf(
anAnnouncementState(), anAnnouncementState(),
@@ -33,7 +33,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.announcement.api.Announcement import io.element.android.features.announcement.api.Announcement
import io.element.android.features.announcement.impl.AnnouncementEvent import io.element.android.features.announcement.impl.AnnouncementEvent
import io.element.android.features.announcement.impl.AnnouncementState import io.element.android.features.announcement.impl.AnnouncementState
import io.element.android.features.announcement.impl.AnnouncementStateProvider import io.element.android.features.announcement.impl.AnnouncementStatePreviewParam
import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule
import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule
import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage
@@ -216,7 +216,7 @@ private fun Announcement.Fullscreen.notice(): String? = when (this) {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun FullscreenAnnouncementViewPreview(@PreviewParameter(AnnouncementStateProvider::class) state: AnnouncementState) = ElementPreview { internal fun FullscreenAnnouncementViewPreview(@PreviewParameter(AnnouncementStatePreviewParam::class) state: AnnouncementState) = ElementPreview {
FullscreenAnnouncementView( FullscreenAnnouncementView(
state = state, state = state,
) )
@@ -60,7 +60,9 @@ class PictureInPicturePresenter(
} }
is PictureInPictureEvent.SetPipOrientation -> { is PictureInPictureEvent.SetPipOrientation -> {
Timber.tag(loggerTag.value).d("onOrientationChange: ${event.orientation}") Timber.tag(loggerTag.value).d("onOrientationChange: ${event.orientation}")
pipView?.setPipOrientation(event.orientation) if (isPipSupported) {
pipView?.setPipOrientation(event.orientation)
}
} }
} }
} }
@@ -8,9 +8,15 @@
package io.element.android.features.call.impl.pip package io.element.android.features.call.impl.pip
import android.os.Build
import androidx.annotation.RequiresApi
interface PipView { interface PipView {
@RequiresApi(Build.VERSION_CODES.O)
fun setPipOrientation(orientation: Int?) fun setPipOrientation(orientation: Int?)
@RequiresApi(Build.VERSION_CODES.O)
fun setPipParams() fun setPipParams()
@RequiresApi(Build.VERSION_CODES.O)
fun enterPipMode(): Boolean fun enterPipMode(): Boolean
fun hangUp() fun hangUp()
} }
@@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
open class CallNotificationDataProvider : PreviewParameterProvider<CallNotificationData> { open class CallNotificationDataPreviewParam : PreviewParameterProvider<CallNotificationData> {
override val values: Sequence<CallNotificationData> override val values: Sequence<CallNotificationData>
get() = sequenceOf( get() = sequenceOf(
aCallNotificationData( aCallNotificationData(
@@ -11,7 +11,7 @@ package io.element.android.features.call.impl.ui
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
open class CallScreenStateProvider : PreviewParameterProvider<CallScreenState> { open class CallScreenStatePreviewParam : PreviewParameterProvider<CallScreenState> {
override val values: Sequence<CallScreenState> override val values: Sequence<CallScreenState>
get() = sequenceOf( get() = sequenceOf(
aCallScreenState(), aCallScreenState(),
@@ -266,7 +266,7 @@ private fun WebView.dispatchEscKeyEvent() {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun CallScreenViewPreview( internal fun CallScreenViewPreview(
@PreviewParameter(CallScreenStateProvider::class) state: CallScreenState, @PreviewParameter(CallScreenStatePreviewParam::class) state: CallScreenState,
) = ElementPreview { ) = ElementPreview {
CallScreenView( CallScreenView(
state = state, state = state,
@@ -202,7 +202,9 @@ class ElementCallActivity :
} }
DisposableEffect(Unit) { DisposableEffect(Unit) {
val onPictureInPictureModeChangedListener = Consumer { _: PictureInPictureModeChangedInfo -> val onPictureInPictureModeChangedListener = Consumer { _: PictureInPictureModeChangedInfo ->
setPipParams() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setPipParams()
}
pipEventSink(PictureInPictureEvent.OnPictureInPictureModeChanged(isInPictureInPictureMode)) pipEventSink(PictureInPictureEvent.OnPictureInPictureModeChanged(isInPictureInPictureMode))
if (!isInPictureInPictureMode && !lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { if (!isInPictureInPictureMode && !lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
Timber.tag(loggerTag.value).d("Exiting PiP mode: Hangup the call") Timber.tag(loggerTag.value).d("Exiting PiP mode: Hangup the call")
@@ -300,6 +302,7 @@ class ElementCallActivity :
} }
} }
@RequiresApi(Build.VERSION_CODES.O)
override fun setPipOrientation(orientation: Int?) { override fun setPipOrientation(orientation: Int?) {
currentPipOrientation = orientation currentPipOrientation = orientation
setPictureInPictureParams(getPictureInPictureParams()) setPictureInPictureParams(getPictureInPictureParams())
@@ -161,7 +161,7 @@ private fun ActionButton(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun IncomingCallScreenPreview( internal fun IncomingCallScreenPreview(
@PreviewParameter(CallNotificationDataProvider::class) state: CallNotificationData, @PreviewParameter(CallNotificationDataPreviewParam::class) state: CallNotificationData,
) = ElementPreview { ) = ElementPreview {
IncomingCallScreen( IncomingCallScreen(
notificationData = state, notificationData = state,
@@ -21,7 +21,7 @@ import kotlinx.coroutines.CoroutineScope
@BindingContainer @BindingContainer
@ContributesTo(RoomScope::class) @ContributesTo(RoomScope::class)
object ContentScannerModule { object ContentScannerBindingContainer {
@Provides @Provides
@SingleIn(RoomScope::class) @SingleIn(RoomScope::class)
fun providesContentScannerService( fun providesContentScannerService(
@@ -15,16 +15,16 @@ import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
class ContentScannerModuleTest { class ContentScannerBindingContainerTest {
@Test @Test
fun `ContentScannerModule provides NoopContentScannerService when ContentScanner is null`() = runTest { fun `ContentScannerBindingContainer provides NoopContentScannerService when ContentScanner is null`() = runTest {
// Given // Given
val contentScanner: ContentScanner? = null val contentScanner: ContentScanner? = null
val sessionCoroutineScope = backgroundScope val sessionCoroutineScope = backgroundScope
val coroutineDispatchers = testCoroutineDispatchers() val coroutineDispatchers = testCoroutineDispatchers()
// When // When
val contentScannerService = ContentScannerModule.providesContentScannerService( val contentScannerService = ContentScannerBindingContainer.providesContentScannerService(
contentScanner = contentScanner, contentScanner = contentScanner,
coroutineScope = sessionCoroutineScope, coroutineScope = sessionCoroutineScope,
coroutineDispatchers = coroutineDispatchers, coroutineDispatchers = coroutineDispatchers,
@@ -35,14 +35,14 @@ class ContentScannerModuleTest {
} }
@Test @Test
fun `ContentScannerModule provides DefaultContentScannerService when ContentScanner is not null`() = runTest { fun `ContentScannerBindingContainer provides DefaultContentScannerService when ContentScanner is not null`() = runTest {
// Given // Given
val contentScanner: ContentScanner? = FakeContentScanner() val contentScanner: ContentScanner? = FakeContentScanner()
val sessionCoroutineScope = backgroundScope val sessionCoroutineScope = backgroundScope
val coroutineDispatchers = testCoroutineDispatchers() val coroutineDispatchers = testCoroutineDispatchers()
// When // When
val contentScannerService = ContentScannerModule.providesContentScannerService( val contentScannerService = ContentScannerBindingContainer.providesContentScannerService(
contentScanner = contentScanner, contentScanner = contentScanner,
coroutineScope = sessionCoroutineScope, coroutineScope = sessionCoroutineScope,
coroutineDispatchers = coroutineDispatchers, coroutineDispatchers = coroutineDispatchers,
@@ -23,7 +23,7 @@ import androidx.compose.ui.unit.dp
import io.element.android.features.createroom.impl.R import io.element.android.features.createroom.impl.R
import io.element.android.features.invitepeople.api.InvitePeopleEvents import io.element.android.features.invitepeople.api.InvitePeopleEvents
import io.element.android.features.invitepeople.api.InvitePeopleState import io.element.android.features.invitepeople.api.InvitePeopleState
import io.element.android.features.invitepeople.api.InvitePeopleStateProvider import io.element.android.features.invitepeople.api.InvitePeopleStatePreviewParam
import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -86,7 +86,7 @@ private fun AddPeopleTopBar(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AddPeopleViewPreview(@PreviewParameter(InvitePeopleStateProvider::class) state: InvitePeopleState) = ElementPreview { internal fun AddPeopleViewPreview(@PreviewParameter(InvitePeopleStatePreviewParam::class) state: InvitePeopleState) = ElementPreview {
AddPeopleView( AddPeopleView(
state = state, state = state,
invitePeopleView = {}, invitePeopleView = {},
@@ -21,7 +21,7 @@ import io.element.android.libraries.permissions.api.aPermissionsState
import io.element.android.libraries.previewutils.room.aSpaceRoom import io.element.android.libraries.previewutils.room.aSpaceRoom
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
open class ConfigureRoomStateProvider : PreviewParameterProvider<ConfigureRoomState> { open class ConfigureRoomStatePreviewParam : PreviewParameterProvider<ConfigureRoomState> {
override val values: Sequence<ConfigureRoomState> override val values: Sequence<ConfigureRoomState>
get() = sequenceOf( get() = sequenceOf(
aConfigureRoomState(), aConfigureRoomState(),
@@ -349,12 +349,12 @@ private fun RoomJoinRuleOptions(
@PreviewWithLargeHeight @PreviewWithLargeHeight
@Composable @Composable
internal fun ConfigureRoomViewLightPreview(@PreviewParameter(ConfigureRoomStateProvider::class) state: ConfigureRoomState) = internal fun ConfigureRoomViewLightPreview(@PreviewParameter(ConfigureRoomStatePreviewParam::class) state: ConfigureRoomState) =
ElementPreviewLight { ContentToPreview(state) } ElementPreviewLight { ContentToPreview(state) }
@PreviewWithLargeHeight @PreviewWithLargeHeight
@Composable @Composable
internal fun ConfigureRoomViewDarkPreview(@PreviewParameter(ConfigureRoomStateProvider::class) state: ConfigureRoomState) = internal fun ConfigureRoomViewDarkPreview(@PreviewParameter(ConfigureRoomStatePreviewParam::class) state: ConfigureRoomState) =
ElementPreviewDark { ContentToPreview(state) } ElementPreviewDark { ContentToPreview(state) }
@ExcludeFromCoverage @ExcludeFromCoverage
@@ -11,7 +11,7 @@ package io.element.android.features.logout.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
open class AccountDeactivationStateProvider : PreviewParameterProvider<AccountDeactivationState> { open class AccountDeactivationStatePreviewParam : PreviewParameterProvider<AccountDeactivationState> {
private val filledForm = aDeactivateFormState(eraseData = true, password = "password") private val filledForm = aDeactivateFormState(eraseData = true, password = "password")
override val values: Sequence<AccountDeactivationState> override val values: Sequence<AccountDeactivationState>
get() = sequenceOf( get() = sequenceOf(
@@ -308,7 +308,7 @@ private fun String.sanitize(): String {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AccountDeactivationViewPreview( internal fun AccountDeactivationViewPreview(
@PreviewParameter(AccountDeactivationStateProvider::class) state: AccountDeactivationState, @PreviewParameter(AccountDeactivationStatePreviewParam::class) state: AccountDeactivationState,
) = ElementPreview { ) = ElementPreview {
AccountDeactivationView( AccountDeactivationView(
state, state,
@@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
open class ForwardMessagesStateProvider : PreviewParameterProvider<ForwardMessagesState> { open class ForwardMessagesStatePreviewParam : PreviewParameterProvider<ForwardMessagesState> {
override val values: Sequence<ForwardMessagesState> override val values: Sequence<ForwardMessagesState>
get() = sequenceOf( get() = sequenceOf(
aForwardMessagesState(), aForwardMessagesState(),
@@ -38,7 +38,7 @@ fun ForwardMessagesView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun ForwardMessagesViewPreview(@PreviewParameter(ForwardMessagesStateProvider::class) state: ForwardMessagesState) = ElementPreview { internal fun ForwardMessagesViewPreview(@PreviewParameter(ForwardMessagesStatePreviewParam::class) state: ForwardMessagesState) = ElementPreview {
ForwardMessagesView( ForwardMessagesView(
state = state, state = state,
onForwardSuccess = {} onForwardSuccess = {}
@@ -18,7 +18,7 @@ import io.element.android.libraries.di.SessionScope
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
@BindingContainer @BindingContainer
interface FtueModule { interface FtueBindingContainer {
@Binds @Binds
fun bindChooseSelfVerificationMethodPresenter(presenter: ChooseSelfVerificationModePresenter): Presenter<ChooseSelfVerificationModeState> fun bindChooseSelfVerificationModePresenter(presenter: ChooseSelfVerificationModePresenter): Presenter<ChooseSelfVerificationModeState>
} }
@@ -11,7 +11,7 @@ package io.element.android.features.ftue.impl.notifications
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.permissions.api.aPermissionsState import io.element.android.libraries.permissions.api.aPermissionsState
open class NotificationsOptInStateProvider : PreviewParameterProvider<NotificationsOptInState> { open class NotificationsOptInStatePreviewParam : PreviewParameterProvider<NotificationsOptInState> {
override val values: Sequence<NotificationsOptInState> override val values: Sequence<NotificationsOptInState>
get() = sequenceOf( get() = sequenceOf(
aNotificationsOptInState(), aNotificationsOptInState(),
@@ -178,7 +178,7 @@ private fun NotificationRow(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun NotificationsOptInViewPreview( internal fun NotificationsOptInViewPreview(
@PreviewParameter(NotificationsOptInStateProvider::class) state: NotificationsOptInState @PreviewParameter(NotificationsOptInStatePreviewParam::class) state: NotificationsOptInState
) { ) {
ElementPreview { ElementPreview {
NotificationsOptInView( NotificationsOptInView(
@@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.features.logout.api.direct.aDirectLogoutState
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
class ChooseSelfVerificationModeStateProvider : class ChooseSelfVerificationModeStatePreviewParam :
PreviewParameterProvider<ChooseSelfVerificationModeState> { PreviewParameterProvider<ChooseSelfVerificationModeState> {
override val values = sequenceOf( override val values = sequenceOf(
aChooseSelfVerificationModeState( aChooseSelfVerificationModeState(
@@ -149,7 +149,7 @@ private fun ChooseSelfVerificationModeButtons(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun ChooseSelfVerificationModeViewPreview( internal fun ChooseSelfVerificationModeViewPreview(
@PreviewParameter(ChooseSelfVerificationModeStateProvider::class) state: ChooseSelfVerificationModeState @PreviewParameter(ChooseSelfVerificationModeStatePreviewParam::class) state: ChooseSelfVerificationModeState
) = ElementPreview { ) = ElementPreview {
ChooseSelfVerificationModeView( ChooseSelfVerificationModeView(
state = state, state = state,
@@ -10,7 +10,7 @@ package io.element.android.features.home.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.home.impl.roomlist.RoomListState import io.element.android.features.home.impl.roomlist.RoomListState
import io.element.android.features.home.impl.roomlist.RoomListStateProvider import io.element.android.features.home.impl.roomlist.RoomListStatePreviewParam
import io.element.android.features.home.impl.roomlist.aRoomListState import io.element.android.features.home.impl.roomlist.aRoomListState
import io.element.android.features.home.impl.roomlist.aRoomsContentState import io.element.android.features.home.impl.roomlist.aRoomsContentState
import io.element.android.features.home.impl.roomlist.generateRoomListRoomSummaryList import io.element.android.features.home.impl.roomlist.generateRoomListRoomSummaryList
@@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
open class HomeStateProvider : PreviewParameterProvider<HomeState> { open class HomeStatePreviewParam : PreviewParameterProvider<HomeState> {
override val values: Sequence<HomeState> override val values: Sequence<HomeState>
get() = sequenceOf( get() = sequenceOf(
aHomeState(), aHomeState(),
@@ -43,7 +43,7 @@ open class HomeStateProvider : PreviewParameterProvider<HomeState> {
aHomeState( aHomeState(
currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces, currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces,
), ),
) + RoomListStateProvider().values.map { ) + RoomListStatePreviewParam().values.map {
aHomeState(roomListState = it) aHomeState(roomListState = it)
} + aHomeState( } + aHomeState(
currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces, currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces,
@@ -371,7 +371,7 @@ internal fun RoomListRoomSummary.contentType() = displayType.ordinal
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun HomeViewPreview(@PreviewParameter(HomeStateProvider::class) state: HomeState) = ElementPreview { internal fun HomeViewPreview(@PreviewParameter(HomeStatePreviewParam::class) state: HomeState) = ElementPreview {
HomeView( HomeView(
homeState = state, homeState = state,
onRoomClick = { _, _ -> }, onRoomClick = { _, _ -> },
@@ -42,7 +42,7 @@ import io.element.android.features.home.impl.filters.selection.FilterSelectionSt
import io.element.android.features.home.impl.model.RoomListRoomSummary import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.RoomSummaryDisplayType import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.features.home.impl.roomlist.RoomListContentState import io.element.android.features.home.impl.roomlist.RoomListContentState
import io.element.android.features.home.impl.roomlist.RoomListContentStateProvider import io.element.android.features.home.impl.roomlist.RoomListContentStatePreviewParam
import io.element.android.features.home.impl.roomlist.RoomListEvent import io.element.android.features.home.impl.roomlist.RoomListEvent
import io.element.android.features.home.impl.roomlist.SecurityBannerState import io.element.android.features.home.impl.roomlist.SecurityBannerState
import io.element.android.features.home.impl.spacefilters.SpaceFiltersState import io.element.android.features.home.impl.spacefilters.SpaceFiltersState
@@ -336,7 +336,7 @@ private fun EmptyScaffold(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStateProvider::class) state: RoomListContentState) = ElementPreview { internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePreviewParam::class) state: RoomListContentState) = ElementPreview {
RoomListContentView( RoomListContentView(
contentState = state, contentState = state,
filtersState = aRoomListFiltersState( filtersState = aRoomListFiltersState(
@@ -43,7 +43,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.home.impl.R import io.element.android.features.home.impl.R
import io.element.android.features.home.impl.model.LatestEvent import io.element.android.features.home.impl.model.LatestEvent
import io.element.android.features.home.impl.model.RoomListRoomSummary import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.RoomListRoomSummaryProvider import io.element.android.features.home.impl.model.RoomListRoomSummaryPreviewParam
import io.element.android.features.home.impl.model.RoomSummaryDisplayType import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.features.home.impl.roomlist.RoomListEvent import io.element.android.features.home.impl.roomlist.RoomListEvent
import io.element.android.libraries.core.extensions.orEmpty import io.element.android.libraries.core.extensions.orEmpty
@@ -449,7 +449,7 @@ private fun MentionIndicatorAtom() {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomSummaryRowPreview(@PreviewParameter(RoomListRoomSummaryProvider::class) data: RoomListRoomSummary) = ElementPreview { internal fun RoomSummaryRowPreview(@PreviewParameter(RoomListRoomSummaryPreviewParam::class) data: RoomListRoomSummary) = ElementPreview {
RoomSummaryRow( RoomSummaryRow(
room = data, room = data,
hideInviteAvatars = false, hideInviteAvatars = false,
@@ -18,7 +18,7 @@ import io.element.android.libraries.di.SessionScope
@BindingContainer @BindingContainer
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
interface HomeSpacesModule { interface HomeSpacesBindingContainer {
@Binds @Binds
fun bindHomeSpacesPresenter(presenter: HomeSpacesPresenter): Presenter<HomeSpacesState> fun bindHomeSpacesPresenter(presenter: HomeSpacesPresenter): Presenter<HomeSpacesState>
} }
@@ -26,15 +26,15 @@ import io.element.android.libraries.di.SessionScope
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
@BindingContainer @BindingContainer
interface RoomListModule { interface RoomListBindingContainer {
@Binds @Binds
fun bindRoomListPresenter(presenter: RoomListPresenter): Presenter<RoomListState> fun bindRoomListPresenter(presenter: RoomListPresenter): Presenter<RoomListState>
@Binds @Binds
fun bindSearchPresenter(presenter: RoomListSearchPresenter): Presenter<RoomListSearchState> fun bindRoomListSearchPresenter(presenter: RoomListSearchPresenter): Presenter<RoomListSearchState>
@Binds @Binds
fun bindFiltersPresenter(presenter: RoomListFiltersPresenter): Presenter<RoomListFiltersState> fun bindRoomListFiltersPresenter(presenter: RoomListFiltersPresenter): Presenter<RoomListFiltersState>
@Binds @Binds
fun bindSpaceFiltersPresenter(presenter: SpaceFiltersPresenter): Presenter<SpaceFiltersState> fun bindSpaceFiltersPresenter(presenter: SpaceFiltersPresenter): Presenter<SpaceFiltersState>
@@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.home.impl.filters.selection.FilterSelectionState import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
class RoomListFiltersStateProvider : PreviewParameterProvider<RoomListFiltersState> { class RoomListFiltersStatePreviewParam : PreviewParameterProvider<RoomListFiltersState> {
override val values: Sequence<RoomListFiltersState> override val values: Sequence<RoomListFiltersState>
get() = sequenceOf( get() = sequenceOf(
aRoomListFiltersState(), aRoomListFiltersState(),
@@ -212,7 +212,7 @@ private fun RoomListFilterView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomListFiltersViewPreview(@PreviewParameter(RoomListFiltersStateProvider::class) state: RoomListFiltersState) = ElementPreview { internal fun RoomListFiltersViewPreview(@PreviewParameter(RoomListFiltersStatePreviewParam::class) state: RoomListFiltersState) = ElementPreview {
RoomListFiltersView( RoomListFiltersView(
modifier = Modifier.padding(vertical = 4.dp), modifier = Modifier.padding(vertical = 4.dp),
state = state, state = state,
@@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.api.user.DisplayedStatus
import io.element.android.libraries.matrix.ui.model.InviteSender import io.element.android.libraries.matrix.ui.model.InviteSender
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSummary> { open class RoomListRoomSummaryPreviewParam : PreviewParameterProvider<RoomListRoomSummary> {
override val values: Sequence<RoomListRoomSummary> override val values: Sequence<RoomListRoomSummary>
get() = sequenceOf( get() = sequenceOf(
listOf( listOf(
@@ -19,7 +19,7 @@ import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableSet import kotlinx.collections.immutable.toImmutableSet
open class RoomListContentStateProvider : PreviewParameterProvider<RoomListContentState> { open class RoomListContentStatePreviewParam : PreviewParameterProvider<RoomListContentState> {
override val values: Sequence<RoomListContentState> override val values: Sequence<RoomListContentState>
get() = sequenceOf( get() = sequenceOf(
aRoomsContentState(), aRoomsContentState(),
@@ -199,7 +199,7 @@ private fun RoomListModalBottomSheetContent(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomListContextMenuPreview( internal fun RoomListContextMenuPreview(
@PreviewParameter(RoomListStateContextMenuShownProvider::class) contextMenu: RoomListState.ContextMenu.Shown @PreviewParameter(RoomListStateContextMenuShownPreviewParam::class) contextMenu: RoomListState.ContextMenu.Shown
) = ElementPreview(fillMaxSize = true) { ) = ElementPreview(fillMaxSize = true) {
RoomListContextMenu( RoomListContextMenu(
contextMenu = contextMenu, contextMenu = contextMenu,
@@ -126,7 +126,7 @@ private fun RoomListDeclineInviteMenuContent(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomListDeclineInviteMenuPreview( internal fun RoomListDeclineInviteMenuPreview(
@PreviewParameter(RoomListStateDeclineInviteMenuShownProvider::class) menu: RoomListState.DeclineInviteMenu.Shown, @PreviewParameter(RoomListStateDeclineInviteMenuShownPreviewParam::class) menu: RoomListState.DeclineInviteMenu.Shown,
) = ElementPreview { ) = ElementPreview {
RoomListDeclineInviteMenu( RoomListDeclineInviteMenu(
menu = menu, menu = menu,
@@ -11,7 +11,7 @@ package io.element.android.features.home.impl.roomlist
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
open class RoomListStateContextMenuShownProvider : PreviewParameterProvider<RoomListState.ContextMenu.Shown> { open class RoomListStateContextMenuShownPreviewParam : PreviewParameterProvider<RoomListState.ContextMenu.Shown> {
override val values: Sequence<RoomListState.ContextMenu.Shown> override val values: Sequence<RoomListState.ContextMenu.Shown>
get() = sequenceOf( get() = sequenceOf(
aContextMenuShown(hasNewContent = true), aContextMenuShown(hasNewContent = true),
@@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
import io.element.android.features.home.impl.model.RoomListRoomSummary import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.home.impl.model.aRoomListRoomSummary import io.element.android.features.home.impl.model.aRoomListRoomSummary
open class RoomListStateDeclineInviteMenuShownProvider : PreviewParameterProvider<RoomListState.DeclineInviteMenu.Shown> { open class RoomListStateDeclineInviteMenuShownPreviewParam : PreviewParameterProvider<RoomListState.DeclineInviteMenu.Shown> {
override val values: Sequence<RoomListState.DeclineInviteMenu.Shown> override val values: Sequence<RoomListState.DeclineInviteMenu.Shown>
get() = sequenceOf( get() = sequenceOf(
aDeclineInviteMenuShown(), aDeclineInviteMenuShown(),
@@ -33,7 +33,7 @@ import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
open class RoomListStateProvider : PreviewParameterProvider<RoomListState> { open class RoomListStatePreviewParam : PreviewParameterProvider<RoomListState> {
override val values: Sequence<RoomListState> override val values: Sequence<RoomListState>
get() = sequenceOf( get() = sequenceOf(
aRoomListState(), aRoomListState(),
@@ -41,7 +41,7 @@ import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
class GlobalSearchStateProvider : PreviewParameterProvider<GlobalSearchState> { class GlobalSearchStatePreviewParam : PreviewParameterProvider<GlobalSearchState> {
override val values: Sequence<GlobalSearchState> override val values: Sequence<GlobalSearchState>
get() = sequenceOf( get() = sequenceOf(
// Not enabled, no preview // Not enabled, no preview
@@ -553,7 +553,7 @@ private fun Modifier.addSeparatorLine(color: Color, isLastItem: Boolean): Modifi
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun GlobalSearchViewPreview( internal fun GlobalSearchViewPreview(
@PreviewParameter(GlobalSearchStateProvider::class) state: GlobalSearchState, @PreviewParameter(GlobalSearchStatePreviewParam::class) state: GlobalSearchState,
) { ) {
ElementPreview { ElementPreview {
GlobalSearchView( GlobalSearchView(
@@ -15,7 +15,7 @@ import io.element.android.features.home.impl.roomlist.aRoomListRoomSummaryList
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
class RoomListSearchStateProvider : PreviewParameterProvider<RoomListSearchState> { class RoomListSearchStatePreviewParam : PreviewParameterProvider<RoomListSearchState> {
override val values: Sequence<RoomListSearchState> override val values: Sequence<RoomListSearchState>
get() = sequenceOf( get() = sequenceOf(
aRoomListSearchState(), aRoomListSearchState(),
@@ -196,7 +196,7 @@ private fun RoomListSearchContent(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomListSearchContentPreview(@PreviewParameter(RoomListSearchStateProvider::class) state: RoomListSearchState) = ElementPreview { internal fun RoomListSearchContentPreview(@PreviewParameter(RoomListSearchStatePreviewParam::class) state: RoomListSearchState) = ElementPreview {
RoomListSearchContent( RoomListSearchContent(
state = state, state = state,
hideInvitesAvatars = false, hideInvitesAvatars = false,
@@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceServiceFilter
import io.element.android.libraries.previewutils.room.aSpaceRoom import io.element.android.libraries.previewutils.room.aSpaceRoom
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
class SpaceFiltersStateProvider : PreviewParameterProvider<SpaceFiltersState> { class SpaceFiltersStatePreviewParam : PreviewParameterProvider<SpaceFiltersState> {
override val values: Sequence<SpaceFiltersState> override val values: Sequence<SpaceFiltersState>
get() = sequenceOf( get() = sequenceOf(
aSelectingSpaceFiltersState(), aSelectingSpaceFiltersState(),
@@ -189,6 +189,6 @@ private fun SpaceFilterItem(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun SpaceFiltersViewPreview(@PreviewParameter(SpaceFiltersStateProvider::class) state: SpaceFiltersState) = ElementPreview(fillMaxSize = true) { internal fun SpaceFiltersViewPreview(@PreviewParameter(SpaceFiltersStatePreviewParam::class) state: SpaceFiltersState) = ElementPreview(fillMaxSize = true) {
SpaceFiltersView(state = state) SpaceFiltersView(state = state)
} }
@@ -15,11 +15,11 @@ import io.element.android.libraries.previewutils.room.aSpaceRoom
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableSet import kotlinx.collections.immutable.toImmutableSet
open class HomeSpacesStateProvider : PreviewParameterProvider<HomeSpacesState> { open class HomeSpacesStatePreviewParam : PreviewParameterProvider<HomeSpacesState> {
override val values: Sequence<HomeSpacesState> override val values: Sequence<HomeSpacesState>
get() = sequenceOf( get() = sequenceOf(
aHomeSpacesState( aHomeSpacesState(
spaceRooms = SpaceRoomProvider().values.toList(), spaceRooms = SpaceRoomPreviewParam().values.toList(),
seenSpaceInvites = setOf( seenSpaceInvites = setOf(
RoomId("!spaceId3:example.com"), RoomId("!spaceId3:example.com"),
), ),
@@ -171,7 +171,7 @@ private fun EmptySpaceHomeView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun HomeSpacesViewPreview( internal fun HomeSpacesViewPreview(
@PreviewParameter(HomeSpacesStateProvider::class) state: HomeSpacesState, @PreviewParameter(HomeSpacesStatePreviewParam::class) state: HomeSpacesState,
) = ElementPreview { ) = ElementPreview {
HomeSpacesView( HomeSpacesView(
state = state, state = state,
@@ -14,7 +14,7 @@ import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.spaces.SpaceRoom import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.previewutils.room.aSpaceRoom import io.element.android.libraries.previewutils.room.aSpaceRoom
class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> { class SpaceRoomPreviewParam : PreviewParameterProvider<SpaceRoom> {
override val values: Sequence<SpaceRoom> = sequenceOf( override val values: Sequence<SpaceRoom> = sequenceOf(
aSpaceRoom(), aSpaceRoom(),
aSpaceRoom( aSpaceRoom(
@@ -5,6 +5,8 @@
* Please see LICENSE files in the repository root for full details. * Please see LICENSE files in the repository root for full details.
*/ */
@file:OptIn(ExperimentalCoroutinesApi::class)
package io.element.android.features.home.impl.search package io.element.android.features.home.impl.search
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -35,6 +37,7 @@ import io.element.android.tests.testutils.test
import io.element.android.tests.testutils.testCoroutineDispatchers import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runCurrent
@@ -18,7 +18,7 @@ import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.preview.ROOM_NAME import io.element.android.libraries.designsystem.preview.ROOM_NAME
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
open class AcceptDeclineInviteStateProvider : PreviewParameterProvider<AcceptDeclineInviteState> { open class AcceptDeclineInviteStatePreviewParam : PreviewParameterProvider<AcceptDeclineInviteState> {
override val values: Sequence<AcceptDeclineInviteState> override val values: Sequence<AcceptDeclineInviteState>
get() = sequenceOf( get() = sequenceOf(
anAcceptDeclineInviteState(), anAcceptDeclineInviteState(),
@@ -123,7 +123,7 @@ private fun DeclineConfirmationDialog(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AcceptDeclineInviteViewPreview(@PreviewParameter(AcceptDeclineInviteStateProvider::class) state: AcceptDeclineInviteState) = internal fun AcceptDeclineInviteViewPreview(@PreviewParameter(AcceptDeclineInviteStatePreviewParam::class) state: AcceptDeclineInviteState) =
ElementPreview { ElementPreview {
AcceptDeclineInviteView( AcceptDeclineInviteView(
state = state, state = state,
@@ -11,7 +11,7 @@ package io.element.android.features.invite.impl.declineandblock
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
open class DeclineAndBlockStateProvider : PreviewParameterProvider<DeclineAndBlockState> { open class DeclineAndBlockStatePreviewParam : PreviewParameterProvider<DeclineAndBlockState> {
override val values: Sequence<DeclineAndBlockState> override val values: Sequence<DeclineAndBlockState>
get() = sequenceOf( get() = sequenceOf(
aDeclineAndBlockState(), aDeclineAndBlockState(),
@@ -145,7 +145,7 @@ fun DeclineAndBlockView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun DeclineAndBlockViewPreview( internal fun DeclineAndBlockViewPreview(
@PreviewParameter(DeclineAndBlockStateProvider::class) state: DeclineAndBlockState @PreviewParameter(DeclineAndBlockStatePreviewParam::class) state: DeclineAndBlockState
) = ElementPreview { ) = ElementPreview {
DeclineAndBlockView( DeclineAndBlockView(
state = state, state = state,
@@ -22,9 +22,9 @@ import io.element.android.libraries.matrix.api.MatrixClient
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
@BindingContainer @BindingContainer
interface InviteModule { interface InviteBindingContainer {
@Binds @Binds
fun bindAcceptDeclinePresenter(presenter: AcceptDeclineInvitePresenter): Presenter<AcceptDeclineInviteState> fun bindAcceptDeclineInvitePresenter(presenter: AcceptDeclineInvitePresenter): Presenter<AcceptDeclineInviteState>
companion object { companion object {
@Provides @Provides
@@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
class InvitePeopleStateProvider : PreviewParameterProvider<InvitePeopleState> { class InvitePeopleStatePreviewParam : PreviewParameterProvider<InvitePeopleState> {
override val values: Sequence<InvitePeopleState> override val values: Sequence<InvitePeopleState>
get() = sequenceOf( get() = sequenceOf(
aPreviewInvitePeopleState(), aPreviewInvitePeopleState(),
@@ -26,7 +26,7 @@ import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
internal class DefaultInvitePeopleStateProvider : PreviewParameterProvider<DefaultInvitePeopleState> { internal class DefaultInvitePeopleStatePreviewParam : PreviewParameterProvider<DefaultInvitePeopleState> {
override val values: Sequence<DefaultInvitePeopleState> override val values: Sequence<DefaultInvitePeopleState>
get() = sequenceOf( get() = sequenceOf(
aDefaultInvitePeopleState(), aDefaultInvitePeopleState(),
@@ -316,7 +316,7 @@ private fun InvitePeopleConfirmModal(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun InvitePeopleViewPreview(@PreviewParameter(DefaultInvitePeopleStateProvider::class) state: DefaultInvitePeopleState) = internal fun InvitePeopleViewPreview(@PreviewParameter(DefaultInvitePeopleStatePreviewParam::class) state: DefaultInvitePeopleState) =
ElementPreview { ElementPreview {
InvitePeopleView(state = state) InvitePeopleView(state = state)
} }
@@ -30,7 +30,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.model.InviteSender import io.element.android.libraries.matrix.ui.model.InviteSender
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
open class JoinRoomStateProvider : PreviewParameterProvider<JoinRoomState> { open class JoinRoomStatePreviewParam : PreviewParameterProvider<JoinRoomState> {
override val values: Sequence<JoinRoomState> override val values: Sequence<JoinRoomState>
get() = sequenceOf( get() = sequenceOf(
aJoinRoomState( aJoinRoomState(
@@ -642,7 +642,7 @@ private fun JoinRoomTopBar(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun JoinRoomViewPreview(@PreviewParameter(JoinRoomStateProvider::class) state: JoinRoomState) = ElementPreview { internal fun JoinRoomViewPreview(@PreviewParameter(JoinRoomStatePreviewParam::class) state: JoinRoomState) = ElementPreview {
JoinRoomView( JoinRoomView(
state = state, state = state,
onBackClick = { }, onBackClick = { },
@@ -27,7 +27,7 @@ import java.util.Optional
@BindingContainer @BindingContainer
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
object JoinRoomModule { object JoinRoomBindingContainer {
@Provides @Provides
fun providesJoinRoomPresenterFactory( fun providesJoinRoomPresenterFactory(
client: MatrixClient, client: MatrixClient,
@@ -16,7 +16,7 @@ import io.element.android.libraries.designsystem.preview.USER_NAME_BOB
import io.element.android.libraries.designsystem.preview.USER_NAME_CHARLIE import io.element.android.libraries.designsystem.preview.USER_NAME_CHARLIE
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
class KnockRequestsBannerStateProvider : PreviewParameterProvider<KnockRequestsBannerState> { class KnockRequestsBannerStatePreviewParam : PreviewParameterProvider<KnockRequestsBannerState> {
override val values: Sequence<KnockRequestsBannerState> override val values: Sequence<KnockRequestsBannerState>
get() = sequenceOf( get() = sequenceOf(
aKnockRequestsBannerState(), aKnockRequestsBannerState(),
@@ -227,7 +227,7 @@ private fun KnockRequestAvatarListView(
@Composable @Composable
@PreviewsDayNight @PreviewsDayNight
internal fun KnockRequestsBannerViewPreview(@PreviewParameter(KnockRequestsBannerStateProvider::class) state: KnockRequestsBannerState) = ElementPreview { internal fun KnockRequestsBannerViewPreview(@PreviewParameter(KnockRequestsBannerStatePreviewParam::class) state: KnockRequestsBannerState) = ElementPreview {
KnockRequestsBannerView( KnockRequestsBannerView(
state = state, state = state,
onViewRequestsClick = {}, onViewRequestsClick = {},
@@ -6,7 +6,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.knockrequests.impl.data package io.element.android.features.knockrequests.impl.data.di
import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo import dev.zacsweers.metro.ContributesTo
@@ -14,16 +14,17 @@ import dev.zacsweers.metro.Provides
import dev.zacsweers.metro.SingleIn import dev.zacsweers.metro.SingleIn
import io.element.android.features.knockrequests.api.KnockRequestPermissions import io.element.android.features.knockrequests.api.KnockRequestPermissions
import io.element.android.features.knockrequests.api.knockRequestPermissions import io.element.android.features.knockrequests.api.knockRequestPermissions
import io.element.android.features.knockrequests.impl.data.KnockRequestsService
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.powerlevels.permissionsFlow import io.element.android.libraries.matrix.api.room.powerlevels.permissionsFlow
@BindingContainer @BindingContainer
@ContributesTo(RoomScope::class) @ContributesTo(RoomScope::class)
object KnockRequestsModule { object KnockRequestsBindingContainer {
@Provides @Provides
@SingleIn(RoomScope::class) @SingleIn(RoomScope::class)
fun knockRequestsService(room: JoinedRoom): KnockRequestsService { fun providesKnockRequestsService(room: JoinedRoom): KnockRequestsService {
return KnockRequestsService( return KnockRequestsService(
knockRequestsFlow = room.knockRequestsFlow, knockRequestsFlow = room.knockRequestsFlow,
permissionsFlow = room.permissionsFlow(KnockRequestPermissions.DEFAULT) { perms -> permissionsFlow = room.permissionsFlow(KnockRequestPermissions.DEFAULT) { perms ->
@@ -18,7 +18,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
open class KnockRequestsListStateProvider : PreviewParameterProvider<KnockRequestsListState> { open class KnockRequestsListStatePreviewParam : PreviewParameterProvider<KnockRequestsListState> {
override val values: Sequence<KnockRequestsListState> override val values: Sequence<KnockRequestsListState>
get() = sequenceOf( get() = sequenceOf(
aKnockRequestsListState( aKnockRequestsListState(
@@ -491,7 +491,7 @@ private fun KnockRequestsListTopBar(onBackClick: () -> Unit) {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun KnockRequestsListViewPreview( internal fun KnockRequestsListViewPreview(
@PreviewParameter(KnockRequestsListStateProvider::class) state: KnockRequestsListState @PreviewParameter(KnockRequestsListStatePreviewParam::class) state: KnockRequestsListState
) = ElementPreview { ) = ElementPreview {
KnockRequestsListView( KnockRequestsListView(
state = state, state = state,
@@ -13,7 +13,7 @@ import io.element.android.features.leaveroom.api.LeaveRoomEvent
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
class InternalLeaveRoomStateProvider : PreviewParameterProvider<InternalLeaveRoomState> { class InternalLeaveRoomStatePreviewParam : PreviewParameterProvider<InternalLeaveRoomState> {
override val values: Sequence<InternalLeaveRoomState> override val values: Sequence<InternalLeaveRoomState>
get() = sequenceOf( get() = sequenceOf(
aLeaveRoomState(), aLeaveRoomState(),
@@ -139,7 +139,7 @@ private fun LeaveRoomProgressDialog(modifier: Modifier = Modifier) {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun LeaveRoomViewPreview( internal fun LeaveRoomViewPreview(
@PreviewParameter(InternalLeaveRoomStateProvider::class) state: InternalLeaveRoomState @PreviewParameter(InternalLeaveRoomStatePreviewParam::class) state: InternalLeaveRoomState
) = ElementPreview { ) = ElementPreview {
Box( Box(
modifier = Modifier.size(300.dp, 300.dp), modifier = Modifier.size(300.dp, 300.dp),
@@ -18,7 +18,7 @@ import io.element.android.libraries.di.SessionScope
@ContributesTo(SessionScope::class) @ContributesTo(SessionScope::class)
@BindingContainer @BindingContainer
interface LeaveRoomModule { interface LeaveRoomBindingContainer {
@Binds @Binds
fun bindLeaveRoomPresenter(presenter: LeaveRoomPresenter): Presenter<LeaveRoomState> fun bindLeaveRoomPresenter(presenter: LeaveRoomPresenter): Presenter<LeaveRoomState>
} }
@@ -15,7 +15,7 @@ import io.element.android.libraries.architecture.AsyncData
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
open class DependencyLicensesListStateProvider : PreviewParameterProvider<DependencyLicensesListState> { open class DependencyLicensesListStatePreviewParam : PreviewParameterProvider<DependencyLicensesListState> {
override val values: Sequence<DependencyLicensesListState> override val values: Sequence<DependencyLicensesListState>
get() = sequenceOf( get() = sequenceOf(
aDependencyLicensesListState( aDependencyLicensesListState(
@@ -126,7 +126,7 @@ fun DependencyLicensesListView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun DependencyLicensesListViewPreview( internal fun DependencyLicensesListViewPreview(
@PreviewParameter(DependencyLicensesListStateProvider::class) state: DependencyLicensesListState @PreviewParameter(DependencyLicensesListStatePreviewParam::class) state: DependencyLicensesListState
) = ElementPreview { ) = ElementPreview {
DependencyLicensesListView( DependencyLicensesListView(
state = state, state = state,
@@ -13,7 +13,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.permissions.api.PermissionsState import io.element.android.libraries.permissions.api.PermissionsState
import io.element.android.libraries.permissions.api.aPermissionsState import io.element.android.libraries.permissions.api.aPermissionsState
open class DesktopNoticeStateProvider : PreviewParameterProvider<DesktopNoticeState> { open class DesktopNoticeStatePreviewParam : PreviewParameterProvider<DesktopNoticeState> {
override val values: Sequence<DesktopNoticeState> override val values: Sequence<DesktopNoticeState>
get() = sequenceOf( get() = sequenceOf(
aDesktopNoticeState(), aDesktopNoticeState(),
@@ -118,7 +118,7 @@ fun DesktopNoticeView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun DesktopNoticeViewPreview( internal fun DesktopNoticeViewPreview(
@PreviewParameter(DesktopNoticeStateProvider::class) state: DesktopNoticeState, @PreviewParameter(DesktopNoticeStatePreviewParam::class) state: DesktopNoticeState,
) = ElementPreview { ) = ElementPreview {
DesktopNoticeView( DesktopNoticeView(
state = state, state = state,
@@ -9,7 +9,7 @@ package io.element.android.features.linknewdevice.impl.screens.error
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
class ErrorScreenTypeProvider : PreviewParameterProvider<ErrorScreenType> { class ErrorScreenTypePreviewParam : PreviewParameterProvider<ErrorScreenType> {
override val values: Sequence<ErrorScreenType> = sequenceOf( override val values: Sequence<ErrorScreenType> = sequenceOf(
ErrorScreenType.Cancelled, ErrorScreenType.Cancelled,
ErrorScreenType.Declined, ErrorScreenType.Declined,
@@ -165,7 +165,7 @@ private fun ColumnScope.Buttons(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun ErrorViewPreview(@PreviewParameter(ErrorScreenTypeProvider::class) errorScreenType: ErrorScreenType) { internal fun ErrorViewPreview(@PreviewParameter(ErrorScreenTypePreviewParam::class) errorScreenType: ErrorScreenType) {
ElementPreview { ElementPreview {
ErrorView( ErrorView(
errorScreenType = errorScreenType, errorScreenType = errorScreenType,
@@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.linknewdevice.ErrorType import io.element.android.libraries.matrix.api.linknewdevice.ErrorType
open class EnterNumberStateProvider : PreviewParameterProvider<EnterNumberState> { open class EnterNumberStatePreviewParam : PreviewParameterProvider<EnterNumberState> {
override val values: Sequence<EnterNumberState> override val values: Sequence<EnterNumberState>
get() = sequenceOf( get() = sequenceOf(
aEnterNumberState(), aEnterNumberState(),
@@ -117,7 +117,7 @@ fun EnterNumberView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun EnterNumberViewPreview( internal fun EnterNumberViewPreview(
@PreviewParameter(EnterNumberStateProvider::class) state: EnterNumberState, @PreviewParameter(EnterNumberStatePreviewParam::class) state: EnterNumberState,
) = ElementPreview { ) = ElementPreview {
EnterNumberView( EnterNumberView(
state = state, state = state,
@@ -10,7 +10,7 @@ package io.element.android.features.linknewdevice.impl.screens.qrcode
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
class ShowQrCodeStateProvider : PreviewParameterProvider<ShowQrCodeState> { class ShowQrCodeStatePreviewParam : PreviewParameterProvider<ShowQrCodeState> {
override val values: Sequence<ShowQrCodeState> override val values: Sequence<ShowQrCodeState>
get() = sequenceOf( get() = sequenceOf(
aShowQrCodeState(), aShowQrCodeState(),
@@ -117,7 +117,7 @@ private fun QrCodeOrLoading(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun ShowQrCodeViewPreview( internal fun ShowQrCodeViewPreview(
@PreviewParameter(ShowQrCodeStateProvider::class) state: ShowQrCodeState, @PreviewParameter(ShowQrCodeStatePreviewParam::class) state: ShowQrCodeState,
) = ElementPreview { ) = ElementPreview {
ShowQrCodeView( ShowQrCodeView(
state = state, state = state,
@@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.linknewdevice.ErrorType import io.element.android.libraries.matrix.api.linknewdevice.ErrorType
open class LinkNewDeviceRootStateProvider : PreviewParameterProvider<LinkNewDeviceRootState> { open class LinkNewDeviceRootStatePreviewParam : PreviewParameterProvider<LinkNewDeviceRootState> {
override val values: Sequence<LinkNewDeviceRootState> override val values: Sequence<LinkNewDeviceRootState>
get() = sequenceOf( get() = sequenceOf(
aLinkNewDeviceRootState(), aLinkNewDeviceRootState(),
@@ -140,7 +140,7 @@ fun LinkNewDeviceRootView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun LinkNewDeviceRootViewPreview( internal fun LinkNewDeviceRootViewPreview(
@PreviewParameter(LinkNewDeviceRootStateProvider::class) state: LinkNewDeviceRootState @PreviewParameter(LinkNewDeviceRootStatePreviewParam::class) state: LinkNewDeviceRootState
) = ElementPreview { ) = ElementPreview {
LinkNewDeviceRootView( LinkNewDeviceRootView(
state = state, state = state,
@@ -10,7 +10,7 @@ package io.element.android.features.linknewdevice.impl.screens.scan
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
open class ScanQrCodeStateProvider : PreviewParameterProvider<ScanQrCodeState> { open class ScanQrCodeStatePreviewParam : PreviewParameterProvider<ScanQrCodeState> {
override val values: Sequence<ScanQrCodeState> override val values: Sequence<ScanQrCodeState>
get() = sequenceOf( get() = sequenceOf(
aScanQrCodeState(), aScanQrCodeState(),
@@ -166,7 +166,7 @@ private fun ColumnScope.Buttons(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun ScanQrCodeViewPreview(@PreviewParameter(ScanQrCodeStateProvider::class) state: ScanQrCodeState) = ElementPreview { internal fun ScanQrCodeViewPreview(@PreviewParameter(ScanQrCodeStatePreviewParam::class) state: ScanQrCodeState) = ElementPreview {
ScanQrCodeView( ScanQrCodeView(
state = state, state = state,
onBackClick = {}, onBackClick = {},

Some files were not shown because too many files have changed in this diff Show More