diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt b/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt index 03d87ba0f..8a0e2c436 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUtils.kt @@ -105,6 +105,7 @@ object EhUtils { Settings.putDisplayName(null) Settings.putGallerySite(EhUrl.SITE_E) Settings.putNeedSignIn(true) + Settings.putSelectSite(true) } fun needSignedIn(): Boolean { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/login/CookieSignInScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/login/CookieSignInScreen.kt index 727624bd6..725220dba 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/login/CookieSignInScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/login/CookieSignInScreen.kt @@ -55,6 +55,7 @@ import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.util.ExceptionUtils import eu.kanade.tachiyomi.util.lang.launchIO +import eu.kanade.tachiyomi.util.lang.withNonCancellableContext import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -63,7 +64,7 @@ import java.util.Locale @OptIn(ExperimentalMaterial3Api::class) @Composable -fun CookieSignInScene(navController: NavController) { +fun CookieSignInScene(navController: NavController, postLogin: suspend () -> Unit) { val clipboardManager = LocalClipboardManager.current val focusManager = LocalFocusManager.current val snackbarHostState = remember { SnackbarHostState() } @@ -122,6 +123,9 @@ fun CookieSignInScene(navController: NavController) { runCatching { EhEngine.getProfile() }.onSuccess { + withNonCancellableContext { + postLogin() + } withUIContext { navController.navigate(SELECT_SITE_ROUTE_NAME) } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/login/LoginActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/login/LoginActivity.kt index dcb524bf6..ce9da6192 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/login/LoginActivity.kt @@ -2,11 +2,18 @@ package com.hippo.ehviewer.ui.login import android.os.Bundle import androidx.activity.compose.setContent +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.navigation.ActivityNavigator import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.google.accompanist.themeadapter.material3.Mdc3Theme +import com.hippo.ehviewer.Settings +import com.hippo.ehviewer.client.EhEngine +import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.ui.EhActivity class LoginActivity : EhActivity() { @@ -18,20 +25,33 @@ class LoginActivity : EhActivity() { NavHost(navController = navController, startDestination = SIGN_IN_ROUTE_NAME) { composable(SIGN_IN_ROUTE_NAME) { - SignInScreen(navController) + SignInScreen(navController) { + postLogin() + } } composable(WEBVIEW_SIGN_IN_ROUTE_NAME) { - WebviewSignInScreen(navController) + WebviewSignInScreen(navController) { + postLogin() + } } composable(COOKIE_SIGN_IN_ROUTE_NAME) { - CookieSignInScene(navController) + CookieSignInScene(navController) { + postLogin() + } } composable(SELECT_SITE_ROUTE_NAME) { - SelectSiteScreen { - finish() + val selectSite by remember { mutableStateOf(Settings.getSelectSite()) } + if (selectSite) { + SelectSiteScreen { + finish() + } + } else { + SideEffect { + finish() + } } } } @@ -41,8 +61,33 @@ class LoginActivity : EhActivity() { override fun finish() { super.finish() + Settings.putNeedSignIn(false) ActivityNavigator.applyPopAnimationsToPendingTransition(this) } + + private suspend fun postLogin() { + runCatching { + EhEngine.getProfile().run { + Settings.putDisplayName(displayName) + Settings.putAvatar(avatar) + } + }.onFailure { + it.printStackTrace() + } + + runCatching { + Settings.putGallerySite(EhUrl.SITE_EX) + EhEngine.getUConfig() + }.onFailure { + Settings.putSelectSite(false) + Settings.putGallerySite(EhUrl.SITE_E) + runCatching { + EhEngine.getUConfig() + }.onFailure { + it.printStackTrace() + } + } + } } const val SIGN_IN_ROUTE_NAME = "SignIn" diff --git a/app/src/main/java/com/hippo/ehviewer/ui/login/SelectSiteScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/login/SelectSiteScreen.kt index d9ba2383d..604caebbf 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/login/SelectSiteScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/login/SelectSiteScreen.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -31,17 +32,16 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUrl -import eu.kanade.tachiyomi.util.lang.launchIO -import kotlinx.coroutines.GlobalScope +import eu.kanade.tachiyomi.util.lang.launchNonCancellable @Composable fun SelectSiteScreen(finish: () -> Unit) { - var site by remember { mutableStateOf(EhApplication.ehCookieStore.hasSignedIn()) } // false for e, true for ex + val coroutineScope = rememberCoroutineScope() + var siteEx by remember { mutableStateOf(true) } Column( Modifier @@ -70,8 +70,8 @@ fun SelectSiteScreen(finish: () -> Unit) { ) { Box( modifier = Modifier - .background(if (!site) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.surface) - .clickable { site = false } + .background(if (!siteEx) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.surface) + .clickable { siteEx = false } .size(100.dp, 40.dp), contentAlignment = Alignment.Center ) { @@ -89,8 +89,8 @@ fun SelectSiteScreen(finish: () -> Unit) { Box( modifier = Modifier - .background(if (site) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.surface) - .clickable { site = true } + .background(if (siteEx) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.surface) + .clickable { siteEx = true } .size(100.dp, 40.dp), contentAlignment = Alignment.Center ) { @@ -116,13 +116,15 @@ fun SelectSiteScreen(finish: () -> Unit) { ) { Button(onClick = { Settings.putSelectSite(false) - Settings.putNeedSignIn(false) - if (!site) + if (!siteEx) { Settings.putGallerySite(EhUrl.SITE_E) - else - Settings.putGallerySite(EhUrl.SITE_EX) - GlobalScope.launchIO { - getProfile() + coroutineScope.launchNonCancellable { + runCatching { + EhEngine.getUConfig() + }.onFailure { + it.printStackTrace() + } + } } finish() }, Modifier.fillMaxWidth()) { @@ -131,13 +133,3 @@ fun SelectSiteScreen(finish: () -> Unit) { } } } - -suspend fun getProfile() { - runCatching { - EhEngine.getProfile().run { - Settings.putDisplayName(displayName) - Settings.putAvatar(avatar) - } - EhEngine.getUConfig() - } -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/login/SignInScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/login/SignInScreen.kt index 84de0b24e..32dc52ce0 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/login/SignInScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/login/SignInScreen.kt @@ -53,19 +53,21 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.hippo.ehviewer.R +import com.hippo.ehviewer.Settings import com.hippo.ehviewer.UrlOpener import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.util.ExceptionUtils import eu.kanade.tachiyomi.util.lang.launchIO +import eu.kanade.tachiyomi.util.lang.withNonCancellableContext import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.Job import rikka.core.util.ContextUtils.requireActivity @OptIn(ExperimentalMaterial3Api::class) @Composable -fun SignInScreen(navController: NavController) { +fun SignInScreen(navController: NavController, postLogin: suspend () -> Unit) { val coroutineScope = rememberCoroutineScope() val focusManager = LocalFocusManager.current var isProgressIndicatorVisible by rememberSaveable { mutableStateOf(false) } @@ -110,6 +112,9 @@ fun SignInScreen(navController: NavController) { showErrorDialog = true } }.onSuccess { + withNonCancellableContext { + postLogin() + } withUIContext { navController.navigate(SELECT_SITE_ROUTE_NAME) } @@ -248,7 +253,10 @@ fun SignInScreen(navController: NavController) { } TextButton( - onClick = { navController.navigate(SELECT_SITE_ROUTE_NAME) }, + onClick = { + Settings.putSelectSite(false) + navController.navigate(SELECT_SITE_ROUTE_NAME) + }, ) { Text( text = buildAnnotatedString { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/login/WebviewSignInScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/login/WebviewSignInScreen.kt index 07802e848..debdd4b4c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/login/WebviewSignInScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/login/WebviewSignInScreen.kt @@ -7,6 +7,7 @@ import android.webkit.CookieManager import android.webkit.WebView import android.webkit.WebViewClient import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidView import androidx.navigation.NavController @@ -15,14 +16,16 @@ import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.widget.DialogWebChromeClient +import eu.kanade.tachiyomi.util.lang.launchNonCancellable import okhttp3.Cookie import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull @SuppressLint("SetJavaScriptEnabled") @Composable -fun WebviewSignInScreen(navController: NavController) { +fun WebviewSignInScreen(navController: NavController, postLogin: suspend () -> Unit) { val context = LocalContext.current + val coroutineScope = rememberCoroutineScope() AndroidView(factory = { EhUtils.signOut() @@ -96,6 +99,9 @@ fun WebviewSignInScreen(navController: NavController) { } if (getId && getHash) { present = true + coroutineScope.launchNonCancellable { + postLogin() + } navController.navigate(SELECT_SITE_ROUTE_NAME) } }