diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/data/AppPreferences.kt b/app/src/main/java/io/github/wiiznokes/gitnote/data/AppPreferences.kt index 91469d9..3dfb78d 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/data/AppPreferences.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/data/AppPreferences.kt @@ -69,6 +69,8 @@ class AppPreferences( val publicKey = stringPreference("publicKey", "") val privateKey = stringPreference("privateKey", "") + val appAuthToken = stringPreference("appAuthToken", "") + suspend fun cred(): Cred? { return when (credType.get()) { CredType.None -> null diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/AuthorizeGitNoteScreen.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/AuthorizeGitNoteScreen.kt index 0b9c80c..6066d60 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/AuthorizeGitNoteScreen.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/AuthorizeGitNoteScreen.kt @@ -7,12 +7,16 @@ import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import io.github.wiiznokes.gitnote.R import io.github.wiiznokes.gitnote.ui.component.AppPage +import io.github.wiiznokes.gitnote.ui.component.SetupButton +import io.github.wiiznokes.gitnote.ui.component.SetupLine +import io.github.wiiznokes.gitnote.ui.component.SetupPage import io.github.wiiznokes.gitnote.ui.viewmodel.InitState private const val TAG = "AuthorizeGitNoteScreen" @@ -21,39 +25,71 @@ private const val TAG = "AuthorizeGitNoteScreen" fun AuthorizeGitNoteScreen( onBackClick: () -> Unit, authState: InitState, + appAuthToken: String, onSuccess: () -> Unit, getLaunchOAuthScreenIntent: () -> Intent, + fetchInfos: (String) -> Unit, vmHashCode: Int, ) { AppPage( - title = stringResource(R.string.authorize_gitnote), + title = stringResource(R.string.authorize_gitnote_title), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, onBackClick = onBackClick, - onBackClickEnabled = !authState.isLoading() && authState != InitState.AuthentificationSuccess + onBackClickEnabled = !authState.isLoading() && authState != InitState.FetchingInfosSuccess ) { LaunchedEffect(authState) { Log.d(TAG, "LaunchedEffect: $authState, hash=${vmHashCode}") - if (authState is InitState.AuthentificationSuccess) { + if (authState is InitState.FetchingInfosSuccess) { onSuccess() } } - val ctx = LocalContext.current + var authButtonClicked = remember { + false + } + + SetupPage { + + SetupLine( + text = "" + ) { + val ctx = LocalContext.current + + SetupButton( + onClick = { + authButtonClicked = true + val intent = getLaunchOAuthScreenIntent() + ctx.startActivity(intent) + }, + enabled = !authState.isLoading() && authState != InitState.FetchingInfosSuccess, + text = if (authButtonClicked && authState.isLoading()) { + authState.message() + } else { + stringResource(R.string.authorize_gitnote) + } + ) + } - Button( - onClick = { - val intent = getLaunchOAuthScreenIntent() - ctx.startActivity(intent) - }, - enabled = !authState.isLoading() && authState != InitState.AuthentificationSuccess - ) { - if (!authState.isLoading()) { - Text(text = stringResource(R.string.authorize_gitnote)) - } else { - Text(text = authState.message()) + if (appAuthToken.isNotEmpty()) { + SetupLine( + text = "" + ) { + SetupButton( + onClick = { + authButtonClicked = false + fetchInfos(appAuthToken) + }, + enabled = !authState.isLoading() && authState != InitState.FetchingInfosSuccess, + text = if (!authButtonClicked && authState.isLoading()) { + authState.message() + } else { + "Fetch repositories metadata with the previous logged account" + } + ) + } } } } @@ -70,6 +106,8 @@ private fun AuthorizeGitNoteScreenPreview() { getLaunchOAuthScreenIntent = { Intent() }, - vmHashCode = 0 + vmHashCode = 0, + appAuthToken = "hello", + fetchInfos = {} ) } \ No newline at end of file diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt index 64d1e85..e1f4eae 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt @@ -83,7 +83,9 @@ fun RemoteScreen( vm.setStateToIdle() }, getLaunchOAuthScreenIntent = { vm.getLaunchOAuthScreenIntent() }, - vmHashCode = vm.hashCode() + vmHashCode = vm.hashCode(), + appAuthToken = vm.prefs.appAuthToken.getAsState().value, + fetchInfos = vm::fetchInfos ) is EnterUrl -> { diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/SetupViewModel.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/SetupViewModel.kt index 4d18411..c79e364 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/SetupViewModel.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/SetupViewModel.kt @@ -77,8 +77,6 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM var repos = listOf() private set - private var token = String() - lateinit var userInfo: UserInfo private set @@ -261,13 +259,21 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM CoroutineScope(Dispatchers.IO).launch { _initState.emit(InitState.GettingAccessToken) - token = try { + val token = try { provider!!.exchangeCodeForAccessToken(code) } catch (e: Exception) { Log.e(TAG, "exchangeCodeForAccessToken: ${e.message}, $e") _initState.emit(InitState.Error(e.message)) return@launch } + prefs.appAuthToken.update(token) + + fetchInfos(token = token) + } + } + + fun fetchInfos(token: String) { + CoroutineScope(Dispatchers.IO).launch { _initState.emit(InitState.FetchingRepos) @@ -289,7 +295,7 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM } Log.d(TAG, "emit: Success") - _initState.emit(InitState.AuthentificationSuccess) + _initState.emit(InitState.FetchingInfosSuccess) } } @@ -305,7 +311,7 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM _initState.emit(InitState.AddingDeployKey) try { provider!!.addDeployKeyToRepo( - token = token, + token = prefs.appAuthToken.get(), publicKey = publicKey, fullRepoName = repoName ) @@ -340,7 +346,7 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM _initState.emit(InitState.CreatingRemoteRepo) try { provider!!.createNewRepo( - token = token, + token = prefs.appAuthToken.get(), repoName = repoName ) } catch (e: Exception) { @@ -354,7 +360,7 @@ class SetupViewModel(val authFlow: SharedFlow) : ViewModel(), SetupViewM _initState.emit(InitState.AddingDeployKey) try { provider!!.addDeployKeyToRepo( - token = token, + token = prefs.appAuthToken.get(), publicKey = publicKey, fullRepoName = repoName ) @@ -389,7 +395,7 @@ sealed class InitState { data object FetchingRepos : InitState() data object GettingUserInfo : InitState() - data object AuthentificationSuccess : InitState() + data object FetchingInfosSuccess : InitState() data object CreatingRemoteRepo : InitState() data object AddingDeployKey : InitState() @@ -412,9 +418,9 @@ sealed class InitState { GettingAccessToken -> "Getting the access token" GettingUserInfo -> "Getting user information" Idle -> "" - AuthentificationSuccess -> "" + FetchingInfosSuccess -> "" } } - fun isLoading(): Boolean = this !is Idle && this !is Error && this !is AuthentificationSuccess + fun isLoading(): Boolean = this !is Idle && this !is Error && this !is FetchingInfosSuccess } \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 0afb04e..6157612 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -113,7 +113,6 @@ Aktivovat režim jen pro čtení Deaktivovat režim jen pro čtení - Autorizovat Gitnote Klonovat URL Přejděte na webovou stránku, vytvořte repozitář a zkopírujte adresu URL klonu git Zadejte adresu URL klonu Git diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b8b6c19..e426f47 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -125,7 +125,6 @@ Activer la lecture seule Desactiver la lecture seule - Autoriser Gitnote Clone URL "Allez sur la page Web, créez un référentiel et copiez son URL" Entrez l\'URL de clonage diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51e740c..e9d8fdd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,7 +118,8 @@ Activate read only mode Deactivate read only mode - Authorize Gitnote + Fetch repositories metadata + Authorize Gitnote and fetch repositories metadata Clone URL Go to the website, create a repository and copy its git clone URL Enter the Git clone URL