tmp
This commit is contained in:
parent
7898a51252
commit
8fbe3c0b7b
21 changed files with 359 additions and 35 deletions
|
|
@ -5,28 +5,37 @@ import androidx.activity.ComponentActivity
|
|||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.viewModels
|
||||
import androidx.compose.animation.Crossfade
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.livedata.observeAsState
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.google.android.gms.auth.api.signin.GoogleSignIn
|
||||
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
|
||||
import com.pixelized.biblib.R
|
||||
import com.pixelized.biblib.ui.composable.screen.LoginScreenComposable
|
||||
import com.pixelized.biblib.ui.composable.screen.MainScreenComposable
|
||||
import com.pixelized.biblib.ui.composable.screen.SplashScreenComposable
|
||||
import com.pixelized.biblib.ui.theme.BibLibTheme
|
||||
import com.pixelized.biblib.ui.viewmodel.AuthenticationViewModel
|
||||
import com.pixelized.biblib.ui.viewmodel.NavigationViewModel
|
||||
import com.pixelized.biblib.ui.viewmodel.NavigationViewModel.Screen
|
||||
import com.pixelized.biblib.utils.BitmapCache
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
private val navigationViewModel: NavigationViewModel by viewModels()
|
||||
|
||||
private val googleSignInOption by lazy {
|
||||
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
|
||||
.requestIdToken(getString(R.string.biblib_server_id))
|
||||
.requestEmail()
|
||||
.build()
|
||||
}
|
||||
|
||||
val googleSignIn by lazy {
|
||||
GoogleSignIn.getClient(this, googleSignInOption)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
BitmapCache.init(this)
|
||||
|
||||
setContent {
|
||||
BibLibTheme {
|
||||
ContentComposable()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
package com.pixelized.biblib.ui.composable.screen
|
||||
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
|
|
@ -19,6 +24,7 @@ import androidx.compose.ui.Alignment
|
|||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.focus.FocusRequester
|
||||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
|
|
@ -28,7 +34,11 @@ import androidx.compose.ui.text.input.VisualTransformation
|
|||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.google.android.gms.auth.api.signin.GoogleSignIn
|
||||
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
|
||||
import com.google.android.gms.common.api.ApiException
|
||||
import com.pixelized.biblib.R
|
||||
import com.pixelized.biblib.ui.MainActivity
|
||||
import com.pixelized.biblib.ui.theme.BibLibTheme
|
||||
import com.pixelized.biblib.ui.viewmodel.AuthenticationViewModel
|
||||
import com.pixelized.biblib.ui.viewmodel.NavigationViewModel
|
||||
|
|
@ -43,10 +53,35 @@ fun LoginScreenComposablePreview() {
|
|||
|
||||
@Composable
|
||||
fun LoginScreenComposable(
|
||||
|
||||
navigationViewModel: NavigationViewModel = viewModel(),
|
||||
authenticationViewModel: AuthenticationViewModel = viewModel(),
|
||||
) {
|
||||
val navigationViewModel = viewModel<NavigationViewModel>()
|
||||
val authenticationViewModel = viewModel<AuthenticationViewModel>()
|
||||
// TODO : c'est de la merde ça
|
||||
val activity = LocalContext.current as MainActivity
|
||||
val result = remember { mutableStateOf<String?>(null) }
|
||||
val launcher =
|
||||
rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||
try {
|
||||
val task = GoogleSignIn.getSignedInAccountFromIntent(it.data)
|
||||
val account: GoogleSignInAccount? = task.getResult(ApiException::class.java)
|
||||
|
||||
val idToken = account?.idToken
|
||||
// if (idToken != null) {
|
||||
// viewModel.loginWithGoogle(idToken).observeLogin()
|
||||
// } else {
|
||||
// Toast.makeText(requireActivity(), "GoogleSignIn missing Token", Toast.LENGTH_SHORT).show()
|
||||
// }
|
||||
Log.e("AuthLoginFragment", "idToken: $idToken")
|
||||
} catch (exception: Exception) {
|
||||
// Toast.makeText(requireActivity(), "GoogleSignIn exception: ${exception.message}", Toast.LENGTH_SHORT).show()
|
||||
Log.e("AuthLoginFragment", exception.message, exception)
|
||||
}
|
||||
// // Here we just update the state, but you could imagine
|
||||
// // pre-processing the result, or updating a MutableSharedFlow that
|
||||
// // your composable collects
|
||||
// result.value = it
|
||||
}
|
||||
|
||||
val typography = MaterialTheme.typography
|
||||
|
||||
Column(
|
||||
|
|
@ -102,14 +137,12 @@ fun LoginScreenComposable(
|
|||
modifier = Modifier.padding(end = 8.dp),
|
||||
colors = outlinedButtonColors(),
|
||||
onClick = {
|
||||
// TODO:
|
||||
navigationViewModel.navigateTo(NavigationViewModel.Screen.MainScreen)
|
||||
authenticationViewModel.register()
|
||||
}) {
|
||||
Text(text = stringResource(id = R.string.action_register))
|
||||
}
|
||||
Button(onClick = {
|
||||
// TODO:
|
||||
navigationViewModel.navigateTo(NavigationViewModel.Screen.MainScreen)
|
||||
authenticationViewModel.login()
|
||||
}) {
|
||||
Text(text = stringResource(id = R.string.action_login))
|
||||
}
|
||||
|
|
@ -121,8 +154,7 @@ fun LoginScreenComposable(
|
|||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = outlinedButtonColors(),
|
||||
onClick = {
|
||||
// TODO:
|
||||
navigationViewModel.navigateTo(NavigationViewModel.Screen.MainScreen)
|
||||
launcher.launch(activity.googleSignIn.signInIntent)
|
||||
}) {
|
||||
Image(
|
||||
modifier = Modifier.padding(end = 8.dp),
|
||||
|
|
@ -189,7 +221,7 @@ private fun PasswordField(
|
|||
private fun CredentialRemember(viewModel: AuthenticationViewModel, modifier: Modifier = Modifier) {
|
||||
val credential = viewModel.rememberCredential.observeAsState()
|
||||
Row(modifier = modifier.clickable {
|
||||
viewModel.updateRememberCredential(credential = credential.value?.not() ?: false)
|
||||
viewModel.updateRememberCredential(rememberCredential = credential.value?.not() ?: false)
|
||||
}) {
|
||||
Checkbox(
|
||||
modifier = Modifier.align(Alignment.CenterVertically),
|
||||
|
|
|
|||
|
|
@ -1,10 +1,24 @@
|
|||
package com.pixelized.biblib.ui.viewmodel
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.util.Log
|
||||
import androidx.core.content.edit
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.pixelized.biblib.data.network.query.AuthLoginQuery
|
||||
import com.pixelized.biblib.injection.inject
|
||||
import com.pixelized.biblib.network.client.IBibLibClient
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class AuthenticationViewModel: ViewModel() {
|
||||
class AuthenticationViewModel(application: Application) : AndroidViewModel(application) {
|
||||
private val preferences = application.getSharedPreferences(SHARED_PREF, Context.MODE_PRIVATE)
|
||||
private val client: IBibLibClient by inject()
|
||||
|
||||
private val _login = MutableLiveData<String>()
|
||||
val login: LiveData<String> get() = _login
|
||||
|
|
@ -12,9 +26,17 @@ class AuthenticationViewModel: ViewModel() {
|
|||
private val _password = MutableLiveData<String>()
|
||||
val password: LiveData<String> get() = _password
|
||||
|
||||
private val _rememberCredential = MutableLiveData<Boolean>(false)
|
||||
private val _rememberCredential = MutableLiveData<Boolean>()
|
||||
val rememberCredential: LiveData<Boolean> get() = _rememberCredential
|
||||
|
||||
init {
|
||||
viewModelScope.launch(Dispatchers.Main) {
|
||||
_login.value = preferences.login
|
||||
_password.value = preferences.password
|
||||
_rememberCredential.value = preferences.rememberCredential
|
||||
}
|
||||
}
|
||||
|
||||
fun updateLogin(login: String) {
|
||||
_login.postValue(login)
|
||||
}
|
||||
|
|
@ -23,7 +45,54 @@ class AuthenticationViewModel: ViewModel() {
|
|||
_password.postValue(password)
|
||||
}
|
||||
|
||||
fun updateRememberCredential(credential: Boolean) {
|
||||
_rememberCredential.postValue(credential)
|
||||
fun updateRememberCredential(rememberCredential: Boolean) {
|
||||
_rememberCredential.postValue(rememberCredential)
|
||||
viewModelScope.launch {
|
||||
preferences.rememberCredential = rememberCredential
|
||||
if (rememberCredential.not()) {
|
||||
preferences.login = null
|
||||
preferences.password = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun register() {
|
||||
|
||||
}
|
||||
|
||||
fun login() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
if (rememberCredential.value == true) {
|
||||
preferences.login = login.value
|
||||
preferences.password = password.value
|
||||
}
|
||||
// TODO : validation !
|
||||
val query = AuthLoginQuery(
|
||||
username = login.value,
|
||||
password = password.value
|
||||
)
|
||||
// TODO : Repository (token management & co)
|
||||
val response = client.service.login(query)
|
||||
Log.e("pouet", response.toString())
|
||||
}
|
||||
}
|
||||
|
||||
private var SharedPreferences.login: String?
|
||||
get() = getString(REMEMBER_USER, null)
|
||||
set(value) = edit { putString(REMEMBER_USER, value) }
|
||||
|
||||
private var SharedPreferences.password: String?
|
||||
get() = getString(REMEMBER_PASSWORD, null)
|
||||
set(value) = edit { putString(REMEMBER_PASSWORD, value) }
|
||||
|
||||
private var SharedPreferences.rememberCredential: Boolean
|
||||
get() = getBoolean(REMEMBER_CREDENTIAL, false)
|
||||
set(value) = edit { putBoolean(REMEMBER_CREDENTIAL, value) }
|
||||
|
||||
companion object {
|
||||
const val SHARED_PREF = "BIB_LIB_SHARED_PREF"
|
||||
const val REMEMBER_CREDENTIAL = "REMEMBER_CREDENTIAL"
|
||||
const val REMEMBER_USER = "REMEMBER_USER"
|
||||
const val REMEMBER_PASSWORD = "REMEMBER_PASSWORD"
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue