From 0e4bde644ddfd87f0e983d6df41ef7d41ac20f90 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 28 Feb 2023 16:18:44 +0100 Subject: [PATCH 01/34] Init create room module --- features/createroom/.gitignore | 1 + features/createroom/build.gradle.kts | 55 ++++++++++++++++++ features/createroom/consumer-rules.pro | 0 features/createroom/proguard-rules.pro | 21 +++++++ .../createroom/src/main/AndroidManifest.xml | 20 +++++++ .../features/createroom/CreateRoomEvents.kt | 22 +++++++ .../features/createroom/CreateRoomNode.kt | 44 ++++++++++++++ .../createroom/CreateRoomPresenter.kt | 38 ++++++++++++ .../features/createroom/CreateRoomState.kt | 23 ++++++++ .../createroom/CreateRoomStateProvider.kt | 31 ++++++++++ .../features/createroom/CreateRoomView.kt | 58 +++++++++++++++++++ .../createroom/CreateRoomPresenterTests.kt | 52 +++++++++++++++++ .../kotlin/extension/DependencyHandleScope.kt | 1 + settings.gradle.kts | 1 + 14 files changed, 367 insertions(+) create mode 100644 features/createroom/.gitignore create mode 100644 features/createroom/build.gradle.kts create mode 100644 features/createroom/consumer-rules.pro create mode 100644 features/createroom/proguard-rules.pro create mode 100644 features/createroom/src/main/AndroidManifest.xml create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt create mode 100644 features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt diff --git a/features/createroom/.gitignore b/features/createroom/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/features/createroom/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/createroom/build.gradle.kts b/features/createroom/build.gradle.kts new file mode 100644 index 0000000000..853783fa97 --- /dev/null +++ b/features/createroom/build.gradle.kts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id("io.element.android-compose-library") + alias(libs.plugins.ksp) + alias(libs.plugins.anvil) +} + +android { + namespace = "io.element.android.features.createroom" +} + +anvil { + generateDaggerFactories.set(true) +} + +dependencies { + anvil(projects.anvilcodegen) + implementation(projects.anvilannotations) + + implementation(projects.libraries.core) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix) + implementation(projects.libraries.matrixui) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.elementresources) + implementation(projects.libraries.uiStrings) + + testImplementation(libs.test.junit) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(projects.libraries.matrixtest) + + androidTestImplementation(libs.test.junitext) + + ksp(libs.showkase.processor) +} diff --git a/features/createroom/consumer-rules.pro b/features/createroom/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/features/createroom/proguard-rules.pro b/features/createroom/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/features/createroom/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/features/createroom/src/main/AndroidManifest.xml b/features/createroom/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..86d497f107 --- /dev/null +++ b/features/createroom/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt new file mode 100644 index 0000000000..616d6d9881 --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +// TODO Add your events or remove the file completely if no events +sealed interface CreateRoomEvents { + object MyEvent : CreateRoomEvents +} diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt new file mode 100644 index 0000000000..584e4ddf1d --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.di.SessionScope + +@ContributesNode(SessionScope::class) +class CreateRoomNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val presenter: CreateRoomPresenter, +) : Node(buildContext, plugins = plugins) { + + @Composable + override fun View(modifier: Modifier) { + val state = presenter.present() + CreateRoomView( + state = state, + modifier = modifier + ) + } +} diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt new file mode 100644 index 0000000000..bebff13d1f --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +import androidx.compose.runtime.Composable +import io.element.android.libraries.architecture.Presenter +import javax.inject.Inject + +class CreateRoomPresenter @Inject constructor() : Presenter { + + @Composable + override fun present(): CreateRoomState { + + fun handleEvents(event: CreateRoomEvents) { + when (event) { + CreateRoomEvents.MyEvent -> Unit + } + } + + return CreateRoomState( + eventSink = ::handleEvents + ) + } +} diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt new file mode 100644 index 0000000000..57cdbdb394 --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +// TODO add your ui models. Remove the eventSink if you don't have events. +// Do not use default value, so no member get forgotten in the presenters. +data class CreateRoomState( + val eventSink: (CreateRoomEvents) -> Unit +) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt new file mode 100644 index 0000000000..86118f2800 --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +open class CreateRoomStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aCreateRoomState(), + // Add other state here + ) +} + +fun aCreateRoomState() = CreateRoomState( + eventSink = {} +) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt new file mode 100644 index 0000000000..3b5ea6c20c --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom + +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Text + +@Composable +fun CreateRoomView( + state: CreateRoomState, + modifier: Modifier = Modifier, +) { + Box(modifier, contentAlignment = Alignment.Center) { + Text( + "CreateRoom feature view", + color = MaterialTheme.colorScheme.primary, + ) + } +} + +@Preview +@Composable +fun CreateRoomViewLightPreview(@PreviewParameter(CreateRoomStateProvider::class) state: CreateRoomState) = + ElementPreviewLight { ContentToPreview(state) } + +@Preview +@Composable +fun CreateRoomViewDarkPreview(@PreviewParameter(CreateRoomStateProvider::class) state: CreateRoomState) = + ElementPreviewDark { ContentToPreview(state) } + +@Composable +private fun ContentToPreview(state: CreateRoomState) { + CreateRoomView( + state = state, + ) +} diff --git a/features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt b/features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt new file mode 100644 index 0000000000..bd19a67ab0 --- /dev/null +++ b/features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalCoroutinesApi::class) + +package io.element.android.features.createroom + +import app.cash.molecule.RecompositionClock +import app.cash.molecule.moleculeFlow +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class CreateRoomPresenterTests { + + @Test + fun `present - initial state`() = runTest { + val presenter = CreateRoomPresenter() + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState) + } + } + + @Test + fun `present - send event`() = runTest { + val presenter = CreateRoomPresenter() + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + initialState.eventSink.invoke(CreateRoomEvents.MyEvent) + } + } +} diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 87e6b41094..4e58d0bf0d 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -67,4 +67,5 @@ fun DependencyHandlerScope.allFeatures() { implementation(project(":features:messages")) implementation(project(":features:rageshake")) implementation(project(":features:preferences")) + implementation(project(":features:createroom")) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 77751aeda1..de1417131e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -57,6 +57,7 @@ include(":features:roomlist") include(":features:messages") include(":features:rageshake") include(":features:preferences") +include(":features:createroom") include(":libraries:designsystem") include(":libraries:di") include(":tests:uitests") From c135d2a13cc5b6280b0c905abee3fe5cea355f8f Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 28 Feb 2023 17:42:26 +0100 Subject: [PATCH 02/34] Create root node --- features/createroom/build.gradle.kts | 1 + .../features/createroom/CreateRoomNode.kt | 49 ++++++++++++------ .../CreateRoomRootEvents.kt} | 6 +-- .../createroom/root/CreateRoomRootNode.kt | 51 +++++++++++++++++++ .../CreateRoomRootPresenter.kt} | 12 ++--- .../CreateRoomRootState.kt} | 6 +-- .../CreateRoomRootStateProvider.kt} | 10 ++-- .../CreateRoomRootView.kt} | 14 ++--- .../CreateRoomRootPresenterTests.kt} | 10 ++-- 9 files changed, 115 insertions(+), 44 deletions(-) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomEvents.kt => root/CreateRoomRootEvents.kt} (83%) create mode 100644 features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomPresenter.kt => root/CreateRoomRootPresenter.kt} (72%) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomState.kt => root/CreateRoomRootState.kt} (84%) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomStateProvider.kt => root/CreateRoomRootStateProvider.kt} (73%) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomView.kt => root/CreateRoomRootView.kt} (78%) rename features/createroom/src/test/kotlin/io/element/android/features/createroom/{CreateRoomPresenterTests.kt => root/CreateRoomRootPresenterTests.kt} (84%) diff --git a/features/createroom/build.gradle.kts b/features/createroom/build.gradle.kts index 853783fa97..b32d578796 100644 --- a/features/createroom/build.gradle.kts +++ b/features/createroom/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("io.element.android-compose-library") alias(libs.plugins.ksp) alias(libs.plugins.anvil) + id("kotlin-parcelize") } android { diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt index 584e4ddf1d..d474b56af8 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt @@ -16,29 +16,48 @@ package io.element.android.features.createroom +import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import com.bumble.appyx.core.composable.Children import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node -import com.bumble.appyx.core.plugin.Plugin -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject -import io.element.android.anvilannotations.ContributesNode -import io.element.android.libraries.di.SessionScope +import com.bumble.appyx.core.node.ParentNode +import com.bumble.appyx.navmodel.backstack.BackStack +import io.element.android.features.createroom.root.CreateRoomRootNode +import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler +import io.element.android.libraries.architecture.createNode +import kotlinx.parcelize.Parcelize -@ContributesNode(SessionScope::class) -class CreateRoomNode @AssistedInject constructor( - @Assisted buildContext: BuildContext, - @Assisted plugins: List, - private val presenter: CreateRoomPresenter, -) : Node(buildContext, plugins = plugins) { +class CreateRoomNode( + buildContext: BuildContext, + private val backstack: BackStack = BackStack( + initialElement = NavTarget.Root, + savedStateMap = buildContext.savedStateMap, + ), +) : ParentNode( + navModel = backstack, + buildContext = buildContext +) { + + sealed interface NavTarget : Parcelable { + @Parcelize + object Root : NavTarget + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Root -> createNode(buildContext) + } + } @Composable override fun View(modifier: Modifier) { - val state = presenter.present() - CreateRoomView( - state = state, - modifier = modifier + Children( + navModel = backstack, + modifier = modifier, + // Animate transition to change server screen + transitionHandler = rememberDefaultTransitionHandler(), ) } } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt similarity index 83% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt index 616d6d9881..5c051abf69 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomEvents.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.features.createroom +package io.element.android.features.createroom.root // TODO Add your events or remove the file completely if no events -sealed interface CreateRoomEvents { - object MyEvent : CreateRoomEvents +sealed interface CreateRoomRootEvents { + object MyEvent : CreateRoomRootEvents } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt new file mode 100644 index 0000000000..0ddfcc4b96 --- /dev/null +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.createroom.root + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.di.SessionScope +import kotlinx.parcelize.Parcelize + +@ContributesNode(SessionScope::class) +class CreateRoomRootNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val presenter: CreateRoomRootPresenter, +) : Node(buildContext, plugins = plugins) { + + sealed interface NavTarget : Parcelable { + @Parcelize + object Root : NavTarget + } + + @Composable + override fun View(modifier: Modifier) { + val state = presenter.present() + CreateRoomRootView( + state = state, + modifier = modifier + ) + } +} diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt similarity index 72% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt index bebff13d1f..287e4d6e42 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomPresenter.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt @@ -14,24 +14,24 @@ * limitations under the License. */ -package io.element.android.features.createroom +package io.element.android.features.createroom.root import androidx.compose.runtime.Composable import io.element.android.libraries.architecture.Presenter import javax.inject.Inject -class CreateRoomPresenter @Inject constructor() : Presenter { +class CreateRoomRootPresenter @Inject constructor() : Presenter { @Composable - override fun present(): CreateRoomState { + override fun present(): CreateRoomRootState { - fun handleEvents(event: CreateRoomEvents) { + fun handleEvents(event: CreateRoomRootEvents) { when (event) { - CreateRoomEvents.MyEvent -> Unit + CreateRoomRootEvents.MyEvent -> Unit } } - return CreateRoomState( + return CreateRoomRootState( eventSink = ::handleEvents ) } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootState.kt similarity index 84% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootState.kt index 57cdbdb394..9793cd950e 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomState.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootState.kt @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.element.android.features.createroom +package io.element.android.features.createroom.root // TODO add your ui models. Remove the eventSink if you don't have events. // Do not use default value, so no member get forgotten in the presenters. -data class CreateRoomState( - val eventSink: (CreateRoomEvents) -> Unit +data class CreateRoomRootState( + val eventSink: (CreateRoomRootEvents) -> Unit ) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootStateProvider.kt similarity index 73% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootStateProvider.kt index 86118f2800..b5ff38bcec 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomStateProvider.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootStateProvider.kt @@ -14,18 +14,18 @@ * limitations under the License. */ -package io.element.android.features.createroom +package io.element.android.features.createroom.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider -open class CreateRoomStateProvider : PreviewParameterProvider { - override val values: Sequence +open class CreateRoomRootStateProvider : PreviewParameterProvider { + override val values: Sequence get() = sequenceOf( - aCreateRoomState(), + aCreateRoomRootState(), // Add other state here ) } -fun aCreateRoomState() = CreateRoomState( +fun aCreateRoomRootState() = CreateRoomRootState( eventSink = {} ) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt similarity index 78% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt index 3b5ea6c20c..70ac7eea65 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomView.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.createroom +package io.element.android.features.createroom.root import androidx.compose.foundation.layout.Box import androidx.compose.material3.MaterialTheme @@ -28,8 +28,8 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Text @Composable -fun CreateRoomView( - state: CreateRoomState, +fun CreateRoomRootView( + state: CreateRoomRootState, modifier: Modifier = Modifier, ) { Box(modifier, contentAlignment = Alignment.Center) { @@ -42,17 +42,17 @@ fun CreateRoomView( @Preview @Composable -fun CreateRoomViewLightPreview(@PreviewParameter(CreateRoomStateProvider::class) state: CreateRoomState) = +fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = ElementPreviewLight { ContentToPreview(state) } @Preview @Composable -fun CreateRoomViewDarkPreview(@PreviewParameter(CreateRoomStateProvider::class) state: CreateRoomState) = +fun CreateRoomRootViewDarkPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = ElementPreviewDark { ContentToPreview(state) } @Composable -private fun ContentToPreview(state: CreateRoomState) { - CreateRoomView( +private fun ContentToPreview(state: CreateRoomRootState) { + CreateRoomRootView( state = state, ) } diff --git a/features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt b/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt similarity index 84% rename from features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt rename to features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt index bd19a67ab0..c57c24d75c 100644 --- a/features/createroom/src/test/kotlin/io/element/android/features/createroom/CreateRoomPresenterTests.kt +++ b/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt @@ -16,7 +16,7 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package io.element.android.features.createroom +package io.element.android.features.createroom.root import app.cash.molecule.RecompositionClock import app.cash.molecule.moleculeFlow @@ -26,11 +26,11 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test -class CreateRoomPresenterTests { +class CreateRoomRootPresenterTests { @Test fun `present - initial state`() = runTest { - val presenter = CreateRoomPresenter() + val presenter = CreateRoomRootPresenter() moleculeFlow(RecompositionClock.Immediate) { presenter.present() }.test { @@ -41,12 +41,12 @@ class CreateRoomPresenterTests { @Test fun `present - send event`() = runTest { - val presenter = CreateRoomPresenter() + val presenter = CreateRoomRootPresenter() moleculeFlow(RecompositionClock.Immediate) { presenter.present() }.test { val initialState = awaitItem() - initialState.eventSink.invoke(CreateRoomEvents.MyEvent) + initialState.eventSink.invoke(CreateRoomRootEvents.MyEvent) } } } From 7fbab8939b2d37407cab820937e7e3bacb778a4a Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 28 Feb 2023 18:07:34 +0100 Subject: [PATCH 03/34] Add empty create room fab button --- .../io/element/android/x/node/LoggedInFlowNode.kt | 11 +++++++++++ .../android/features/roomlist/RoomListNode.kt | 8 +++++++- .../android/features/roomlist/RoomListView.kt | 12 +++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt index 695d3bfaa7..38233aee64 100644 --- a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt +++ b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt @@ -31,6 +31,7 @@ import com.bumble.appyx.core.node.ParentNode import com.bumble.appyx.core.node.node import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push +import io.element.android.features.createroom.CreateRoomNode import io.element.android.features.preferences.PreferencesFlowNode import io.element.android.features.roomlist.RoomListNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -86,6 +87,10 @@ class LoggedInFlowNode( override fun onSettingsClicked() { backstack.push(NavTarget.Settings) } + + override fun onCreateRoomClicked() { + backstack.push(NavTarget.CreateRoom) + } } sealed interface NavTarget : Parcelable { @@ -97,6 +102,9 @@ class LoggedInFlowNode( @Parcelize object Settings : NavTarget + + @Parcelize + object CreateRoom : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -120,6 +128,9 @@ class LoggedInFlowNode( NavTarget.Settings -> { PreferencesFlowNode(buildContext, onOpenBugReport) } + NavTarget.CreateRoom -> { + CreateRoomNode(buildContext) + } } } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt index cec107a412..579c7ae980 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt @@ -38,6 +38,7 @@ class RoomListNode @AssistedInject constructor( interface Callback : Plugin { fun onRoomClicked(roomId: RoomId) fun onSettingsClicked() + fun onCreateRoomClicked() } private fun onRoomClicked(roomId: RoomId) { @@ -48,6 +49,10 @@ class RoomListNode @AssistedInject constructor( plugins().forEach { it.onSettingsClicked() } } + private fun onCreateRoomClicked() { + plugins().forEach { it.onCreateRoomClicked() } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -55,7 +60,8 @@ class RoomListNode @AssistedInject constructor( state = state, modifier = modifier, onRoomClicked = this::onRoomClicked, - onOpenSettings = this::onOpenSettings + onOpenSettings = this::onOpenSettings, + onCreateRoomClicked = this::onCreateRoomClicked, ) } } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt index b7d1d122dc..ca84a4401f 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable @@ -42,6 +43,7 @@ import io.element.android.features.roomlist.model.RoomListState import io.element.android.features.roomlist.model.RoomListStateProvider import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.FloatingActionButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.matrix.api.core.RoomId @@ -54,6 +56,7 @@ fun RoomListView( modifier: Modifier = Modifier, onRoomClicked: (RoomId) -> Unit = {}, onOpenSettings: () -> Unit = {}, + onCreateRoomClicked: () -> Unit = {}, ) { fun onFilterChanged(filter: String) { state.eventSink(RoomListEvents.UpdateFilter(filter)) @@ -72,6 +75,7 @@ fun RoomListView( onFilterChanged = ::onFilterChanged, onOpenSettings = onOpenSettings, onScrollOver = ::onVisibleRangedChanged, + onCreateRoomClicked = onCreateRoomClicked, ) } @@ -86,6 +90,7 @@ fun RoomListContent( onFilterChanged: (String) -> Unit = {}, onOpenSettings: () -> Unit = {}, onScrollOver: (IntRange) -> Unit = {}, + onCreateRoomClicked: () -> Unit = {}, ) { fun onRoomClicked(room: RoomListRoomSummary) { onRoomClicked(room.roomId) @@ -148,7 +153,12 @@ fun RoomListContent( } } } - } + }, + floatingActionButton = { + FloatingActionButton(onClick = onCreateRoomClicked) { + + } + }, ) } From e8a4365b05f7d1ebf0b64ac711d11251948fbe15 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 14:02:39 +0100 Subject: [PATCH 04/34] Rename parent node to flow node --- .../main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt | 4 ++-- .../createroom/{CreateRoomNode.kt => CreateRoomFlowNode.kt} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/{CreateRoomNode.kt => CreateRoomFlowNode.kt} (96%) diff --git a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt index 38233aee64..5197605a64 100644 --- a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt +++ b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt @@ -31,7 +31,7 @@ import com.bumble.appyx.core.node.ParentNode import com.bumble.appyx.core.node.node import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push -import io.element.android.features.createroom.CreateRoomNode +import io.element.android.features.createroom.CreateRoomFlowNode import io.element.android.features.preferences.PreferencesFlowNode import io.element.android.features.roomlist.RoomListNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -129,7 +129,7 @@ class LoggedInFlowNode( PreferencesFlowNode(buildContext, onOpenBugReport) } NavTarget.CreateRoom -> { - CreateRoomNode(buildContext) + CreateRoomFlowNode(buildContext) } } } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt similarity index 96% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt index d474b56af8..8dbad6778a 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt @@ -29,13 +29,13 @@ import io.element.android.libraries.architecture.animation.rememberDefaultTransi import io.element.android.libraries.architecture.createNode import kotlinx.parcelize.Parcelize -class CreateRoomNode( +class CreateRoomFlowNode( buildContext: BuildContext, private val backstack: BackStack = BackStack( initialElement = NavTarget.Root, savedStateMap = buildContext.savedStateMap, ), -) : ParentNode( +) : ParentNode( navModel = backstack, buildContext = buildContext ) { From d11c18d6b699904c3f17f901ae4f2441d823a1e6 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 18:46:25 +0100 Subject: [PATCH 05/34] Customize create room floating button --- .../android/features/roomlist/RoomListView.kt | 7 +++-- .../designsystem/theme/ColorsDark.kt | 4 +-- .../designsystem/theme/ColorsLight.kt | 4 +-- .../src/main/res/drawable/ic_edit_square.xml | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 libraries/designsystem/src/main/res/drawable/ic_edit_square.xml diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt index ca84a4401f..74b3d426c8 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.FabPosition import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable @@ -32,6 +31,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.Velocity @@ -44,11 +44,14 @@ import io.element.android.features.roomlist.model.RoomListStateProvider import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.FloatingActionButton +import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.model.MatrixUser import kotlinx.collections.immutable.ImmutableList +import io.element.android.libraries.designsystem.R as DrawableR +import io.element.android.libraries.ui.strings.R as StringR @Composable fun RoomListView( @@ -156,7 +159,7 @@ fun RoomListContent( }, floatingActionButton = { FloatingActionButton(onClick = onCreateRoomClicked) { - + Icon(resourceId = DrawableR.drawable.ic_edit_square, contentDescription = stringResource(id = StringR.string.a11y_create_message)) } }, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt index 22607a39c6..65593a9069 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt @@ -43,8 +43,8 @@ fun elementColorsDark() = ElementColors( val materialColorSchemeDark = darkColorScheme( primary = Color.White, onPrimary = Color.Black, - // TODO primaryContainer = ColorDarkTokens.PrimaryContainer, - // TODO onPrimaryContainer = ColorDarkTokens.OnPrimaryContainer, + primaryContainer = Color.White, + onPrimaryContainer = Color.Black, // TODO inversePrimary = ColorDarkTokens.InversePrimary, secondary = DarkGrey, // TODO onSecondary = ColorDarkTokens.OnSecondary, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt index 96f0db2c78..c885f9ec43 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt @@ -44,8 +44,8 @@ fun elementColorsLight() = ElementColors( val materialColorSchemeLight = lightColorScheme( primary = Black_900, onPrimary = Color.White, - // TODO primaryContainer = ColorLightTokens.PrimaryContainer, - // TODO onPrimaryContainer = ColorLightTokens.OnPrimaryContainer, + primaryContainer = Color.Black, + onPrimaryContainer = Color.White, // TODO inversePrimary = ColorLightTokens.InversePrimary, secondary = Gray_200, // TODO onSecondary = ColorLightTokens.OnSecondary, diff --git a/libraries/designsystem/src/main/res/drawable/ic_edit_square.xml b/libraries/designsystem/src/main/res/drawable/ic_edit_square.xml new file mode 100644 index 0000000000..73b092ea47 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_edit_square.xml @@ -0,0 +1,26 @@ + + + + + From 5832110a259c472e459bc566ed9382b4f70850ad Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 2 Mar 2023 15:09:40 +0100 Subject: [PATCH 06/34] Remove useless comment --- .../element/android/features/createroom/CreateRoomFlowNode.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt index 8dbad6778a..408fe0cb44 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/CreateRoomFlowNode.kt @@ -56,8 +56,7 @@ class CreateRoomFlowNode( Children( navModel = backstack, modifier = modifier, - // Animate transition to change server screen - transitionHandler = rememberDefaultTransitionHandler(), + transitionHandler = rememberDefaultTransitionHandler() ) } } From 00a19107ce68d89fdadcedb79addc0a9185321a2 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 3 Mar 2023 10:32:28 +0100 Subject: [PATCH 07/34] Update create room screen --- .../createroom/root/CreateRoomRootNode.kt | 2 +- ...oomRootView.kt => CreateRoomRootScreen.kt} | 30 +++++++++++++++---- .../designsystem/theme/ColorsDark.kt | 4 +-- .../designsystem/theme/ColorsLight.kt | 4 +-- .../src/main/res/drawable/ic_close.xml | 10 +++++++ .../src/main/res/values/strings_eax.xml | 1 + 6 files changed, 40 insertions(+), 11 deletions(-) rename features/createroom/src/main/kotlin/io/element/android/features/createroom/root/{CreateRoomRootView.kt => CreateRoomRootScreen.kt} (62%) create mode 100644 libraries/designsystem/src/main/res/drawable/ic_close.xml diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt index 0ddfcc4b96..110f50a3e8 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt @@ -43,7 +43,7 @@ class CreateRoomRootNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { val state = presenter.present() - CreateRoomRootView( + CreateRoomRootScreen( state = state, modifier = modifier ) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt similarity index 62% rename from features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt rename to features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 70ac7eea65..0bbbaeede1 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootView.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -17,26 +17,44 @@ package io.element.android.features.createroom.root import androidx.compose.foundation.layout.Box -import androidx.compose.material3.MaterialTheme +import androidx.compose.foundation.layout.displayCutoutPadding +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.R.drawable as DrawableR +import io.element.android.libraries.ui.strings.R.string as StringR @Composable -fun CreateRoomRootView( +fun CreateRoomRootScreen( state: CreateRoomRootState, modifier: Modifier = Modifier, + onBackPressed: () -> Unit = {} ) { - Box(modifier, contentAlignment = Alignment.Center) { + Box( + modifier = modifier + .fillMaxWidth() + .displayCutoutPadding(), + ) { Text( - "CreateRoom feature view", - color = MaterialTheme.colorScheme.primary, + text = stringResource(id = StringR.create_chat), + modifier = Modifier.align(Alignment.Center) ) + IconButton( + modifier = Modifier + .align(Alignment.CenterEnd), + onClick = onBackPressed, + ) { + Icon(resourceId = DrawableR.ic_close, contentDescription = stringResource(id = StringR.action_close)) + } } } @@ -52,7 +70,7 @@ fun CreateRoomRootViewDarkPreview(@PreviewParameter(CreateRoomRootStateProvider: @Composable private fun ContentToPreview(state: CreateRoomRootState) { - CreateRoomRootView( + CreateRoomRootScreen( state = state, ) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt index 65593a9069..67aa3b39cd 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt @@ -43,8 +43,8 @@ fun elementColorsDark() = ElementColors( val materialColorSchemeDark = darkColorScheme( primary = Color.White, onPrimary = Color.Black, - primaryContainer = Color.White, - onPrimaryContainer = Color.Black, + primaryContainer = Color.Black, + onPrimaryContainer = Color.White, // TODO inversePrimary = ColorDarkTokens.InversePrimary, secondary = DarkGrey, // TODO onSecondary = ColorDarkTokens.OnSecondary, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt index c885f9ec43..99a24c2871 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt @@ -44,8 +44,8 @@ fun elementColorsLight() = ElementColors( val materialColorSchemeLight = lightColorScheme( primary = Black_900, onPrimary = Color.White, - primaryContainer = Color.Black, - onPrimaryContainer = Color.White, + primaryContainer = Color.White, + onPrimaryContainer = Color.Black, // TODO inversePrimary = ColorLightTokens.InversePrimary, secondary = Gray_200, // TODO onSecondary = ColorLightTokens.OnSecondary, diff --git a/libraries/designsystem/src/main/res/drawable/ic_close.xml b/libraries/designsystem/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000000..a54429f21f --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_close.xml @@ -0,0 +1,10 @@ + + + diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index 0ed87ec9f0..ee0ee67aed 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -14,5 +14,6 @@ You can only connect to an existing server that supports sliding sync. Your homeserver admin will need to configure it. Server not supported This server currently doesn\'t support sliding sync. + Create chat From 21eca139ed727fe4cdf4585c197117695bac09ea Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:05:14 +0100 Subject: [PATCH 08/34] Revert the color change in theme --- .../android/libraries/designsystem/theme/ColorsDark.kt | 4 ++-- .../android/libraries/designsystem/theme/ColorsLight.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt index 67aa3b39cd..22607a39c6 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsDark.kt @@ -43,8 +43,8 @@ fun elementColorsDark() = ElementColors( val materialColorSchemeDark = darkColorScheme( primary = Color.White, onPrimary = Color.Black, - primaryContainer = Color.Black, - onPrimaryContainer = Color.White, + // TODO primaryContainer = ColorDarkTokens.PrimaryContainer, + // TODO onPrimaryContainer = ColorDarkTokens.OnPrimaryContainer, // TODO inversePrimary = ColorDarkTokens.InversePrimary, secondary = DarkGrey, // TODO onSecondary = ColorDarkTokens.OnSecondary, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt index 99a24c2871..96f0db2c78 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorsLight.kt @@ -44,8 +44,8 @@ fun elementColorsLight() = ElementColors( val materialColorSchemeLight = lightColorScheme( primary = Black_900, onPrimary = Color.White, - primaryContainer = Color.White, - onPrimaryContainer = Color.Black, + // TODO primaryContainer = ColorLightTokens.PrimaryContainer, + // TODO onPrimaryContainer = ColorLightTokens.OnPrimaryContainer, // TODO inversePrimary = ColorLightTokens.InversePrimary, secondary = Gray_200, // TODO onSecondary = ColorLightTokens.OnSecondary, From bb312041ea2896cf2205bf1163a52344e6e9fb07 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 14:13:54 +0100 Subject: [PATCH 09/34] Use correct color for FAB button --- .../io/element/android/features/roomlist/RoomListView.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt index 74b3d426c8..77ab1adbc7 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable @@ -158,7 +159,11 @@ fun RoomListContent( } }, floatingActionButton = { - FloatingActionButton(onClick = onCreateRoomClicked) { + FloatingActionButton( + // FIXME align on Design system theme + containerColor = MaterialTheme.colorScheme.primary, + onClick = onCreateRoomClicked + ) { Icon(resourceId = DrawableR.drawable.ic_edit_square, contentDescription = stringResource(id = StringR.string.a11y_create_message)) } }, From 14a385e5771d2b73692dafa04eba259d11800455 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:23:23 +0100 Subject: [PATCH 10/34] Top app bar for the start chat screen --- .../createroom/root/CreateRoomRootScreen.kt | 58 ++++++++++------ .../components/CenterAlignedTopAppBar.kt | 68 +++++++++++++++++++ .../src/main/res/values/strings_eax.xml | 1 - 3 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 0bbbaeede1..6b38708e0a 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,48 +16,66 @@ package io.element.android.features.createroom.root -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.displayCutoutPadding import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.sp +import io.element.android.libraries.designsystem.R import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton +import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.designsystem.R.drawable as DrawableR import io.element.android.libraries.ui.strings.R.string as StringR +@OptIn(ExperimentalMaterial3Api::class) @Composable fun CreateRoomRootScreen( state: CreateRoomRootState, modifier: Modifier = Modifier, - onBackPressed: () -> Unit = {} + onClosePressed: () -> Unit = {} ) { - Box( - modifier = modifier - .fillMaxWidth() - .displayCutoutPadding(), - ) { - Text( - text = stringResource(id = StringR.create_chat), - modifier = Modifier.align(Alignment.Center) - ) - IconButton( - modifier = Modifier - .align(Alignment.CenterEnd), - onClick = onBackPressed, - ) { - Icon(resourceId = DrawableR.ic_close, contentDescription = stringResource(id = StringR.action_close)) + Scaffold( + modifier = modifier.fillMaxWidth(), + // TODO to test + //.displayCutoutPadding() + topBar = { + CreateRoomViewTopBar(onClosePressed = onClosePressed) } + ) { } } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun CreateRoomViewTopBar( + modifier: Modifier = Modifier, + onClosePressed: () -> Unit = {}, +) { + CenterAlignedTopAppBar( + modifier = modifier, + title = { + Text( + text = stringResource(id = StringR.start_chat), + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold, + ) + }, + actions = { + IconButton(onClick = onClosePressed) { + Icon(resourceId = R.drawable.ic_close, contentDescription = stringResource(id = StringR.action_close)) + } + } + ) +} + @Preview @Composable fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt new file mode 100644 index 0000000000..36df702284 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalMaterial3Api::class) + +package io.element.android.libraries.designsystem.theme.components + +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.TopAppBarColors +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun CenterAlignedTopAppBar( + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + navigationIcon: @Composable () -> Unit = {}, + actions: @Composable RowScope.() -> Unit = {}, + windowInsets: WindowInsets = TopAppBarDefaults.windowInsets, + colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), + scrollBehavior: TopAppBarScrollBehavior? = null +) { + androidx.compose.material3.CenterAlignedTopAppBar( + title = title, + modifier = modifier, + navigationIcon = navigationIcon, + actions = actions, + windowInsets = windowInsets, + colors = colors, + scrollBehavior = scrollBehavior, + ) +} + +@Preview +@Composable +internal fun CenterAlignedTopAppBarLightPreview() = + ElementPreviewLight { ContentToPreview() } + +@Preview +@Composable +internal fun CenterAlignedTopAppBarDarkPreview() = + ElementPreviewDark { ContentToPreview() } + +@Composable +private fun ContentToPreview() { + TopAppBar(title = { Text(text = "Title") }) +} diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index ee0ee67aed..0ed87ec9f0 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -14,6 +14,5 @@ You can only connect to an existing server that supports sliding sync. Your homeserver admin will need to configure it. Server not supported This server currently doesn\'t support sliding sync. - Create chat From 550bad9376cc1ba033fdf44943088d1c72697b16 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:26:51 +0100 Subject: [PATCH 11/34] Navigate up on close --- .../android/features/createroom/root/CreateRoomRootNode.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt index 110f50a3e8..8d3d41b434 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt @@ -45,7 +45,8 @@ class CreateRoomRootNode @AssistedInject constructor( val state = presenter.present() CreateRoomRootScreen( state = state, - modifier = modifier + modifier = modifier, + onClosePressed = this::navigateUp, ) } } From 1827faec9cc0107ef33e38a94fb84163926fffe5 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:14:37 +0100 Subject: [PATCH 12/34] Remove displayCutoutPadding --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 6b38708e0a..2935539b88 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -44,8 +44,6 @@ fun CreateRoomRootScreen( ) { Scaffold( modifier = modifier.fillMaxWidth(), - // TODO to test - //.displayCutoutPadding() topBar = { CreateRoomViewTopBar(onClosePressed = onClosePressed) } From bcaf71a917f7a54a69d4a778e9b9609c8c1c85fd Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:15:33 +0100 Subject: [PATCH 13/34] Rename top bar to CreateRoomRootViewTopBar --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 2935539b88..a48900349e 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -45,7 +45,7 @@ fun CreateRoomRootScreen( Scaffold( modifier = modifier.fillMaxWidth(), topBar = { - CreateRoomViewTopBar(onClosePressed = onClosePressed) + CreateRoomRootViewTopBar(onClosePressed = onClosePressed) } ) { } @@ -53,7 +53,7 @@ fun CreateRoomRootScreen( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun CreateRoomViewTopBar( +fun CreateRoomRootViewTopBar( modifier: Modifier = Modifier, onClosePressed: () -> Unit = {}, ) { From 70acc9b2daa082c5b26647c3c2dd735af215be75 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 3 Mar 2023 18:01:40 +0100 Subject: [PATCH 14/34] Search bar --- .../createroom/root/CreateRoomRootScreen.kt | 75 ++++++++++++++++++- .../src/main/res/drawable/ic_search.xml | 26 +++++++ 2 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 libraries/designsystem/src/main/res/drawable/ic_search.xml diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index a48900349e..c1d9e8e05d 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,16 +16,27 @@ package io.element.android.features.createroom.root +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import io.element.android.libraries.designsystem.R import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar @@ -33,7 +44,8 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.ui.strings.R.string as StringR +import io.element.android.libraries.designsystem.R as DrawableR +import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -48,6 +60,18 @@ fun CreateRoomRootScreen( CreateRoomRootViewTopBar(onClosePressed = onClosePressed) } ) { + Column( + modifier = Modifier.padding(it) + ) { + SearchBar( + modifier = Modifier.padding(horizontal = 16.dp), + // TODO use resource string + placeHolderTitle = "Search for someone", + // TODO implement click behavior + onClickDescription = "", + onClick = {} + ) + } } } @@ -61,19 +85,62 @@ fun CreateRoomRootViewTopBar( modifier = modifier, title = { Text( - text = stringResource(id = StringR.start_chat), + text = stringResource(id = StringR.string.start_chat), fontSize = 16.sp, fontWeight = FontWeight.SemiBold, ) }, actions = { IconButton(onClick = onClosePressed) { - Icon(resourceId = R.drawable.ic_close, contentDescription = stringResource(id = StringR.action_close)) + Icon(resourceId = DrawableR.drawable.ic_close, contentDescription = stringResource(id = StringR.string.action_close)) } } ) } +// TODO export into design system package +// TODO comment that SearchBar is not yet implemented in Material3 compose +// and that TextField cannot be used since contentPadding cannot be changed +@Composable +fun SearchBar( + modifier: Modifier = Modifier, + placeHolderTitle: String, + onClickDescription: String = "", + onClick: () -> Unit = {}, +) { + Row( + modifier = modifier + .fillMaxWidth() + .height(48.dp) + .background( + color = MaterialTheme.colorScheme.surfaceVariant, + shape = RoundedCornerShape(28.dp), + ) + .clickable( + role = Role.Button, + onClickLabel = onClickDescription, + onClick = onClick, + ), + ) { + Text( + modifier = Modifier + .padding(horizontal = 16.dp) + .align(Alignment.CenterVertically) + .weight(1f) + .alpha(0.4f), + text = placeHolderTitle, + ) + Icon( + modifier = Modifier + .padding(horizontal = 16.dp) + .align(Alignment.CenterVertically) + .alpha(0.4f), + resourceId = DrawableR.drawable.ic_search, + contentDescription = stringResource(id = StringR.string.search) + ) + } +} + @Preview @Composable fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = diff --git a/libraries/designsystem/src/main/res/drawable/ic_search.xml b/libraries/designsystem/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000000..f4b23a8463 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_search.xml @@ -0,0 +1,26 @@ + + + + + From ed46d4248931a53de5dc655878b20f64900fda74 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 6 Mar 2023 16:25:26 +0100 Subject: [PATCH 15/34] Update SearchBar by using the DockedSearchBar from material3 --- .../createroom/root/CreateRoomRootScreen.kt | 122 ++++++++++-------- .../theme/components/DockedSearchBar.kt | 91 +++++++++++++ .../src/main/res/drawable/ic_arrow_back.xml | 9 ++ .../src/main/res/values/strings_eax.xml | 3 + .../kotlin/extension/DependencyHandleScope.kt | 4 +- 5 files changed, 175 insertions(+), 54 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DockedSearchBar.kt create mode 100644 libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index c1d9e8e05d..3701a0329c 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,22 +16,22 @@ package io.element.android.features.createroom.root -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SearchBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -40,6 +40,7 @@ import androidx.compose.ui.unit.sp import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar +import io.element.android.libraries.designsystem.theme.components.DockedSearchBar import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold @@ -54,22 +55,22 @@ fun CreateRoomRootScreen( modifier: Modifier = Modifier, onClosePressed: () -> Unit = {} ) { + val isSearchActive = rememberSaveable { mutableStateOf(false) } Scaffold( modifier = modifier.fillMaxWidth(), topBar = { - CreateRoomRootViewTopBar(onClosePressed = onClosePressed) + if (!isSearchActive.value) { + CreateRoomRootViewTopBar(onClosePressed = onClosePressed) + } } ) { Column( modifier = Modifier.padding(it) ) { - SearchBar( - modifier = Modifier.padding(horizontal = 16.dp), - // TODO use resource string - placeHolderTitle = "Search for someone", - // TODO implement click behavior - onClickDescription = "", - onClick = {} + CreateRoomSearchBar( + modifier = Modifier.fillMaxWidth(), + placeHolderTitle = stringResource(StringR.string.search_for_someone), + active = isSearchActive, ) } } @@ -98,47 +99,62 @@ fun CreateRoomRootViewTopBar( ) } -// TODO export into design system package -// TODO comment that SearchBar is not yet implemented in Material3 compose -// and that TextField cannot be used since contentPadding cannot be changed +@OptIn(ExperimentalMaterial3Api::class) @Composable -fun SearchBar( - modifier: Modifier = Modifier, +fun CreateRoomSearchBar( placeHolderTitle: String, - onClickDescription: String = "", - onClick: () -> Unit = {}, + active: MutableState, + modifier: Modifier = Modifier, ) { - Row( - modifier = modifier - .fillMaxWidth() - .height(48.dp) - .background( - color = MaterialTheme.colorScheme.surfaceVariant, - shape = RoundedCornerShape(28.dp), - ) - .clickable( - role = Role.Button, - onClickLabel = onClickDescription, - onClick = onClick, - ), - ) { - Text( - modifier = Modifier - .padding(horizontal = 16.dp) - .align(Alignment.CenterVertically) - .weight(1f) - .alpha(0.4f), - text = placeHolderTitle, - ) - Icon( - modifier = Modifier - .padding(horizontal = 16.dp) - .align(Alignment.CenterVertically) - .alpha(0.4f), - resourceId = DrawableR.drawable.ic_search, - contentDescription = stringResource(id = StringR.string.search) - ) + var text by rememberSaveable { mutableStateOf("") } + val focusManager = LocalFocusManager.current + + fun closeSearchBar() { + focusManager.clearFocus() + active.value = false } + + DockedSearchBar( + query = text, + onQueryChange = { text = it }, + onSearch = { closeSearchBar() }, + active = active.value, + onActiveChange = { + active.value = it + if (!active.value) focusManager.clearFocus() + }, + modifier = modifier + .padding(horizontal = if (!active.value) 16.dp else 0.dp), + placeholder = { + Text( + text = placeHolderTitle, + modifier = Modifier.alpha(0.4f), // FIXME align on Design system theme (removing alpha should be fine) + ) + }, + leadingIcon = if (active.value) { + { + IconButton(onClick = { closeSearchBar() }) { + Icon(DrawableR.drawable.ic_arrow_back, stringResource(StringR.string.a11y_back)) + } + } + } else null, + trailingIcon = { + if (active.value) { + IconButton(onClick = { text = "" }) { + Icon(DrawableR.drawable.ic_close, stringResource(StringR.string.a11y_clear)) + } + } else { + Icon( + resourceId = DrawableR.drawable.ic_search, + contentDescription = stringResource(StringR.string.search), + modifier = Modifier.alpha(0.4f), // FIXME align on Design system theme (removing alpha should be fine) + ) + } + }, + shape = if (!active.value) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape, + colors = if (!active.value) SearchBarDefaults.colors() else SearchBarDefaults.colors(containerColor = Color.Transparent), + content = {}, + ) } @Preview diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DockedSearchBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DockedSearchBar.kt new file mode 100644 index 0000000000..100ae259f8 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/DockedSearchBar.kt @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalMaterial3Api::class) + +package io.element.android.libraries.designsystem.theme.components + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.SearchBarColors +import androidx.compose.material3.SearchBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DockedSearchBar( + query: String, + onQueryChange: (String) -> Unit, + onSearch: (String) -> Unit, + active: Boolean, + onActiveChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + placeholder: @Composable (() -> Unit)? = null, + leadingIcon: @Composable (() -> Unit)? = null, + trailingIcon: @Composable (() -> Unit)? = null, + shape: Shape = SearchBarDefaults.dockedShape, + colors: SearchBarColors = SearchBarDefaults.colors(), + tonalElevation: Dp = SearchBarDefaults.Elevation, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + content: @Composable ColumnScope.() -> Unit, +) { + androidx.compose.material3.DockedSearchBar( + query = query, + onQueryChange = onQueryChange, + onSearch = onSearch, + active = active, + onActiveChange = onActiveChange, + modifier = modifier, + enabled = enabled, + placeholder = placeholder, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + shape = shape, + colors = colors, + tonalElevation = tonalElevation, + interactionSource = interactionSource, + content = content, + ) +} + +@Preview +@Composable +internal fun DockedSearchBarLightPreview() = ElementPreviewLight { ContentToPreview() } + +@Preview +@Composable +internal fun DockedSearchBarDarkPreview() = ElementPreviewDark { ContentToPreview() } + +@Composable +private fun ContentToPreview() { + DockedSearchBar( + query = "Some text", + onQueryChange = {}, + onSearch = {}, + active = false, + onActiveChange = {}, + content = {}, + ) +} diff --git a/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml b/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml new file mode 100644 index 0000000000..4adfb72ad7 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index 0ed87ec9f0..b2d63ec96c 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -14,5 +14,8 @@ You can only connect to an existing server that supports sliding sync. Your homeserver admin will need to configure it. Server not supported This server currently doesn\'t support sliding sync. + Back + Clear + Search for someone diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 4e58d0bf0d..9cdc2bd032 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -39,7 +39,9 @@ fun DependencyHandlerScope.composeDependencies(libs: LibrariesForLibs) { androidTestImplementation(composeBom) implementation("androidx.compose.ui:ui") implementation("androidx.compose.material:material") - implementation("androidx.compose.material3:material3") + // Override BOM version, SearchBar is not available in the actual version + // do not use latest version because of clashes on androidx lifecycle dependency + implementation("androidx.compose.material3:material3:1.1.0-alpha04") implementation("androidx.compose.material:material-icons-extended") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.activity:activity-compose:1.6.1") From 7f0590b3042e5ec28085beb455df92c59ade37e1 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Mon, 6 Mar 2023 16:55:46 +0100 Subject: [PATCH 16/34] Fix matrix test dependency --- features/createroom/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/createroom/build.gradle.kts b/features/createroom/build.gradle.kts index b32d578796..8f5948916d 100644 --- a/features/createroom/build.gradle.kts +++ b/features/createroom/build.gradle.kts @@ -48,7 +48,7 @@ dependencies { testImplementation(libs.molecule.runtime) testImplementation(libs.test.truth) testImplementation(libs.test.turbine) - testImplementation(projects.libraries.matrixtest) + testImplementation(projects.libraries.matrix.test) androidTestImplementation(libs.test.junitext) From db83f4bf6ddd505deb02c701b9bd61696f09cf59 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Mon, 6 Mar 2023 17:17:27 +0100 Subject: [PATCH 17/34] Fix duplicated strings and use back button --- .../createroom/root/CreateRoomRootScreen.kt | 5 ++--- .../login/changeserver/ChangeServerView.kt | 4 ++-- .../features/login/root/LoginRootScreen.kt | 4 ++-- .../theme/components/BackButton.kt | 21 +++++++++---------- .../src/main/res/values/strings_eax.xml | 11 +++++----- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 3701a0329c..f2697386ab 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.BackButton import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar import io.element.android.libraries.designsystem.theme.components.DockedSearchBar import io.element.android.libraries.designsystem.theme.components.Icon @@ -133,9 +134,7 @@ fun CreateRoomSearchBar( }, leadingIcon = if (active.value) { { - IconButton(onClick = { closeSearchBar() }) { - Icon(DrawableR.drawable.ic_arrow_back, stringResource(StringR.string.a11y_back)) - } + BackButton(onClick = { closeSearchBar() }) } } else null, trailingIcon = { diff --git a/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt b/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt index ba9a754fd5..4fe5d015c6 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt @@ -104,7 +104,7 @@ fun ChangeServerView( topBar = { TopAppBar( title = {}, - navigationIcon = { BackButton(action = onBackPressed, enabled = interactionEnabled) } + navigationIcon = { BackButton(onClick = onBackPressed, enabled = interactionEnabled) } ) } ) { padding -> @@ -192,7 +192,7 @@ fun ChangeServerView( IconButton(onClick = { homeserverFieldState = "" }, enabled = interactionEnabled) { - Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.action_clear)) + Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.a11y_clear)) } } } else null, diff --git a/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt b/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt index 0b8a09b42d..34ab45f8dc 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt @@ -101,7 +101,7 @@ fun LoginRootScreen( topBar = { TopAppBar( title = {}, - navigationIcon = { BackButton(action = onBackPressed, enabled = interactionEnabled) }, + navigationIcon = { BackButton(onClick = onBackPressed, enabled = interactionEnabled) }, ) } ) { padding -> @@ -267,7 +267,7 @@ internal fun LoginForm( IconButton(onClick = { loginFieldState = "" }) { - Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.action_clear)) + Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.a11y_clear)) } } } else null, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt index 8fb3989bd9..016999b960 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt @@ -16,32 +16,31 @@ package io.element.android.libraries.designsystem.theme.components +import androidx.annotation.DrawableRes import androidx.compose.foundation.layout.Column -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.ui.strings.R.string as StringR +import io.element.android.libraries.designsystem.R as DrawableR +import io.element.android.libraries.ui.strings.R as StringR @Composable fun BackButton( - action: () -> Unit, + onClick: () -> Unit, modifier: Modifier = Modifier, - icon: ImageVector = Icons.Default.ArrowBack, - contentDescription: String = stringResource(StringR.action_back), + @DrawableRes icon: Int = DrawableR.drawable.ic_arrow_back, + contentDescription: String = stringResource(StringR.string.a11y_back), enabled: Boolean = true ) { IconButton( modifier = modifier, - onClick = action, + onClick = onClick, enabled = enabled, ) { - Icon(imageVector = icon, contentDescription = contentDescription) + Icon(resourceId = icon, contentDescription = contentDescription) } } @@ -56,7 +55,7 @@ internal fun BackButtonPreviewDark() = ElementPreviewDark { ContentToPreview() } @Composable private fun ContentToPreview() { Column { - BackButton(action = { }, enabled = true, contentDescription = "Back") - BackButton(action = { }, enabled = false, contentDescription = "Back") + BackButton(onClick = { }, enabled = true, contentDescription = "Back") + BackButton(onClick = { }, enabled = false, contentDescription = "Back") } } diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index b2d63ec96c..e7c0a3cb78 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -2,20 +2,19 @@ - Back - Clear - + + Back + Clear + Enter your details Email or username Show password Hide password - What is the address of your server? You can only connect to an existing server that supports sliding sync. Your homeserver admin will need to configure it. Server not supported This server currently doesn\'t support sliding sync. - Back - Clear + Search for someone From 34d06363311f7c583ac47d6640211b51e06162ea Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:13:44 +0100 Subject: [PATCH 18/34] Fix using matrix.api module --- features/createroom/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/createroom/build.gradle.kts b/features/createroom/build.gradle.kts index 8f5948916d..0450de2c3d 100644 --- a/features/createroom/build.gradle.kts +++ b/features/createroom/build.gradle.kts @@ -37,7 +37,7 @@ dependencies { implementation(projects.libraries.core) implementation(projects.libraries.architecture) - implementation(projects.libraries.matrix) + implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrixui) implementation(projects.libraries.designsystem) implementation(projects.libraries.elementresources) From aa2b4919dac1bba932e50aa3e987cfbf7d3684c0 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Mon, 6 Mar 2023 18:02:30 +0100 Subject: [PATCH 19/34] Add buttons to create and invite --- .../createroom/root/CreateRoomRootScreen.kt | 27 +++++++++++++++++++ .../src/main/res/drawable/ic_group.xml | 26 ++++++++++++++++++ .../src/main/res/drawable/ic_share.xml | 26 ++++++++++++++++++ .../src/main/res/values/strings_eax.xml | 1 + 4 files changed, 80 insertions(+) create mode 100644 libraries/designsystem/src/main/res/drawable/ic_group.xml create mode 100644 libraries/designsystem/src/main/res/drawable/ic_share.xml diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index f2697386ab..d9b021b9ba 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -19,8 +19,10 @@ package io.element.android.features.createroom.root import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SearchBarDefaults +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue @@ -73,6 +75,31 @@ fun CreateRoomRootScreen( placeHolderTitle = stringResource(StringR.string.search_for_someone), active = isSearchActive, ) + + TextButton( + modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), + onClick = { }) { + Icon( + modifier = Modifier + .padding(end = 16.dp), + resourceId = DrawableR.drawable.ic_group, // TODO ask design for squared icon + contentDescription = "" + ) + Text(text = stringResource(id = StringR.string.new_room)) + } + + TextButton( + modifier = Modifier.padding(horizontal = 8.dp), + onClick = { } + ) { + Icon( + modifier = Modifier + .padding(end = 16.dp), + resourceId = DrawableR.drawable.ic_share, + contentDescription = "" + ) + Text(text = stringResource(id = StringR.string.invite_people_menu)) + } } } } diff --git a/libraries/designsystem/src/main/res/drawable/ic_group.xml b/libraries/designsystem/src/main/res/drawable/ic_group.xml new file mode 100644 index 0000000000..296a7764d9 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_group.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/libraries/designsystem/src/main/res/drawable/ic_share.xml b/libraries/designsystem/src/main/res/drawable/ic_share.xml new file mode 100644 index 0000000000..0291c72fb6 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_share.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/libraries/ui-strings/src/main/res/values/strings_eax.xml b/libraries/ui-strings/src/main/res/values/strings_eax.xml index e7c0a3cb78..68644ef59d 100644 --- a/libraries/ui-strings/src/main/res/values/strings_eax.xml +++ b/libraries/ui-strings/src/main/res/values/strings_eax.xml @@ -16,5 +16,6 @@ This server currently doesn\'t support sliding sync. Search for someone + New room From a6ae25c5a1f401c732dd2fcb10efbaba62bf559f Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:05:38 +0100 Subject: [PATCH 20/34] Hiding the buttons when the search is active --- .../createroom/root/CreateRoomRootScreen.kt | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index d9b021b9ba..cc1a08b9c4 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -19,7 +19,6 @@ package io.element.android.features.createroom.root import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.TextButton @@ -76,29 +75,31 @@ fun CreateRoomRootScreen( active = isSearchActive, ) - TextButton( - modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), - onClick = { }) { - Icon( - modifier = Modifier - .padding(end = 16.dp), - resourceId = DrawableR.drawable.ic_group, // TODO ask design for squared icon - contentDescription = "" - ) - Text(text = stringResource(id = StringR.string.new_room)) - } + if (!isSearchActive.value) { + TextButton( + modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), + onClick = { }) { + Icon( + modifier = Modifier + .padding(end = 16.dp), + resourceId = DrawableR.drawable.ic_group, // TODO ask design for squared icon + contentDescription = "" + ) + Text(text = stringResource(id = StringR.string.new_room)) + } - TextButton( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { } - ) { - Icon( - modifier = Modifier - .padding(end = 16.dp), - resourceId = DrawableR.drawable.ic_share, - contentDescription = "" - ) - Text(text = stringResource(id = StringR.string.invite_people_menu)) + TextButton( + modifier = Modifier.padding(horizontal = 8.dp), + onClick = { } + ) { + Icon( + modifier = Modifier + .padding(end = 16.dp), + resourceId = DrawableR.drawable.ic_share, + contentDescription = "" + ) + Text(text = stringResource(id = StringR.string.invite_people_menu)) + } } } } From 5f8ed2649b4badc92bc3a4eb80a7becce7051f5f Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 10:18:31 +0100 Subject: [PATCH 21/34] Fix code formatting --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index cc1a08b9c4..065ef07412 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -78,7 +78,8 @@ fun CreateRoomRootScreen( if (!isSearchActive.value) { TextButton( modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), - onClick = { }) { + onClick = { }, + ) { Icon( modifier = Modifier .padding(end = 16.dp), @@ -90,7 +91,7 @@ fun CreateRoomRootScreen( TextButton( modifier = Modifier.padding(horizontal = 8.dp), - onClick = { } + onClick = { }, ) { Icon( modifier = Modifier From c708fcdf66f7cc050eb2dfd113640e2434aa6b8a Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 7 Mar 2023 13:54:11 +0100 Subject: [PATCH 22/34] Improve buttons rendering --- .../createroom/root/CreateRoomRootNode.kt | 2 + .../createroom/root/CreateRoomRootScreen.kt | 69 ++++++++++++------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt index 8d3d41b434..1929926df5 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt @@ -47,6 +47,8 @@ class CreateRoomRootNode @AssistedInject constructor( state = state, modifier = modifier, onClosePressed = this::navigateUp, + onNewRoomClicked = { /* TODO Handle new room action */ }, + onInvitePeopleClicked = { /* TODO Handle invite people action */ }, ) } } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 065ef07412..58e28b536a 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,9 +16,11 @@ package io.element.android.features.createroom.root +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.TextButton @@ -31,8 +33,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -55,7 +60,9 @@ import io.element.android.libraries.ui.strings.R as StringR fun CreateRoomRootScreen( state: CreateRoomRootState, modifier: Modifier = Modifier, - onClosePressed: () -> Unit = {} + onClosePressed: () -> Unit = {}, + onNewRoomClicked: () -> Unit = {}, + onInvitePeopleClicked: () -> Unit = {}, ) { val isSearchActive = rememberSaveable { mutableStateOf(false) } Scaffold( @@ -76,31 +83,19 @@ fun CreateRoomRootScreen( ) if (!isSearchActive.value) { - TextButton( - modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), - onClick = { }, - ) { - Icon( - modifier = Modifier - .padding(end = 16.dp), - resourceId = DrawableR.drawable.ic_group, // TODO ask design for squared icon - contentDescription = "" - ) - Text(text = stringResource(id = StringR.string.new_room)) - } - - TextButton( + CreateRoomButton( modifier = Modifier.padding(horizontal = 8.dp), - onClick = { }, - ) { - Icon( - modifier = Modifier - .padding(end = 16.dp), - resourceId = DrawableR.drawable.ic_share, - contentDescription = "" - ) - Text(text = stringResource(id = StringR.string.invite_people_menu)) - } + imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), + text = stringResource(id = StringR.string.new_room), + onClick = onNewRoomClicked, + ) + + CreateRoomButton( + modifier = Modifier.padding(horizontal = 8.dp), + imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_share), + text = stringResource(id = StringR.string.invite_people_menu), + onClick = onInvitePeopleClicked, + ) } } } @@ -185,6 +180,30 @@ fun CreateRoomSearchBar( ) } +@Composable +fun CreateRoomButton( + imageVector: ImageVector, + text: String, + modifier: Modifier = Modifier, + onClick: () -> Unit = {}, +) { + TextButton( + modifier = modifier, + onClick = onClick + ) { + Image( + imageVector = imageVector, + contentDescription = "", + modifier = Modifier.size(24.dp), + contentScale = ContentScale.Inside, + ) + Text( + modifier = Modifier.padding(horizontal = 8.dp), + text = text + ) + } +} + @Preview @Composable fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = From a3d0ebc1702b642b2c0460ae09b713e8d61c08a2 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 7 Mar 2023 14:17:58 +0100 Subject: [PATCH 23/34] Fix icon color on dark theme --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 58e28b536a..b6ee70744f 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SearchBarDefaults import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -33,6 +34,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager @@ -196,6 +198,7 @@ fun CreateRoomButton( contentDescription = "", modifier = Modifier.size(24.dp), contentScale = ContentScale.Inside, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) ) Text( modifier = Modifier.padding(horizontal = 8.dp), From 29888350d40c8675fd027dde6ff90230a0b85757 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:24:55 +0100 Subject: [PATCH 24/34] Moving back button into button package --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 2 +- .../android/features/login/changeserver/ChangeServerView.kt | 2 +- .../element/android/features/login/root/LoginRootScreen.kt | 2 +- .../{theme/components => components/button}/BackButton.kt | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/{theme/components => components/button}/BackButton.kt (88%) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index b6ee70744f..dc5ecbd45a 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.theme.components.BackButton +import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar import io.element.android.libraries.designsystem.theme.components.DockedSearchBar import io.element.android.libraries.designsystem.theme.components.Icon diff --git a/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt b/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt index 4fe5d015c6..559eea4e4a 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/changeserver/ChangeServerView.kt @@ -60,7 +60,7 @@ import io.element.android.libraries.designsystem.components.form.textFieldState import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.LocalColors -import io.element.android.libraries.designsystem.theme.components.BackButton +import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.designsystem.theme.components.Icon diff --git a/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt b/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt index 34ab45f8dc..2ee4700f94 100644 --- a/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt +++ b/features/login/src/main/kotlin/io/element/android/features/login/root/LoginRootScreen.kt @@ -68,7 +68,7 @@ import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.components.form.textFieldState import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.theme.components.BackButton +import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.designsystem.theme.components.Icon diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt similarity index 88% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt index 016999b960..c6775a418b 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/BackButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt @@ -14,16 +14,19 @@ * limitations under the License. */ -package io.element.android.libraries.designsystem.theme.components +package io.element.android.libraries.designsystem.components.button import androidx.annotation.DrawableRes import androidx.compose.foundation.layout.Column +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.R as DrawableR import io.element.android.libraries.ui.strings.R as StringR From 7f453613810f626af4df7b3f9ae5db5eaecc1a84 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:31:44 +0100 Subject: [PATCH 25/34] Wrapper for TextButton --- .../createroom/root/CreateRoomRootScreen.kt | 2 +- .../theme/components/TextButton.kt | 80 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TextButton.kt diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index dc5ecbd45a..46d06df9db 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -24,7 +24,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SearchBarDefaults -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue @@ -54,6 +53,7 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.R as DrawableR import io.element.android.libraries.ui.strings.R as StringR diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TextButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TextButton.kt new file mode 100644 index 0000000000..abd895fa87 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TextButton.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.designsystem.theme.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.RowScope +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ButtonElevation +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.tooling.preview.Preview +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight + +@Composable +fun TextButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + shape: Shape = ButtonDefaults.textShape, + colors: ButtonColors = ButtonDefaults.textButtonColors(), + elevation: ButtonElevation? = null, + border: BorderStroke? = null, + contentPadding: PaddingValues = ButtonDefaults.TextButtonContentPadding, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + content: @Composable RowScope.() -> Unit +) { + androidx.compose.material3.TextButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + shape = shape, + colors = colors, + elevation = elevation, + border = border, + contentPadding = contentPadding, + interactionSource = interactionSource, + content = content, + ) +} + +@Preview +@Composable +internal fun TextButtonLightPreview() = ElementPreviewLight { ContentToPreview() } + +@Preview +@Composable +internal fun TextButtonDarkPreview() = ElementPreviewDark { ContentToPreview() } + +@Composable +private fun ContentToPreview() { + Column { + TextButton(onClick = {}, enabled = true) { + Text(text = "Click me! - Enabled") + } + TextButton(onClick = {}, enabled = false) { + Text(text = "Click me! - Disabled") + } + } +} From eb93b8783f624ee6a657a3267895981ada444123 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:44:13 +0100 Subject: [PATCH 26/34] TextIconButton component --- .../createroom/root/CreateRoomRootScreen.kt | 38 +-------- .../components/button/TextIconButton.kt | 83 +++++++++++++++++++ 2 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 46d06df9db..970bd985f8 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,13 +16,10 @@ package io.element.android.features.createroom.root -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SearchBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState @@ -33,9 +30,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource @@ -44,16 +39,16 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import io.element.android.libraries.designsystem.components.button.BackButton +import io.element.android.libraries.designsystem.components.button.TextIconButton import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar import io.element.android.libraries.designsystem.theme.components.DockedSearchBar import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.R as DrawableR import io.element.android.libraries.ui.strings.R as StringR @@ -85,14 +80,14 @@ fun CreateRoomRootScreen( ) if (!isSearchActive.value) { - CreateRoomButton( + TextIconButton( modifier = Modifier.padding(horizontal = 8.dp), imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), text = stringResource(id = StringR.string.new_room), onClick = onNewRoomClicked, ) - CreateRoomButton( + TextIconButton( modifier = Modifier.padding(horizontal = 8.dp), imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_share), text = stringResource(id = StringR.string.invite_people_menu), @@ -182,31 +177,6 @@ fun CreateRoomSearchBar( ) } -@Composable -fun CreateRoomButton( - imageVector: ImageVector, - text: String, - modifier: Modifier = Modifier, - onClick: () -> Unit = {}, -) { - TextButton( - modifier = modifier, - onClick = onClick - ) { - Image( - imageVector = imageVector, - contentDescription = "", - modifier = Modifier.size(24.dp), - contentScale = ContentScale.Inside, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) - ) - Text( - modifier = Modifier.padding(horizontal = 8.dp), - text = text - ) - } -} - @Preview @Composable fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt new file mode 100644 index 0000000000..3fd8d1c348 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.designsystem.components.button + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import io.element.android.libraries.designsystem.R +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.TextButton + +@Composable +fun TextIconButton( + imageVector: ImageVector, + text: String, + modifier: Modifier = Modifier, + iconSize: Dp = 24.dp, + onClick: () -> Unit = {}, +) { + TextButton( + modifier = modifier, + onClick = onClick + ) { + Image( + imageVector = imageVector, + contentDescription = "", + modifier = Modifier.size(iconSize), + contentScale = ContentScale.Inside, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), + ) + Text( + modifier = Modifier.padding(horizontal = 8.dp), + text = text, + ) + } +} + +@Preview +@Composable +internal fun TextIconButtonPreviewLight() = ElementPreviewLight { ContentToPreview() } + +@Preview +@Composable +internal fun TextIconButtonPreviewDark() = ElementPreviewDark { ContentToPreview() } + +@Composable +private fun ContentToPreview() { + Column { + TextIconButton( + modifier = Modifier.padding(horizontal = 8.dp), + imageVector = ImageVector.vectorResource(R.drawable.ic_group), + text = "Click me!", + onClick = {}, + ) + } +} From f43ab8434b7ec1a642d6cd50f2eefe3e8014baff Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:50:21 +0100 Subject: [PATCH 27/34] Adding missing padding top --- .../android/features/createroom/root/CreateRoomRootScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 970bd985f8..ea6631775b 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -81,7 +81,7 @@ fun CreateRoomRootScreen( if (!isSearchActive.value) { TextIconButton( - modifier = Modifier.padding(horizontal = 8.dp), + modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), text = stringResource(id = StringR.string.new_room), onClick = onNewRoomClicked, From a7b6d36fae7f42f979755390891b5dc8ba4e9581 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 7 Mar 2023 17:32:09 +0100 Subject: [PATCH 28/34] Make CreateRoomSearchBar stateless --- .../createroom/root/CreateRoomRootScreen.kt | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index ea6631775b..aa75f88005 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SearchBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -61,25 +60,29 @@ fun CreateRoomRootScreen( onNewRoomClicked: () -> Unit = {}, onInvitePeopleClicked: () -> Unit = {}, ) { - val isSearchActive = rememberSaveable { mutableStateOf(false) } + var searchText by rememberSaveable { mutableStateOf("") } + var isSearchActive by rememberSaveable { mutableStateOf(false) } Scaffold( modifier = modifier.fillMaxWidth(), topBar = { - if (!isSearchActive.value) { + if (!isSearchActive) { CreateRoomRootViewTopBar(onClosePressed = onClosePressed) } } - ) { + ) { paddingValues -> Column( - modifier = Modifier.padding(it) + modifier = Modifier.padding(paddingValues) ) { CreateRoomSearchBar( modifier = Modifier.fillMaxWidth(), + text = searchText, placeHolderTitle = stringResource(StringR.string.search_for_someone), active = isSearchActive, + onActiveChanged = { isSearchActive = it }, + onTextChanged = { searchText = it }, ) - if (!isSearchActive.value) { + if (!isSearchActive) { TextIconButton( modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), @@ -124,43 +127,40 @@ fun CreateRoomRootViewTopBar( @OptIn(ExperimentalMaterial3Api::class) @Composable fun CreateRoomSearchBar( + text: String, placeHolderTitle: String, - active: MutableState, + active: Boolean, modifier: Modifier = Modifier, + onActiveChanged: (Boolean) -> Unit = {}, + onTextChanged: (String) -> Unit = {}, ) { - var text by rememberSaveable { mutableStateOf("") } val focusManager = LocalFocusManager.current - fun closeSearchBar() { + if (!active) { + onTextChanged("") focusManager.clearFocus() - active.value = false } DockedSearchBar( query = text, - onQueryChange = { text = it }, - onSearch = { closeSearchBar() }, - active = active.value, - onActiveChange = { - active.value = it - if (!active.value) focusManager.clearFocus() - }, + onQueryChange = onTextChanged, + onSearch = { focusManager.clearFocus() }, + active = active, + onActiveChange = onActiveChanged, modifier = modifier - .padding(horizontal = if (!active.value) 16.dp else 0.dp), + .padding(horizontal = if (!active) 16.dp else 0.dp), placeholder = { Text( text = placeHolderTitle, modifier = Modifier.alpha(0.4f), // FIXME align on Design system theme (removing alpha should be fine) ) }, - leadingIcon = if (active.value) { - { - BackButton(onClick = { closeSearchBar() }) - } + leadingIcon = if (active) { + { BackButton(onClick = { onActiveChanged(false) }) } } else null, trailingIcon = { - if (active.value) { - IconButton(onClick = { text = "" }) { + if (active) { + IconButton(onClick = { onTextChanged("") }) { Icon(DrawableR.drawable.ic_close, stringResource(StringR.string.a11y_clear)) } } else { @@ -171,8 +171,8 @@ fun CreateRoomSearchBar( ) } }, - shape = if (!active.value) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape, - colors = if (!active.value) SearchBarDefaults.colors() else SearchBarDefaults.colors(containerColor = Color.Transparent), + shape = if (!active) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape, + colors = if (!active) SearchBarDefaults.colors() else SearchBarDefaults.colors(containerColor = Color.Transparent), content = {}, ) } From dd1e10279b62a748edb065cdd01440d5109311db Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 7 Mar 2023 17:37:42 +0100 Subject: [PATCH 29/34] add changelog --- changelog.d/94.wip | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/94.wip diff --git a/changelog.d/94.wip b/changelog.d/94.wip new file mode 100644 index 0000000000..c73ddd86cb --- /dev/null +++ b/changelog.d/94.wip @@ -0,0 +1 @@ +[Create and join rooms] Start new chat screen (UI) From 93567aed0238589f6db2ee456b1923fc64a595d9 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 8 Mar 2023 09:13:36 +0100 Subject: [PATCH 30/34] Fix rendering of wrong composable in preview --- .../designsystem/theme/components/CenterAlignedTopAppBar.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt index 36df702284..2d03d8312c 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/CenterAlignedTopAppBar.kt @@ -38,8 +38,8 @@ fun CenterAlignedTopAppBar( navigationIcon: @Composable () -> Unit = {}, actions: @Composable RowScope.() -> Unit = {}, windowInsets: WindowInsets = TopAppBarDefaults.windowInsets, - colors: TopAppBarColors = TopAppBarDefaults.smallTopAppBarColors(), - scrollBehavior: TopAppBarScrollBehavior? = null + colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(), + scrollBehavior: TopAppBarScrollBehavior? = null, ) { androidx.compose.material3.CenterAlignedTopAppBar( title = title, @@ -64,5 +64,5 @@ internal fun CenterAlignedTopAppBarDarkPreview() = @Composable private fun ContentToPreview() { - TopAppBar(title = { Text(text = "Title") }) + CenterAlignedTopAppBar(title = { Text(text = "Title") }) } From b81f91b563ee6070c31511bcd8a93c9e04d97ec7 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 8 Mar 2023 11:41:05 +0100 Subject: [PATCH 31/34] Use material icons while design system is not ready --- .../createroom/root/CreateRoomRootScreen.kt | 11 +++++--- .../components/button/BackButton.kt | 10 +++---- .../components/button/TextIconButton.kt | 2 +- .../src/main/res/drawable/ic_arrow_back.xml | 9 ------- .../src/main/res/drawable/ic_close.xml | 10 ------- .../src/main/res/drawable/ic_group.xml | 26 ------------------- .../src/main/res/drawable/ic_groups.xml | 25 ++++++++++++++++++ .../src/main/res/drawable/ic_search.xml | 26 ------------------- .../src/main/res/drawable/ic_share.xml | 13 +++++----- 9 files changed, 44 insertions(+), 88 deletions(-) delete mode 100644 libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml delete mode 100644 libraries/designsystem/src/main/res/drawable/ic_close.xml delete mode 100644 libraries/designsystem/src/main/res/drawable/ic_group.xml create mode 100644 libraries/designsystem/src/main/res/drawable/ic_groups.xml delete mode 100644 libraries/designsystem/src/main/res/drawable/ic_search.xml diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index aa75f88005..0e6d8253a3 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -19,6 +19,9 @@ package io.element.android.features.createroom.root import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Search import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SearchBarDefaults import androidx.compose.runtime.Composable @@ -85,7 +88,7 @@ fun CreateRoomRootScreen( if (!isSearchActive) { TextIconButton( modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), - imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), + imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_groups), text = stringResource(id = StringR.string.new_room), onClick = onNewRoomClicked, ) @@ -118,7 +121,7 @@ fun CreateRoomRootViewTopBar( }, actions = { IconButton(onClick = onClosePressed) { - Icon(resourceId = DrawableR.drawable.ic_close, contentDescription = stringResource(id = StringR.string.action_close)) + Icon(imageVector = Icons.Default.Close, contentDescription = stringResource(id = StringR.string.action_close)) } } ) @@ -161,11 +164,11 @@ fun CreateRoomSearchBar( trailingIcon = { if (active) { IconButton(onClick = { onTextChanged("") }) { - Icon(DrawableR.drawable.ic_close, stringResource(StringR.string.a11y_clear)) + Icon(Icons.Default.Close, stringResource(StringR.string.a11y_clear)) } } else { Icon( - resourceId = DrawableR.drawable.ic_search, + imageVector = Icons.Default.Search, contentDescription = stringResource(StringR.string.search), modifier = Modifier.alpha(0.4f), // FIXME align on Design system theme (removing alpha should be fine) ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt index c6775a418b..957526567f 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt @@ -16,25 +16,25 @@ package io.element.android.libraries.designsystem.components.button -import androidx.annotation.DrawableRes import androidx.compose.foundation.layout.Column -import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton -import io.element.android.libraries.designsystem.R as DrawableR import io.element.android.libraries.ui.strings.R as StringR @Composable fun BackButton( onClick: () -> Unit, modifier: Modifier = Modifier, - @DrawableRes icon: Int = DrawableR.drawable.ic_arrow_back, + imageVector: ImageVector = Icons.Default.ArrowBack, contentDescription: String = stringResource(StringR.string.a11y_back), enabled: Boolean = true ) { @@ -43,7 +43,7 @@ fun BackButton( onClick = onClick, enabled = enabled, ) { - Icon(resourceId = icon, contentDescription = contentDescription) + Icon(imageVector = imageVector, contentDescription = contentDescription) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt index 3fd8d1c348..980dc39aa6 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt @@ -75,7 +75,7 @@ private fun ContentToPreview() { Column { TextIconButton( modifier = Modifier.padding(horizontal = 8.dp), - imageVector = ImageVector.vectorResource(R.drawable.ic_group), + imageVector = ImageVector.vectorResource(R.drawable.ic_groups), text = "Click me!", onClick = {}, ) diff --git a/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml b/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml deleted file mode 100644 index 4adfb72ad7..0000000000 --- a/libraries/designsystem/src/main/res/drawable/ic_arrow_back.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/libraries/designsystem/src/main/res/drawable/ic_close.xml b/libraries/designsystem/src/main/res/drawable/ic_close.xml deleted file mode 100644 index a54429f21f..0000000000 --- a/libraries/designsystem/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/libraries/designsystem/src/main/res/drawable/ic_group.xml b/libraries/designsystem/src/main/res/drawable/ic_group.xml deleted file mode 100644 index 296a7764d9..0000000000 --- a/libraries/designsystem/src/main/res/drawable/ic_group.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/libraries/designsystem/src/main/res/drawable/ic_groups.xml b/libraries/designsystem/src/main/res/drawable/ic_groups.xml new file mode 100644 index 0000000000..9e87f1d533 --- /dev/null +++ b/libraries/designsystem/src/main/res/drawable/ic_groups.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/libraries/designsystem/src/main/res/drawable/ic_search.xml b/libraries/designsystem/src/main/res/drawable/ic_search.xml deleted file mode 100644 index f4b23a8463..0000000000 --- a/libraries/designsystem/src/main/res/drawable/ic_search.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/libraries/designsystem/src/main/res/drawable/ic_share.xml b/libraries/designsystem/src/main/res/drawable/ic_share.xml index 0291c72fb6..d38f7ae5f7 100644 --- a/libraries/designsystem/src/main/res/drawable/ic_share.xml +++ b/libraries/designsystem/src/main/res/drawable/ic_share.xml @@ -15,12 +15,11 @@ --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="@android:color/black" + android:pathData="M18.001,21.75C17.237,21.75 16.588,21.483 16.053,20.948C15.518,20.413 15.25,19.764 15.25,19C15.25,18.875 15.26,18.746 15.28,18.612C15.3,18.478 15.33,18.355 15.369,18.242L7.973,13.911C7.709,14.174 7.408,14.38 7.071,14.528C6.734,14.676 6.377,14.75 6,14.75C5.236,14.75 4.587,14.483 4.052,13.948C3.517,13.414 3.25,12.765 3.25,12.001C3.25,11.238 3.517,10.588 4.052,10.053C4.587,9.518 5.236,9.25 6,9.25C6.377,9.25 6.734,9.324 7.071,9.472C7.408,9.62 7.709,9.826 7.973,10.089L15.369,5.758C15.33,5.645 15.3,5.522 15.28,5.388C15.26,5.254 15.25,5.125 15.25,5C15.25,4.236 15.517,3.587 16.052,3.052C16.586,2.517 17.235,2.25 17.999,2.25C18.762,2.25 19.412,2.517 19.947,3.052C20.482,3.586 20.75,4.235 20.75,4.999C20.75,5.762 20.483,6.412 19.948,6.947C19.413,7.482 18.764,7.75 18,7.75C17.623,7.75 17.266,7.676 16.929,7.528C16.592,7.38 16.291,7.174 16.027,6.912L8.631,11.242C8.67,11.355 8.7,11.478 8.72,11.611C8.74,11.745 8.75,11.874 8.75,11.998C8.75,12.122 8.74,12.252 8.72,12.387C8.7,12.521 8.67,12.645 8.631,12.758L16.027,17.088C16.291,16.826 16.592,16.62 16.929,16.472C17.266,16.324 17.623,16.25 18,16.25C18.764,16.25 19.413,16.517 19.948,17.052C20.483,17.586 20.75,18.235 20.75,18.999C20.75,19.762 20.483,20.412 19.948,20.947C19.414,21.482 18.765,21.75 18.001,21.75ZM18,6.25C18.347,6.25 18.643,6.129 18.886,5.886C19.128,5.643 19.25,5.347 19.25,5C19.25,4.653 19.128,4.357 18.886,4.114C18.643,3.871 18.347,3.75 18,3.75C17.653,3.75 17.357,3.871 17.114,4.114C16.871,4.357 16.75,4.653 16.75,5C16.75,5.347 16.871,5.643 17.114,5.886C17.357,6.129 17.653,6.25 18,6.25ZM6,13.25C6.347,13.25 6.643,13.128 6.886,12.886C7.129,12.643 7.25,12.347 7.25,12C7.25,11.653 7.129,11.357 6.886,11.114C6.643,10.871 6.347,10.75 6,10.75C5.653,10.75 5.357,10.871 5.114,11.114C4.871,11.357 4.75,11.653 4.75,12C4.75,12.347 4.871,12.643 5.114,12.886C5.357,13.128 5.653,13.25 6,13.25ZM18,20.25C18.347,20.25 18.643,20.128 18.886,19.886C19.128,19.643 19.25,19.347 19.25,19C19.25,18.653 19.128,18.357 18.886,18.114C18.643,17.871 18.347,17.75 18,17.75C17.653,17.75 17.357,17.871 17.114,18.114C16.871,18.357 16.75,18.653 16.75,19C16.75,19.347 16.871,19.643 17.114,19.886C17.357,20.128 17.653,20.25 18,20.25Z" /> From c662b221c9c4e92c29f712bf51fc0948b0724aa5 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 8 Mar 2023 11:51:59 +0100 Subject: [PATCH 32/34] Rework create room action buttons and remove custom TextIconButton --- .../createroom/root/CreateRoomRootScreen.kt | 72 ++++++++++++---- .../components/button/TextIconButton.kt | 83 ------------------- 2 files changed, 56 insertions(+), 99 deletions(-) delete mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index 0e6d8253a3..d04eb22bd1 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -16,8 +16,13 @@ package io.element.android.features.createroom.root +import androidx.annotation.DrawableRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close @@ -29,20 +34,18 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.element.android.libraries.designsystem.components.button.BackButton -import io.element.android.libraries.designsystem.components.button.TextIconButton import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.CenterAlignedTopAppBar @@ -74,7 +77,8 @@ fun CreateRoomRootScreen( } ) { paddingValues -> Column( - modifier = Modifier.padding(paddingValues) + modifier = Modifier.padding(paddingValues), + verticalArrangement = Arrangement.spacedBy(8.dp), ) { CreateRoomSearchBar( modifier = Modifier.fillMaxWidth(), @@ -86,18 +90,9 @@ fun CreateRoomRootScreen( ) if (!isSearchActive) { - TextIconButton( - modifier = Modifier.padding(start = 8.dp, top = 16.dp, end = 8.dp), - imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_groups), - text = stringResource(id = StringR.string.new_room), - onClick = onNewRoomClicked, - ) - - TextIconButton( - modifier = Modifier.padding(horizontal = 8.dp), - imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_share), - text = stringResource(id = StringR.string.invite_people_menu), - onClick = onInvitePeopleClicked, + CreateRoomActionButtonsList( + onNewRoomClicked = onNewRoomClicked, + onInvitePeopleClicked = onInvitePeopleClicked, ) } } @@ -180,6 +175,51 @@ fun CreateRoomSearchBar( ) } +@Composable +fun CreateRoomActionButtonsList( + modifier: Modifier = Modifier, + onNewRoomClicked: () -> Unit = {}, + onInvitePeopleClicked: () -> Unit = {}, +) { + Column(modifier = modifier) { + CreateRoomActionButton( + iconRes = DrawableR.drawable.ic_groups, + text = stringResource(id = StringR.string.new_room), + onClick = onNewRoomClicked, + ) + CreateRoomActionButton( + iconRes = DrawableR.drawable.ic_share, + text = stringResource(id = StringR.string.invite_people_menu), + onClick = onInvitePeopleClicked, + ) + } +} + +@Composable +fun CreateRoomActionButton( + @DrawableRes iconRes: Int, + text: String, + modifier: Modifier = Modifier, + onClick: () -> Unit = {}, +) { + Row( + modifier = modifier + .fillMaxWidth() + .heightIn(min = 56.dp) + .clickable { onClick() } + .padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + modifier = Modifier.alpha(0.5f), // FIXME align on Design system theme (removing alpha should be fine) + resourceId = iconRes, + contentDescription = null, + ) + Text(text = text) + } +} + @Preview @Composable fun CreateRoomRootViewLightPreview(@PreviewParameter(CreateRoomRootStateProvider::class) state: CreateRoomRootState) = diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt deleted file mode 100644 index 980dc39aa6..0000000000 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/TextIconButton.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2023 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.libraries.designsystem.components.button - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import io.element.android.libraries.designsystem.R -import io.element.android.libraries.designsystem.preview.ElementPreviewDark -import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.designsystem.theme.components.TextButton - -@Composable -fun TextIconButton( - imageVector: ImageVector, - text: String, - modifier: Modifier = Modifier, - iconSize: Dp = 24.dp, - onClick: () -> Unit = {}, -) { - TextButton( - modifier = modifier, - onClick = onClick - ) { - Image( - imageVector = imageVector, - contentDescription = "", - modifier = Modifier.size(iconSize), - contentScale = ContentScale.Inside, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), - ) - Text( - modifier = Modifier.padding(horizontal = 8.dp), - text = text, - ) - } -} - -@Preview -@Composable -internal fun TextIconButtonPreviewLight() = ElementPreviewLight { ContentToPreview() } - -@Preview -@Composable -internal fun TextIconButtonPreviewDark() = ElementPreviewDark { ContentToPreview() } - -@Composable -private fun ContentToPreview() { - Column { - TextIconButton( - modifier = Modifier.padding(horizontal = 8.dp), - imageVector = ImageVector.vectorResource(R.drawable.ic_groups), - text = "Click me!", - onClick = {}, - ) - } -} From 9a5455e2643442bcf29bc0dddcae3801c119ec90 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 8 Mar 2023 13:40:24 +0100 Subject: [PATCH 33/34] Move button actions to view events --- .../features/createroom/root/CreateRoomRootEvents.kt | 4 ++-- .../android/features/createroom/root/CreateRoomRootNode.kt | 2 -- .../features/createroom/root/CreateRoomRootPresenter.kt | 3 ++- .../features/createroom/root/CreateRoomRootScreen.kt | 6 ++---- .../createroom/root/CreateRoomRootPresenterTests.kt | 3 ++- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt index 5c051abf69..820d071866 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootEvents.kt @@ -16,7 +16,7 @@ package io.element.android.features.createroom.root -// TODO Add your events or remove the file completely if no events sealed interface CreateRoomRootEvents { - object MyEvent : CreateRoomRootEvents + object CreateRoom : CreateRoomRootEvents + object InvitePeople : CreateRoomRootEvents } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt index 1929926df5..8d3d41b434 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootNode.kt @@ -47,8 +47,6 @@ class CreateRoomRootNode @AssistedInject constructor( state = state, modifier = modifier, onClosePressed = this::navigateUp, - onNewRoomClicked = { /* TODO Handle new room action */ }, - onInvitePeopleClicked = { /* TODO Handle invite people action */ }, ) } } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt index 287e4d6e42..ad93d9143d 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenter.kt @@ -27,7 +27,8 @@ class CreateRoomRootPresenter @Inject constructor() : Presenter Unit + CreateRoomRootEvents.CreateRoom -> Unit // Todo Handle create room action + CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action } } diff --git a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt index d04eb22bd1..889207265e 100644 --- a/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt +++ b/features/createroom/src/main/kotlin/io/element/android/features/createroom/root/CreateRoomRootScreen.kt @@ -63,8 +63,6 @@ fun CreateRoomRootScreen( state: CreateRoomRootState, modifier: Modifier = Modifier, onClosePressed: () -> Unit = {}, - onNewRoomClicked: () -> Unit = {}, - onInvitePeopleClicked: () -> Unit = {}, ) { var searchText by rememberSaveable { mutableStateOf("") } var isSearchActive by rememberSaveable { mutableStateOf(false) } @@ -91,8 +89,8 @@ fun CreateRoomRootScreen( if (!isSearchActive) { CreateRoomActionButtonsList( - onNewRoomClicked = onNewRoomClicked, - onInvitePeopleClicked = onInvitePeopleClicked, + onNewRoomClicked = { state.eventSink(CreateRoomRootEvents.CreateRoom) }, + onInvitePeopleClicked = { state.eventSink(CreateRoomRootEvents.InvitePeople) }, ) } } diff --git a/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt b/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt index c57c24d75c..c03b48efa8 100644 --- a/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt +++ b/features/createroom/src/test/kotlin/io/element/android/features/createroom/root/CreateRoomRootPresenterTests.kt @@ -46,7 +46,8 @@ class CreateRoomRootPresenterTests { presenter.present() }.test { val initialState = awaitItem() - initialState.eventSink.invoke(CreateRoomRootEvents.MyEvent) + initialState.eventSink(CreateRoomRootEvents.CreateRoom) // Not implemented yet + initialState.eventSink(CreateRoomRootEvents.InvitePeople) // Not implemented yet } } } From cb5652cb1ac7141ea357d4a1ca66abc63d12867c Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 8 Mar 2023 15:50:38 +0100 Subject: [PATCH 34/34] Update screenshot tests --- ...CreateRoomRootViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png | 3 +++ ...reateRoomRootViewLightPreview_0_null_0,NEXUS_5,1.0,en].png | 3 +++ ...up_LoginRootScreenDarkPreview_0_null_2,NEXUS_5,1.0,en].png | 4 ++-- ...up_LoginRootScreenDarkPreview_0_null_3,NEXUS_5,1.0,en].png | 4 ++-- ...up_LoginRootScreenDarkPreview_0_null_4,NEXUS_5,1.0,en].png | 4 ++-- ...up_LoginRootScreenDarkPreview_0_null_5,NEXUS_5,1.0,en].png | 4 ++-- ...p_LoginRootScreenLightPreview_0_null_2,NEXUS_5,1.0,en].png | 4 ++-- ...p_LoginRootScreenLightPreview_0_null_3,NEXUS_5,1.0,en].png | 4 ++-- ...p_LoginRootScreenLightPreview_0_null_4,NEXUS_5,1.0,en].png | 4 ++-- ...p_LoginRootScreenLightPreview_0_null_5,NEXUS_5,1.0,en].png | 4 ++-- ...efaultRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- ...faultRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- ...SearchRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- ...earchRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- ...Group_RoomListViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png | 4 ++-- ...roup_RoomListViewLightPreview_0_null_0,NEXUS_5,1.0,en].png | 4 ++-- ...aultGroup_BackButtonPreviewDark_0_null,NEXUS_5,1.0,en].png | 3 +++ ...ultGroup_BackButtonPreviewLight_0_null,NEXUS_5,1.0,en].png | 3 +++ ...nterAlignedTopAppBarDarkPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...terAlignedTopAppBarLightPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...roup_DockedSearchBarDarkPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...oup_DockedSearchBarLightPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...aultGroup_TextButtonDarkPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...ultGroup_TextButtonLightPreview_0_null,NEXUS_5,1.0,en].png | 3 +++ ...faultGroup_TextFieldDarkPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- ...aultGroup_TextFieldLightPreview_0_null,NEXUS_5,1.0,en].png | 4 ++-- 26 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewLightPreview_0_null_0,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewDark_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewLight_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarDarkPreview_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarLightPreview_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarDarkPreview_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarLightPreview_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonDarkPreview_0_null,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonLightPreview_0_null,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..5ae6ae4eb8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:510c17406a13ce64a9b7578d70535dac7fe20e9c3a9a4ab3c8cab775bc46f568 +size 19718 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewLightPreview_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewLightPreview_0_null_0,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..deae75a4c1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.createroom.root_null_DefaultGroup_CreateRoomRootViewLightPreview_0_null_0,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:611b1efa9cf46316f96738130f326061595d2648ac7fb059df299e7c95f4e2a8 +size 18480 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_2,NEXUS_5,1.0,en].png index c10eb7ab34..bbd5f35001 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3460e8f37e746e0ae7a30c1a055a3b68cc013197c4f2567d19ad51c00f8d6385 -size 34814 +oid sha256:a339ab789eb6710aa5edba53acc46a61de373566089590940ab4c8233e97558b +size 34721 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_3,NEXUS_5,1.0,en].png index 2d90c42c43..c9812164be 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_3,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_3,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f86089af6c02e8eb4811ae0092150c2d5e439731ae970e7954a66fca7f98fd11 -size 34173 +oid sha256:675c1cbfc80acec11434153dacb1d69b0cf6122fb068db8a92ae86e039a54c71 +size 34091 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_4,NEXUS_5,1.0,en].png index be36dc12f3..a9b5fb5ca8 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_4,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_4,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b21168d83ed8d7c116e72dd76292975530f1c898ef32502aa382f292aef4f8aa -size 30951 +oid sha256:8137f8ed97a1a924fc76e16c8f0f0fc5a4a866d989460859b98edfcb5c7f98b7 +size 30996 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_5,NEXUS_5,1.0,en].png index c10eb7ab34..bbd5f35001 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_5,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenDarkPreview_0_null_5,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3460e8f37e746e0ae7a30c1a055a3b68cc013197c4f2567d19ad51c00f8d6385 -size 34814 +oid sha256:a339ab789eb6710aa5edba53acc46a61de373566089590940ab4c8233e97558b +size 34721 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_2,NEXUS_5,1.0,en].png index 09d766510b..2ea09c2a08 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_2,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_2,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f81c7b793611e5f3f975245bf5ba52d59bf5725519292f05dd7840c2e38d3166 -size 33237 +oid sha256:04f73ec1830baa28808881f040f6bfc2b1ce0de1ca2d4b3e16a3b57513814a7f +size 33173 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_3,NEXUS_5,1.0,en].png index 5b28c7c462..98896a556b 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_3,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_3,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04c34dbc9fe2df9af3133e1b7c444d58e7d8a35161a97155c384dceac28ee698 -size 32324 +oid sha256:da84d9195ed0cac06efff562156ed8abc161a6dbd3272727c1cb787b83c62558 +size 32253 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_4,NEXUS_5,1.0,en].png index 06a59a90b8..f7e513c68a 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_4,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_4,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:922ee759a8e4b689ced8ade809c651464956395ffc0a2b3d9025f067a9807aa9 -size 30066 +oid sha256:ea2dce0fde5ff6563f283e643edadd5c95c29a4084c8f1d3902ec3c759cccea7 +size 30070 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_5,NEXUS_5,1.0,en].png index 09d766510b..2ea09c2a08 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_5,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.login.root_null_DefaultGroup_LoginRootScreenLightPreview_0_null_5,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f81c7b793611e5f3f975245bf5ba52d59bf5725519292f05dd7840c2e38d3166 -size 33237 +oid sha256:04f73ec1830baa28808881f040f6bfc2b1ce0de1ca2d4b3e16a3b57513814a7f +size 33173 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png index b5edb352b1..c8da465372 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81905bde677949780ef6c850be8dde97c88895b82d83414589e07f0725064050 -size 13530 +oid sha256:ff04bf07f8c24b3b19d4926bb3c51b257166befe062fe8b8012d2e92dbfe3491 +size 13477 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png index 66c888556b..7efc250776 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_DefaultRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:edd3b0f29a3fbf9035cc8ba1d7a5a3a74be30d4e6ec8f654832f7ee916497453 -size 12457 +oid sha256:e50325c75193e47958862ea9cb515d7c84d2c47a00b01256fc244319780c107f +size 12425 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png index 2f2ac0e0c0..7117d108dd 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0 -size 4462 +oid sha256:328963ebd74fbbe47fd4a4d1f0edce5bf014d88a266c114e50a5274e87a88fe8 +size 7154 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png index 2f2ac0e0c0..ae4bc09343 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist.components_null_DefaultGroup_SearchRoomListTopBarLightPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3764d8bd7dc2783a8af43aad65a217d7e533ed17c4d4367b7994470bf35b62b0 -size 4462 +oid sha256:007fd7051cb4b8059dc33ff1cd2b4be4cffaa5e1c129adb61dd4d9e8a561953f +size 7096 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png index 210094f29d..6a5b653e7b 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewDarkPreview_0_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a50e661d6c3c45574fa3d6fc64b0d5f2a1c9dbba18a77be900df1dfce9df1f69 -size 35103 +oid sha256:3c8868d4974f23637afed9ecd062b88421e2b39ffe22f19742b946afc91caeb6 +size 37838 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewLightPreview_0_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewLightPreview_0_null_0,NEXUS_5,1.0,en].png index 3bb09bb7f9..4a51d9cddc 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewLightPreview_0_null_0,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.features.roomlist_null_DefaultGroup_RoomListViewLightPreview_0_null_0,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d27f9fbe2b6d803198f0015cc391d6dfdd5d2708e837319c6eb0e82f8ab832c -size 33488 +oid sha256:43b69859fa3ee38d2b7f7415b87738db65dc6dac3d2fabddc1f1346b0b64932b +size 37329 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewDark_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewDark_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..bd230a9fea --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewDark_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17b110e460f4212927c46d593352dac88493bb7be9a5d2ae8b4e0b8e6c79d0bf +size 5695 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewLight_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewLight_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..56028abd8d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.components.button_null_DefaultGroup_BackButtonPreviewLight_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29c30e97a5c1de9e855001c6f27322bce8795954ac5c134c34ea3c9de417acd2 +size 5250 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarDarkPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..ca4e39a7d6 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b662595580f6e0dd4ff6722fc0c8db63b0811a615a41356ba6b28d22285b6765 +size 5813 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarLightPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..79f70acbbd --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_CenterAlignedTopAppBarLightPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8a9745199ef10a4e0c8e101203ce51999449b7c43bf8b764f162ea975ebaefe +size 5548 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarDarkPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..638282389c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e89807d72107f1f8337e8de803791249b56bde6c4961805520195ea55563749a +size 8470 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarLightPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..2cc70fcb06 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_DockedSearchBarLightPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6381c125b8eaf6b116218bc4b0efda4866f19514139f4b45604909e462931c1f +size 8320 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonDarkPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..3fb8762803 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fde95a558052ae09123d459249e9b2d8ba3a3f6adb1bba4002ac0aca90d5b657 +size 11668 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonLightPreview_0_null,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..c5f23652b9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextButtonLightPreview_0_null,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81be7efc599fbe85a373aecfe85047f521ad609ce6b85b343386bb101aaddb68 +size 10611 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldDarkPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldDarkPreview_0_null,NEXUS_5,1.0,en].png index 0ef46f591b..79af10a99c 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldDarkPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldDarkPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a796bba1f316b03793b415d109940940a6d81a924f55a745764bb6ec46cab40b -size 39585 +oid sha256:03bfd855f6e010d2d4dc0cb9f3c13e76a4f2bbcda98b086dabcd33f201ebe10a +size 39486 diff --git a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldLightPreview_0_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldLightPreview_0_null,NEXUS_5,1.0,en].png index 140a5324bd..4eb125e099 100644 --- a/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldLightPreview_0_null,NEXUS_5,1.0,en].png +++ b/tests/uitests/src/test/snapshots/images/io.element.android.tests.uitests_ScreenshotTest_preview_tests[io.element.android.libraries.designsystem.theme.components_null_DefaultGroup_TextFieldLightPreview_0_null,NEXUS_5,1.0,en].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5386114bbb3cbf6c8a3de0642f1efa7a3b5d7efa46168d70aeffc413e37ec803 -size 39014 +oid sha256:29bbaae8c846dfe05bb66e08debeb84422d45f88982f79faefb94f332843c26e +size 39069