diff --git a/app/src/main/java/io/element/android/x/Navigation.kt b/app/src/main/java/io/element/android/x/Navigation.kt index 90e76d7929..5e67ebfff4 100644 --- a/app/src/main/java/io/element/android/x/Navigation.kt +++ b/app/src/main/java/io/element/android/x/Navigation.kt @@ -30,7 +30,6 @@ fun OnBoardingScreenNavigation(navigator: DestinationsNavigator) { @Composable fun LoginScreenNavigation(navigator: DestinationsNavigator) { LoginScreen( - homeserver = "matrix.org", onChangeServer = { navigator.navigate(ChangeServerScreenNavigationDestination) }, diff --git a/features/login/src/main/java/io/element/android/x/features/login/LoginScreen.kt b/features/login/src/main/java/io/element/android/x/features/login/LoginScreen.kt index 42b7cf792f..7634f87f34 100644 --- a/features/login/src/main/java/io/element/android/x/features/login/LoginScreen.kt +++ b/features/login/src/main/java/io/element/android/x/features/login/LoginScreen.kt @@ -25,21 +25,21 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.compose.collectAsState import com.airbnb.mvrx.compose.mavericksViewModel import io.element.android.x.designsystem.ElementXTheme +import timber.log.Timber @Composable fun LoginScreen( viewModel: LoginViewModel = mavericksViewModel(), - homeserver: String, onChangeServer: () -> Unit = { }, onLoginWithSuccess: () -> Unit = { }, ) { val state: LoginViewState by viewModel.collectAsState() LaunchedEffect(key1 = Unit) { - viewModel.homeserver = homeserver + Timber.d("resume") + viewModel.onResume() } LoginContent( state = state, - homeserver = homeserver, onChangeServer = onChangeServer, onLoginChanged = viewModel::onSetName, onPasswordChanged = viewModel::onSetPassword, @@ -53,7 +53,6 @@ fun LoginScreen( @Composable fun LoginContent( state: LoginViewState, - homeserver: String = "", onChangeServer: () -> Unit = {}, onLoginChanged: (String) -> Unit = {}, onPasswordChanged: (String) -> Unit = {}, @@ -92,7 +91,7 @@ fun LoginContent( modifier = Modifier.fillMaxWidth() ) { OutlinedTextField( - value = homeserver, + value = state.homeserver, modifier = Modifier.fillMaxWidth(), onValueChange = { /* no op */ }, enabled = false, @@ -178,8 +177,9 @@ fun LoginContent( private fun LoginContentPreview() { ElementXTheme(darkTheme = false) { LoginContent( - state = LoginViewState(), - homeserver = "matrix.org", + state = LoginViewState( + homeserver = "matrix.org", + ), ) } } diff --git a/features/login/src/main/java/io/element/android/x/features/login/LoginViewModel.kt b/features/login/src/main/java/io/element/android/x/features/login/LoginViewModel.kt index f3a3210148..1218f63b63 100644 --- a/features/login/src/main/java/io/element/android/x/features/login/LoginViewModel.kt +++ b/features/login/src/main/java/io/element/android/x/features/login/LoginViewModel.kt @@ -9,10 +9,17 @@ import kotlinx.coroutines.launch class LoginViewModel(initialState: LoginViewState) : MavericksViewModel(initialState) { - lateinit var homeserver: String - private val matrix = MatrixInstance.getInstance() + fun onResume() { + val currentHomeserver = matrix.getHomeserverOrDefault() + setState { + copy( + homeserver = currentHomeserver + ) + } + } + fun onSubmit() = withState { state -> setState { copy(isLoggedIn = Loading()) @@ -20,8 +27,10 @@ class LoginViewModel(initialState: LoginViewState) : viewModelScope.launch { suspend { - // Ensure the server is passed to the Rust SDK - matrix.setHomeserver(homeserver) + // Ensure the server is provided to the Rust SDK + if (matrix.getHomeserver() == null) { + matrix.setHomeserver(state.homeserver) + } matrix.login(state.login, state.password) matrix.activeClient().startSync() }.execute { diff --git a/features/login/src/main/java/io/element/android/x/features/login/LoginViewState.kt b/features/login/src/main/java/io/element/android/x/features/login/LoginViewState.kt index 09496c5662..2a92a39e4e 100644 --- a/features/login/src/main/java/io/element/android/x/features/login/LoginViewState.kt +++ b/features/login/src/main/java/io/element/android/x/features/login/LoginViewState.kt @@ -6,6 +6,7 @@ import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.Uninitialized data class LoginViewState( + val homeserver: String = "", val login: String = "", val password: String = "", val isLoggedIn: Async = Uninitialized, diff --git a/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewModel.kt b/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewModel.kt index 9875546f5e..f92ccd442c 100644 --- a/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewModel.kt +++ b/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewModel.kt @@ -10,6 +10,14 @@ class ChangeServerViewModel(initialState: ChangeServerViewState) : private val matrix = MatrixInstance.getInstance() + init { + setState { + copy( + homeserver = matrix.getHomeserverOrDefault() + ) + } + } + fun setServer(server: String) { setState { copy(homeserver = server) diff --git a/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewState.kt b/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewState.kt index fd0439a0fa..34a7d4aeb8 100644 --- a/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewState.kt +++ b/features/login/src/main/java/io/element/android/x/features/login/changeserver/ChangeServerViewState.kt @@ -6,7 +6,7 @@ import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.Uninitialized data class ChangeServerViewState( - val homeserver: String = "matrix.org", + val homeserver: String = "", val changeServerAction: Async = Uninitialized, ) : MavericksState { val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Loading diff --git a/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt b/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt index 72a7bfc573..c94a2e7306 100644 --- a/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt +++ b/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt @@ -70,6 +70,10 @@ class Matrix( } } + fun getHomeserver(): String? = authService.homeserverDetails()?.url() + + fun getHomeserverOrDefault(): String = getHomeserver() ?: "matrix.org" + suspend fun setHomeserver(homeserver: String) { withContext(coroutineDispatchers.io) { authService.configureHomeserver(homeserver)