From a0a0fae6ed1d23f2cbf35a899b0d88a83879af88 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 d26f8e8b2f477d17bf4967bf3fa5dd4989421764 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 a8101d3b328f1eb0eb8bed0fa25cac78dec6e730 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 5c80ec1854a959996facab27ae7cc17909eceb04 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 61a47769071e6979b2e44c5b634958f000ad87ca 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 2c86758d154ab223b25d5b7edd7e82086e528181 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 cec6d3ef88101571cc7304ecfbc0305a37102d6b 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 0470abadedfd958daf342a7cb9e5cc82fe8e54fd 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 3b60245355d1c857529f1804c089734d6fe99282 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 fd43b6b336bab31c581beb4a6ebc6cfcbbefa857 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 b3b47a55015232c0235974efc0bb8fa140e07c26 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 5b1dfb437cfafd4870b80aea10a38d5103d63a6c 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 103ba86236952e406ad93bda6ad98a2393f7fb60 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 4342c4ec0793656c49730c3666be9fd0e3994064 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 1f85df8a1aa8a38d019c4ce3a53abd0246c6897a 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 | 120 ++++++++++-------- .../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, 174 insertions(+), 53 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( + 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 - .fillMaxWidth() - .height(48.dp) - .background( - color = MaterialTheme.colorScheme.surfaceVariant, - shape = RoundedCornerShape(28.dp), + .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) ) - .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) - ) - } + }, + 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 d55a1ccb07df359e7a9532db9deef383359fc2c9 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 3efb141afccf586ef1a17d125819f92256db5875 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 cb15fe6d1e44100c9a0d62345e83ce73c074dd60 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 e6c7afd61477bbe1ca30c167cbafe50bd4d8ebf0 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 a7d46513afbf2dd2b1758f2ad96c72c052eac2a2 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 d29a15dc13a38c2e734980a444e9522358834c11 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 0557cdb0488a3e071b21977db5c60e6aab49498c 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 | 67 ++++++++++++------- 2 files changed, 45 insertions(+), 24 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)) - } + CreateRoomButton( + modifier = Modifier.padding(horizontal = 8.dp), + imageVector = ImageVector.vectorResource(DrawableR.drawable.ic_group), + text = stringResource(id = StringR.string.new_room), + onClick = onNewRoomClicked, + ) - 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_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 f022afd663043cc1c53b96fc87880fcf40ac1406 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 e5349040b2ff033143ea36b096e4e8277256d239 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 8bd40867b4a4e18f017b67c0c6fbac3955e862dc 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 e198e930904cbd05bb6111b72fc8e5e9392988d5 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 30979422b29dc84c915230e707ba286b1732e466 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 169d8dbd77e42e3b311051f4d9fe4e054c935d78 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 7af535abe02558374904afb9bd29e579d7a99b52 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 604d9447e426a714cbabe413208e0e4dec9c7779 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 5d521b5b9f3b69775a83dde6b23afc28bae9da84 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 3fc55a8d95eeb3f8df2062d09f84d77093e06ff2 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 73ef9180a2489d8a450a2afacb3bde494872aad2 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 2e06326ce771053e142670ad45406e94491bcf5c 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