diff --git a/app/src/main/java/chat/revolt/activities/MainActivity.kt b/app/src/main/java/chat/revolt/activities/MainActivity.kt index 207e875e..54e2ab33 100644 --- a/app/src/main/java/chat/revolt/activities/MainActivity.kt +++ b/app/src/main/java/chat/revolt/activities/MainActivity.kt @@ -17,8 +17,11 @@ import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass @@ -27,6 +30,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen @@ -99,6 +103,7 @@ class MainActivityViewModel @Inject constructor( val nextDestination = MutableStateFlow(null) var isConnected = MutableStateFlow(false) val isReady = MutableStateFlow(false) + val couldNotLogIn = MutableStateFlow(false) private fun hasInternetConnection(): Boolean { val connectivityManager = @@ -174,15 +179,8 @@ class MainActivityViewModel @Inject constructor( } if (canReachRevolt && !valid) { - Log.d("MainActivity", "Session token is invalid, clearing session") - Toast.makeText( - context, - context.getString(R.string.token_invalid_toast), - Toast.LENGTH_SHORT - ).show() - kvStorage.remove("sessionToken") - kvStorage.remove("sessionId") - startWithDestination("login/greeting") + Log.d("MainActivity", "Session token is invalid, could not log in") + couldNotLogIn.emit(true) } else { try { Log.d("MainActivity", "Session token is valid, checking onboarding state") @@ -201,25 +199,32 @@ class MainActivityViewModel @Inject constructor( ).show() return@launch startWithoutDestination() } catch (e: Exception) { - Log.e("MainActivity", "Failed to check onboarding state, clearing session", e) - startWithDestination("login/greeting") + Log.e("MainActivity", "Failed to check onboarding state, could not log in", e) + couldNotLogIn.emit(true) } try { Log.d("MainActivity", "Onboarding state is complete, logging in") + throw Exception("Test") RevoltAPI.loginAs(token) RevoltAPI.setSessionId(id) startWithDestination("chat") } catch (e: Exception) { - Log.e("MainActivity", "Failed to login, clearing session", e) - kvStorage.remove("sessionToken") - kvStorage.remove("sessionId") - startWithDestination("login/greeting") + Log.e("MainActivity", "Failed to login, could not log in", e) + couldNotLogIn.emit(true) } } } } + fun logOut() { + viewModelScope.launch { + kvStorage.remove("sessionToken") + kvStorage.remove("sessionId") + startWithDestination("login/greeting") + } + } + fun updateNextDestination(destination: String) { viewModelScope.launch { nextDestination.emit(null) @@ -251,6 +256,12 @@ class MainActivityViewModel @Inject constructor( } } + fun onDismissLoginError() { + viewModelScope.launch { + couldNotLogIn.emit(false) + } + } + init { Log.d("MainActivity", "Starting up") doPreStartupTasks() @@ -307,7 +318,10 @@ class MainActivity : AppCompatActivity() { viewModel.isConnected.collectAsState().value, viewModel.activeAlert.collectAsState().value, viewModel.isAlertActive.collectAsState().value, + viewModel.couldNotLogIn.collectAsState().value, + viewModel::logOut, viewModel::onDismissHealthAlert, + viewModel::onDismissLoginError, viewModel::checkLoggedInState, viewModel::updateNextDestination ) @@ -336,7 +350,10 @@ fun AppEntrypoint( isConnected: Boolean, healthNotice: HealthNotice?, isHealthAlertActive: Boolean, + couldNotLogIn: Boolean, + onLogout: () -> Unit = {}, onDismissHealthAlert: () -> Unit = {}, + onDismissLoginError: () -> Unit = {}, onRetryConnection: () -> Unit, onUpdateNextDestination: (String) -> Unit = {} ) { @@ -357,6 +374,40 @@ fun AppEntrypoint( } } + if (couldNotLogIn) { + AlertDialog( + onDismissRequest = { + // no-op + }, + title = { + Text(stringResource(R.string.could_not_log_in_heading)) + }, + text = { + Text(stringResource(R.string.could_not_log_in_body)) + }, + confirmButton = { + TextButton( + onClick = { + onDismissLoginError() + onRetryConnection() + } + ) { + Text(stringResource(R.string.could_not_log_in_cta_try_again)) + } + }, + dismissButton = { + TextButton( + onClick = { + onDismissLoginError() + onLogout() + } + ) { + Text(stringResource(R.string.could_not_log_in_cta_logout)) + } + } + ) + } + NavHost( navController = navController, startDestination = "default", diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 843cec35..7f57ff49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,6 +33,11 @@ Learn more Dismiss + There was a problem logging you in + You might have logged out from another device, or your internet connection might be down. + Try again + Log out + Let\'s log you in Forgot password? Resend a verification email