From f5a2e2dd25b74cb07767e91e34c8a22900ed3626 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 5 Jul 2023 15:57:35 +0200 Subject: [PATCH] Waitlist screen --- .../features/login/impl/LoginFlowNode.kt | 25 +- .../login/impl/error/WaitListError.kt | 23 ++ .../loginpassword/LoginPasswordNode.kt | 12 +- .../loginpassword/LoginPasswordView.kt | 24 +- .../screens/waitlistscreen/WaitListEvents.kt | 22 ++ .../screens/waitlistscreen/WaitListNode.kt | 62 +++++ .../waitlistscreen/WaitListPresenter.kt | 93 +++++++ .../screens/waitlistscreen/WaitListState.kt | 28 +++ .../waitlistscreen/WaitListStateProvider.kt | 43 ++++ .../screens/waitlistscreen/WaitListView.kt | 231 ++++++++++++++++++ .../impl/src/main/res/drawable/light_dark.png | Bin 0 -> 106703 bytes .../waitlistscreen/WaitListPresenterTest.kt | 107 ++++++++ .../android/samples/minimal/LoginScreen.kt | 1 + 13 files changed, 662 insertions(+), 9 deletions(-) create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/WaitListError.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListEvents.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListNode.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt create mode 100644 features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt create mode 100644 features/login/impl/src/main/res/drawable/light_dark.png create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index f8d965ec6d..0ed5848240 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -18,7 +18,6 @@ package io.element.android.features.login.impl import android.app.Activity import android.os.Parcelable -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.Modifier @@ -28,6 +27,7 @@ import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.newRoot import com.bumble.appyx.navmodel.backstack.operation.push import com.bumble.appyx.navmodel.backstack.operation.singleTop import dagger.assisted.Assisted @@ -39,8 +39,10 @@ import io.element.android.features.login.impl.oidc.customtab.CustomTabHandler import io.element.android.features.login.impl.oidc.webview.OidcNode import io.element.android.features.login.impl.screens.changeaccountprovider.ChangeAccountProviderNode import io.element.android.features.login.impl.screens.confirmaccountprovider.ConfirmAccountProviderNode +import io.element.android.features.login.impl.screens.loginpassword.LoginFormState import io.element.android.features.login.impl.screens.loginpassword.LoginPasswordNode import io.element.android.features.login.impl.screens.searchaccountprovider.SearchAccountProviderNode +import io.element.android.features.login.impl.screens.waitlistscreen.WaitListNode import io.element.android.libraries.architecture.BackstackNode import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -88,6 +90,9 @@ class LoginFlowNode @AssistedInject constructor( @Parcelize object LoginPassword : NavTarget + @Parcelize + data class WaitList(val loginFormState: LoginFormState) : NavTarget + @Parcelize data class OidcView(val oidcDetails: OidcDetails) : NavTarget } @@ -144,12 +149,28 @@ class LoginFlowNode @AssistedInject constructor( createNode(buildContext, plugins = listOf(callback)) } NavTarget.LoginPassword -> { - createNode(buildContext, plugins = listOf()) + val callback = object : LoginPasswordNode.Callback { + override fun onWaitListError(loginFormState: LoginFormState) { + backstack.newRoot(NavTarget.WaitList(loginFormState)) + } + } + createNode(buildContext, plugins = listOf(callback)) } is NavTarget.OidcView -> { val input = OidcNode.Inputs(navTarget.oidcDetails) createNode(buildContext, plugins = listOf(input)) } + is NavTarget.WaitList -> { + val inputs = WaitListNode.Inputs( + loginFormState = navTarget.loginFormState, + ) + val callback = object : WaitListNode.Callback { + override fun onCancelClicked() { + navigateUp() + } + } + createNode(buildContext, plugins = listOf(callback, inputs)) + } } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/WaitListError.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/WaitListError.kt new file mode 100644 index 0000000000..99060f3464 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/WaitListError.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.login.impl.error + +import io.element.android.libraries.core.bool.orFalse + +fun Throwable.isWaitListError(): Boolean { + return message?.contains("IO_ELEMENT_X_WAIT_LIST").orFalse() +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordNode.kt index 630b08570c..cb5542d2eb 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordNode.kt @@ -21,6 +21,7 @@ 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 com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode @@ -33,13 +34,22 @@ class LoginPasswordNode @AssistedInject constructor( private val presenter: LoginPasswordPresenter, ) : Node(buildContext, plugins = plugins) { + interface Callback : Plugin { + fun onWaitListError(loginFormState: LoginFormState) + } + + private fun onWaitListError(loginFormState: LoginFormState) { + plugins().forEach { it.onWaitListError(loginFormState) } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() LoginPasswordView( state = state, modifier = modifier, - onBackPressed = ::navigateUp + onBackPressed = ::navigateUp, + onWaitListError = ::onWaitListError, ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt index 9d6fe7d1ea..e209a9af55 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt @@ -56,6 +56,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.features.login.impl.R +import io.element.android.features.login.impl.error.isWaitListError import io.element.android.features.login.impl.error.loginError import io.element.android.libraries.architecture.Async import io.element.android.libraries.designsystem.ElementTextStyles @@ -82,8 +83,9 @@ import io.element.android.libraries.ui.strings.CommonStrings @Composable fun LoginPasswordView( state: LoginPasswordState, - modifier: Modifier = Modifier, onBackPressed: () -> Unit, + onWaitListError: (LoginFormState) -> Unit, + modifier: Modifier = Modifier, ) { val isLoading by remember(state.loginAction) { derivedStateOf { @@ -133,7 +135,8 @@ fun LoginPasswordView( subTitle = stringResource(id = R.string.screen_login_form_header) ) Spacer(Modifier.height(32.dp)) - LoginForm(state = state, + LoginForm( + state = state, isLoading = isLoading, onSubmit = ::submit ) @@ -152,9 +155,16 @@ fun LoginPasswordView( } if (state.loginAction is Async.Failure) { - LoginErrorDialog(error = state.loginAction.error, onDismiss = { - state.eventSink(LoginPasswordEvents.ClearError) - }) + when { + state.loginAction.error.isWaitListError() -> { + onWaitListError(state.formState) + } + else -> { + LoginErrorDialog(error = state.loginAction.error, onDismiss = { + state.eventSink(LoginPasswordEvents.ClearError) + }) + } + } } } } @@ -269,6 +279,7 @@ internal fun LoginForm( @Composable internal fun LoginErrorDialog(error: Throwable, onDismiss: () -> Unit) { ErrorDialog( + title = stringResource(id = CommonStrings.dialog_title_error), content = stringResource(loginError(error)), onDismiss = onDismiss ) @@ -288,6 +299,7 @@ internal fun LoginPasswordViewDarkPreview(@PreviewParameter(LoginPasswordStatePr private fun ContentToPreview(state: LoginPasswordState) { LoginPasswordView( state = state, - onBackPressed = {} + onBackPressed = {}, + onWaitListError = {}, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListEvents.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListEvents.kt new file mode 100644 index 0000000000..5604789f55 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListEvents.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.login.impl.screens.waitlistscreen + +sealed interface WaitListEvents { + object AttemptLogin : WaitListEvents + object ClearError : WaitListEvents +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListNode.kt new file mode 100644 index 0000000000..24b5f271a0 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListNode.kt @@ -0,0 +1,62 @@ +/* + * 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.login.impl.screens.waitlistscreen + +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 com.bumble.appyx.core.plugin.plugins +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.features.login.impl.screens.loginpassword.LoginFormState +import io.element.android.libraries.architecture.NodeInputs +import io.element.android.libraries.architecture.inputs +import io.element.android.libraries.di.AppScope + +@ContributesNode(AppScope::class) +class WaitListNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + presenterFactory: WaitListPresenter.Factory, +) : Node(buildContext, plugins = plugins) { + + data class Inputs(val loginFormState: LoginFormState) : NodeInputs + + private val inputs: Inputs = inputs() + private val presenter = presenterFactory.create(inputs.loginFormState) + + interface Callback : Plugin { + fun onCancelClicked() + } + + private fun onCancelClicked() { + plugins().forEach { it.onCancelClicked() } + } + + @Composable + override fun View(modifier: Modifier) { + val state = presenter.present() + WaitListView( + state = state, + onCancelClicked = ::onCancelClicked, + modifier = modifier + ) + } +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt new file mode 100644 index 0000000000..061872839b --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenter.kt @@ -0,0 +1,93 @@ +/* + * 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.login.impl.screens.waitlistscreen + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import io.element.android.features.login.impl.screens.loginpassword.LoginFormState +import io.element.android.libraries.architecture.Async +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.core.meta.BuildMeta +import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService +import io.element.android.libraries.matrix.api.core.SessionId +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import timber.log.Timber + +class WaitListPresenter @AssistedInject constructor( + @Assisted private val formState: LoginFormState, + private val buildMeta: BuildMeta, + private val authenticationService: MatrixAuthenticationService, +) : Presenter { + + @AssistedFactory + interface Factory { + fun create(loginFormState: LoginFormState): WaitListPresenter + } + + @Composable + override fun present(): WaitListState { + val coroutineScope = rememberCoroutineScope() + val homeserverUrl = remember { + authenticationService.getHomeserverDetails().value?.url ?: "server" + } + + val loginAction: MutableState> = remember { + mutableStateOf(Async.Uninitialized) + } + + val attemptNumber: MutableState = remember { mutableStateOf(0) } + + fun handleEvents(event: WaitListEvents) { + when (event) { + WaitListEvents.AttemptLogin -> { + // Do not attempt to login on first resume of the View. + attemptNumber.value++ + if (attemptNumber.value > 1) { + coroutineScope.loginAttempt(formState, loginAction) + } + } + WaitListEvents.ClearError -> loginAction.value = Async.Uninitialized + } + } + + return WaitListState( + appName = buildMeta.applicationName, + serverName = homeserverUrl, + loginAction = loginAction.value, + eventSink = ::handleEvents + ) + } + + private fun CoroutineScope.loginAttempt(formState: LoginFormState, loggedInState: MutableState>) = launch { + Timber.w("Attempt to login...") + loggedInState.value = Async.Loading() + authenticationService.login(formState.login.trim(), formState.password) + .onSuccess { sessionId -> + loggedInState.value = Async.Success(sessionId) + } + .onFailure { failure -> + loggedInState.value = Async.Failure(failure) + } + } +} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt new file mode 100644 index 0000000000..f50de7e194 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListState.kt @@ -0,0 +1,28 @@ +/* + * 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.login.impl.screens.waitlistscreen + +import io.element.android.libraries.architecture.Async +import io.element.android.libraries.matrix.api.core.SessionId + +// Do not use default value, so no member get forgotten in the presenters. +data class WaitListState( + val appName: String, + val serverName: String, + val loginAction: Async, + val eventSink: (WaitListEvents) -> Unit +) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt new file mode 100644 index 0000000000..f7cd26209c --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListStateProvider.kt @@ -0,0 +1,43 @@ +/* + * 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.login.impl.screens.waitlistscreen + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.architecture.Async +import io.element.android.libraries.matrix.api.core.SessionId + +open class WaitListStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aWaitListState(loginAction = Async.Uninitialized), + aWaitListState(loginAction = Async.Loading()), + aWaitListState(loginAction = Async.Failure(Throwable())), + aWaitListState(loginAction = Async.Failure(Throwable(message = "IO_ELEMENT_X_WAIT_LIST"))), + // Add other state here + ) +} + +fun aWaitListState( + appName: String = "Element", + serverName: String = "server.org", + loginAction: Async = Async.Uninitialized, +) = WaitListState( + appName = appName, + serverName = serverName, + loginAction = loginAction, + eventSink = {} +) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt new file mode 100644 index 0000000000..f611c5ef20 --- /dev/null +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListView.kt @@ -0,0 +1,231 @@ +/* + * 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.login.impl.screens.waitlistscreen + +import androidx.annotation.StringRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.layout.widthIn +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.BiasAbsoluteAlignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import androidx.lifecycle.Lifecycle +import io.element.android.features.login.impl.R +import io.element.android.features.login.impl.error.isWaitListError +import io.element.android.features.login.impl.error.loginError +import io.element.android.libraries.designsystem.components.dialogs.RetryDialog +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.TextButton +import io.element.android.libraries.designsystem.utils.OnLifecycleEvent +import io.element.android.libraries.theme.ElementTheme +import io.element.android.libraries.ui.strings.CommonStrings + +// Ref: https://www.figma.com/file/0MMNu7cTOzLOlWb7ctTkv3/Element-X?type=design&node-id=6761-148425 +// Only the first screen can be displayed, since once logged in, this Node will be remove by the RootNode. +@Composable +fun WaitListView( + state: WaitListState, + onCancelClicked: () -> Unit, + modifier: Modifier = Modifier, +) { + OnLifecycleEvent { _, event -> + when (event) { + Lifecycle.Event.ON_RESUME -> state.eventSink.invoke(WaitListEvents.AttemptLogin) + else -> Unit + } + } + + Box(modifier = modifier) { + WaitListBackground() + WaitListContent(state, onCancelClicked) + WaitListError(state) + } +} + +@Composable +private fun WaitListError(state: WaitListState) { + // Display a dialog for error other than the waitlist error + state.loginAction.errorOrNull()?.let { error -> + if (error.isWaitListError().not()) { + RetryDialog( + content = stringResource(id = loginError(error)), + onRetry = { + state.eventSink.invoke(WaitListEvents.AttemptLogin) + }, + onDismiss = { + state.eventSink.invoke(WaitListEvents.ClearError) + } + ) + } + } +} + +@Composable +private fun WaitListBackground( + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.fillMaxSize()) { + Box( + modifier = Modifier + .fillMaxWidth() + .weight(0.3f) + .background(Color.White) + ) + Image( + modifier = Modifier + .fillMaxWidth(), + painter = painterResource(id = R.drawable.light_dark), + contentScale = ContentScale.Crop, + contentDescription = null, + ) + Box( + modifier = Modifier + .fillMaxWidth() + .weight(0.7f) + .background(Color(0xFF121418)) + ) + } +} + +@Composable +private fun WaitListContent( + state: WaitListState, + onCancelClicked: () -> Unit, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxSize() + .systemBarsPadding() + .padding(horizontal = 16.dp, vertical = 16.dp) + ) { + TextButton( + onClick = onCancelClicked, + colors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = Color.Black, + disabledContainerColor = Color.White, + disabledContentColor = Color.Black, + ), + ) { + Text( + text = stringResource(CommonStrings.action_cancel), + style = ElementTheme.typography.fontBodyLgMedium, + ) + } + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = BiasAbsoluteAlignment( + horizontalBias = 0f, + verticalBias = -0.05f + ) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (state.loginAction.isLoading()) { + CircularProgressIndicator( + modifier = Modifier.size(24.dp), + strokeWidth = 2.dp, + color = Color.White + ) + } else { + Spacer(modifier = Modifier.height(24.dp)) + } + Spacer(modifier = Modifier.height(18.dp)) + Text( + text = withColoredPeriod(R.string.screen_waitlist_title), + style = ElementTheme.typography.fontHeadingXlBold, + textAlign = TextAlign.Center, + color = Color.White, + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + modifier = Modifier.widthIn(max = 360.dp), + text = stringResource( + id = R.string.screen_waitlist_message, + state.appName, + state.serverName, + ), + style = ElementTheme.typography.fontBodyLgRegular, + textAlign = TextAlign.Center, + color = Color.White, + ) + } + } + } +} + +@Composable +private fun withColoredPeriod( + @StringRes textRes: Int, +) = buildAnnotatedString { + val text = stringResource(textRes) + append(text) + if (text.endsWith(".")) { + addStyle( + style = SpanStyle( + // Light.colorGreen700 + color = Color(0xff0bc491), + ), + start = text.length - 1, + end = text.length, + ) + } +} + +@Preview +@Composable +internal fun WaitListViewLightPreview(@PreviewParameter(WaitListStateProvider::class) state: WaitListState) = + ElementPreviewLight { ContentToPreview(state) } + +@Preview +@Composable +internal fun WaitListViewDarkPreview(@PreviewParameter(WaitListStateProvider::class) state: WaitListState) = + ElementPreviewDark { ContentToPreview(state) } + +@Composable +private fun ContentToPreview(state: WaitListState) { + WaitListView( + state = state, + onCancelClicked = {}, + ) +} diff --git a/features/login/impl/src/main/res/drawable/light_dark.png b/features/login/impl/src/main/res/drawable/light_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8572310364f666ab52e187c897105b24532d7075 GIT binary patch literal 106703 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 literal 0 HcmV?d00001 diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt new file mode 100644 index 0000000000..f997399e04 --- /dev/null +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/waitlistscreen/WaitListPresenterTest.kt @@ -0,0 +1,107 @@ +/* + * 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.login.impl.screens.waitlistscreen + +import app.cash.molecule.RecompositionClock +import app.cash.molecule.moleculeFlow +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import io.element.android.features.login.impl.screens.loginpassword.LoginFormState +import io.element.android.libraries.architecture.Async +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.test.A_HOMESERVER +import io.element.android.libraries.matrix.test.A_HOMESERVER_URL +import io.element.android.libraries.matrix.test.A_THROWABLE +import io.element.android.libraries.matrix.test.A_USER_ID +import io.element.android.libraries.matrix.test.auth.FakeAuthenticationService +import io.element.android.libraries.matrix.test.core.aBuildMeta +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class WaitListPresenterTest { + @Test + fun `present - initial state`() = runTest { + val authenticationService = FakeAuthenticationService().apply { + givenHomeserver(A_HOMESERVER) + } + val presenter = WaitListPresenter( + LoginFormState.Default, + aBuildMeta(applicationName = "Application Name"), + authenticationService, + ) + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.appName).isEqualTo("Application Name") + assertThat(initialState.serverName).isEqualTo(A_HOMESERVER_URL) + assertThat(initialState.loginAction).isEqualTo(Async.Uninitialized) + } + } + + @Test + fun `present - attempt login with error`() = runTest { + val authenticationService = FakeAuthenticationService().apply { + givenLoginError(A_THROWABLE) + } + val presenter = WaitListPresenter( + LoginFormState.Default, + aBuildMeta(), + authenticationService, + ) + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + // First usage of AttemptLogin, nothing should happen + initialState.eventSink.invoke(WaitListEvents.AttemptLogin) + expectNoEvents() + initialState.eventSink.invoke(WaitListEvents.AttemptLogin) + val submitState = awaitItem() + assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + val errorState = awaitItem() + assertThat(errorState.loginAction).isEqualTo(Async.Failure(A_THROWABLE)) + // Assert the error can be cleared + errorState.eventSink(WaitListEvents.ClearError) + val clearedState = awaitItem() + assertThat(clearedState.loginAction).isEqualTo(Async.Uninitialized) + } + } + + @Test + fun `present - attempt login with success`() = runTest { + val authenticationService = FakeAuthenticationService() + val presenter = WaitListPresenter( + LoginFormState.Default, + aBuildMeta(), + authenticationService, + ) + moleculeFlow(RecompositionClock.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + // First usage of AttemptLogin, nothing should happen + initialState.eventSink.invoke(WaitListEvents.AttemptLogin) + expectNoEvents() + initialState.eventSink.invoke(WaitListEvents.AttemptLogin) + val submitState = awaitItem() + assertThat(submitState.loginAction).isInstanceOf(Async.Loading::class.java) + val successState = awaitItem() + assertThat(successState.loginAction).isEqualTo(Async.Success(A_USER_ID)) + } + } +} diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/LoginScreen.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/LoginScreen.kt index 54bef4652b..663e92fa04 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/LoginScreen.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/LoginScreen.kt @@ -46,6 +46,7 @@ class LoginScreen(private val authenticationService: MatrixAuthenticationService state = state, modifier = modifier, onBackPressed = {}, + onWaitListError = {}, ) } }