From 167185ef45854745140ac30668c83ba66f6a5b41 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 11 Jan 2023 07:58:40 +0800 Subject: [PATCH] Basic signin refine --- .../com/hippo/ehviewer/ui/LoginActivity.kt | 6 + .../hippo/ehviewer/ui/compose/SignInScreen.kt | 120 +++++++++++++++++- 2 files changed, 119 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/LoginActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/LoginActivity.kt index 6ea295536..07ac76cf8 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/LoginActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/LoginActivity.kt @@ -3,6 +3,7 @@ package com.hippo.ehviewer.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.navigation.ActivityNavigator import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController @@ -37,6 +38,11 @@ class LoginActivity : ComponentActivity() { } } + override fun finish() { + super.finish() + ActivityNavigator.applyPopAnimationsToPendingTransition(this) + } + companion object { const val SIGN_IN_ROUTE_NAME = "SignIn" const val WEBVIEW_SIGN_IN_ROUTE_NAME = "WebViewSignIn" diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/SignInScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/SignInScreen.kt index e74e342f3..efd396e0e 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/SignInScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/SignInScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api @@ -26,19 +27,90 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.hippo.ehviewer.R +import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.UrlOpener +import com.hippo.ehviewer.client.EhClient +import com.hippo.ehviewer.client.EhUrl +import com.hippo.ehviewer.client.EhUtils +import com.hippo.ehviewer.ui.scene.getProfile +import com.hippo.util.ExceptionUtils +import eu.kanade.tachiyomi.util.lang.launchIO +import eu.kanade.tachiyomi.util.lang.withUIContext +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import rikka.core.util.ContextUtils.requireActivity @OptIn(ExperimentalMaterial3Api::class) @Composable fun SignInScreen() { val coroutineScope = rememberCoroutineScope() - val isProgressIndicatorVisible by remember { mutableStateOf(false) } + val focusManager = LocalFocusManager.current + var isProgressIndicatorVisible by remember { mutableStateOf(false) } + val labelUsername = stringResource(R.string.username) + val labelPassword = stringResource(R.string.password) + val errorTextUsername = stringResource(R.string.error_username_cannot_empty) + val errorTextPasswd = stringResource(R.string.error_password_cannot_empty) + var showUsernameError by remember { mutableStateOf(false) } + var showPasswordError by remember { mutableStateOf(false) } + var showErrorDialog by remember { mutableStateOf(false) } + var loginErrorException by remember { mutableStateOf(null) } var username by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } + val context = LocalContext.current + var signInJob by remember { mutableStateOf(null) } + + // Basic login request + val signIn = remember { + return@remember lambda@{ + if (signInJob?.isActive == true) return@lambda + if (username.isEmpty()) { + showUsernameError = true + return@lambda + } else { + showUsernameError = false + } + if (password.isEmpty()) { + showPasswordError = true + return@lambda + } else { + showPasswordError = false + } + focusManager.clearFocus() + isProgressIndicatorVisible = true + + EhUtils.signOut() + signInJob = coroutineScope.launchIO { + runCatching { + (EhClient.execute(EhClient.METHOD_SIGN_IN, username, password) as String).let { + Settings.putDisplayName(it) + } + }.onFailure { + it.printStackTrace() + withUIContext { + focusManager.clearFocus() + isProgressIndicatorVisible = false + showErrorDialog = true + loginErrorException = it + } + }.onSuccess { + // This composable is to be finished + GlobalScope.launchIO { + getProfile() + } + withUIContext { + // navigate to selectSite + } + } + } + } + } Box( contentAlignment = Alignment.Center @@ -61,9 +133,10 @@ fun SignInScreen() { onValueChange = { username = it }, Modifier.width(dimensionResource(id = R.dimen.single_max_width)), label = { - Text(text = stringResource(id = R.string.username)) + Text(text = if (!showUsernameError) labelUsername else errorTextUsername) }, - singleLine = true + singleLine = true, + isError = showUsernameError ) OutlinedTextField( @@ -71,9 +144,10 @@ fun SignInScreen() { onValueChange = { password = it }, Modifier.width(dimensionResource(id = R.dimen.single_max_width)), label = { - Text(text = stringResource(id = R.string.password)) + Text(text = if (!showPasswordError) labelPassword else errorTextPasswd) }, - singleLine = true + singleLine = true, + isError = showPasswordError ) Text( @@ -87,7 +161,13 @@ fun SignInScreen() { Row { OutlinedButton( - onClick = { /*TODO*/ }, + onClick = { + UrlOpener.openUrl( + requireActivity(context), + EhUrl.URL_REGISTER, + false + ) + }, Modifier .weight(1f) .padding(horizontal = 4.dp) @@ -96,7 +176,7 @@ fun SignInScreen() { } Button( - onClick = { /*TODO*/ }, + onClick = signIn, Modifier .weight(1f) .padding(horizontal = 4.dp) @@ -132,5 +212,31 @@ fun SignInScreen() { if (isProgressIndicatorVisible) { CircularProgressIndicator() } + if (showErrorDialog) { + AlertDialog( + onDismissRequest = { + showErrorDialog = false + }, + confirmButton = { + TextButton(onClick = { + showErrorDialog = false + }) { + Text(text = stringResource(id = R.string.get_it)) + } + }, + title = { + Text(text = stringResource(id = R.string.sign_in_failed)) + }, + text = { + Text( + text = + """ + ${ExceptionUtils.getReadableString(loginErrorException!!)} + ${stringResource(R.string.sign_in_failed_tip)} + """.trimIndent() + ) + } + ) + } } }