diff options
| author | Alberto Duarte (PWC) <alberto.duarte.delgado@pwc.com> | 2023-06-08 11:39:00 +0100 |
|---|---|---|
| committer | Alberto Duarte (PWC) <alberto.duarte.delgado@pwc.com> | 2023-06-08 11:39:00 +0100 |
| commit | 90b1191a979af126db12b25072abe6fdbfcd323d (patch) | |
| tree | e0241b451cfc43b5bea748e5ee0b911b0dc6e362 | |
| parent | 05c62b867ad7b827f228b10d5f3e9547d3d8beec (diff) | |
aded stuff
19 files changed, 271 insertions, 14 deletions
diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginDataSource.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginDataSource.kt new file mode 100644 index 0000000..3f761ea --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginDataSource.kt @@ -0,0 +1,9 @@ +package com.frannazario.proyectoandroid.data.datasources + +import androidx.lifecycle.LiveData +import com.frannazario.proyectoandroid.data.responses.LoginResponse +import com.frannazario.proyectoandroid.data.responses.SigninResponse + +interface LoginDataSource { + fun login (email: String, password: String): LiveData<LoginResponse> +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginRemoteDataSource.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginRemoteDataSource.kt new file mode 100644 index 0000000..3f86c06 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/LoginRemoteDataSource.kt @@ -0,0 +1,26 @@ +package com.frannazario.proyectoandroid.data.datasources + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.frannazario.proyectoandroid.data.responses.LoginResponse +import com.google.firebase.auth.FirebaseAuth + +class LoginRemoteDataSource: LoginDataSource{ + private val auth = FirebaseAuth.getInstance() + + override fun login(email: String, password: String): LiveData<LoginResponse> { + val resultLiveData = MutableLiveData<LoginResponse>() + + auth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener { task -> + if (task.isSuccessful) { + val user = auth.currentUser + resultLiveData.value = LoginResponse.Success(user) + } else { + val error = task.exception?.message ?: "Error desconocido" + resultLiveData.value = LoginResponse.Error(error) + } + } + return resultLiveData + } +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryDataSource.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryDataSource.kt new file mode 100644 index 0000000..5ef08f4 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryDataSource.kt @@ -0,0 +1,8 @@ +package com.frannazario.proyectoandroid.data.datasources + +import androidx.lifecycle.LiveData +import com.frannazario.proyectoandroid.data.responses.PasswordRecoveryResponse + +interface PasswordRecoveryDataSource { + fun recover (email: String): LiveData<PasswordRecoveryResponse> +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryRemoteDataSource.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryRemoteDataSource.kt new file mode 100644 index 0000000..08335ad --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/datasources/PasswordRecoveryRemoteDataSource.kt @@ -0,0 +1,26 @@ +package com.frannazario.proyectoandroid.data.datasources + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.frannazario.proyectoandroid.data.responses.PasswordRecoveryResponse +import com.google.firebase.auth.FirebaseAuth + +class PasswordRecoveryRemoteDataSource: PasswordRecoveryDataSource { + private val auth = FirebaseAuth.getInstance() + + override fun recover (email: String): LiveData<PasswordRecoveryResponse> { + val resultLiveData = MutableLiveData<PasswordRecoveryResponse>() + + auth.sendPasswordResetEmail(email) + .addOnCompleteListener { task -> + if (task.isSuccessful) { + val user = auth.currentUser + resultLiveData.value = PasswordRecoveryResponse.Success(user) + } else { + val error = task.exception?.message ?: "Error desconocido" + resultLiveData.value = PasswordRecoveryResponse.Error(error) + } + } + return resultLiveData + } +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/LoginRepository.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/LoginRepository.kt new file mode 100644 index 0000000..9532534 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/LoginRepository.kt @@ -0,0 +1,14 @@ +package com.frannazario.proyectoandroid.data.repositories + +import androidx.lifecycle.LiveData +import com.frannazario.proyectoandroid.data.datasources.LoginDataSource +import com.frannazario.proyectoandroid.data.datasources.LoginRemoteDataSource +import com.frannazario.proyectoandroid.data.responses.LoginResponse + +class LoginRepository( + private val remoteDataSource: LoginDataSource = LoginRemoteDataSource() + ) { + fun login (email: String, password: String): LiveData<LoginResponse> { + return remoteDataSource.login(email, password) + } +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/PasswordRecoveryRepository.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/PasswordRecoveryRepository.kt new file mode 100644 index 0000000..6550ae2 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/repositories/PasswordRecoveryRepository.kt @@ -0,0 +1,14 @@ +package com.frannazario.proyectoandroid.data.repositories + +import androidx.lifecycle.LiveData +import com.frannazario.proyectoandroid.data.datasources.PasswordRecoveryDataSource +import com.frannazario.proyectoandroid.data.datasources.PasswordRecoveryRemoteDataSource +import com.frannazario.proyectoandroid.data.responses.PasswordRecoveryResponse + +class PasswordRecoveryRepository ( + private val remoteDataSource: PasswordRecoveryDataSource= PasswordRecoveryRemoteDataSource() + ) { + fun recover(email: String): LiveData<PasswordRecoveryResponse> { + return remoteDataSource.recover(email) + } +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/responses/LoginResponse.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/responses/LoginResponse.kt new file mode 100644 index 0000000..9eb5518 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/responses/LoginResponse.kt @@ -0,0 +1,9 @@ +package com.frannazario.proyectoandroid.data.responses + +import com.google.firebase.auth.FirebaseUser + +sealed class LoginResponse { + + data class Success(val user: FirebaseUser?): LoginResponse() + data class Error(val error: String): LoginResponse() +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/responses/PasswordRecoveryResponse.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/responses/PasswordRecoveryResponse.kt new file mode 100644 index 0000000..98b5e39 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/responses/PasswordRecoveryResponse.kt @@ -0,0 +1,8 @@ +package com.frannazario.proyectoandroid.data.responses + +import com.google.firebase.auth.FirebaseUser + +sealed class PasswordRecoveryResponse { + data class Success(val user: FirebaseUser?): PasswordRecoveryResponse() + data class Error(val error: String): PasswordRecoveryResponse() +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/utils/StringUtils.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/utils/StringUtils.kt new file mode 100644 index 0000000..6b22894 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/utils/StringUtils.kt @@ -0,0 +1,20 @@ +package com.frannazario.proyectoandroid.data.utils + +import android.annotation.SuppressLint + +fun String?.isEmail(): Boolean { + val emailRegex = "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + + "\\@" + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + + "(" + + "\\." + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + + ")+" + return this?.matches(emailRegex.toRegex()) ?: false +} + +@SuppressLint("SuspiciousIndentation") +fun String?.isValidPassword(): Boolean { + val passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*?[#?!@\$%^&*-])[a-zA-Z\\d\\w\\W]{8,}\$" + return this?.matches(passwordRegex.toRegex()) ?: false +}
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/LoginViewModel.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/LoginViewModel.kt new file mode 100644 index 0000000..9fe0988 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/LoginViewModel.kt @@ -0,0 +1,18 @@ +package com.frannazario.proyectoandroid.data.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.frannazario.proyectoandroid.data.repositories.LoginRepository +import com.frannazario.proyectoandroid.data.responses.LoginResponse + +class LoginViewModel(private val repository: LoginRepository= LoginRepository()): ViewModel() { + private val loginResponseLiveData = MutableLiveData<LoginResponse>() + fun getLoginResultLiveData(): LiveData<LoginResponse> { + return loginResponseLiveData + } + fun login(email: String, password: String) { + val response = repository.login(email, password) + loginResponseLiveData.postValue(response.value) + } +} diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/PasswordRecoveryViewModel.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/PasswordRecoveryViewModel.kt new file mode 100644 index 0000000..b2511a8 --- /dev/null +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/PasswordRecoveryViewModel.kt @@ -0,0 +1,20 @@ +package com.frannazario.proyectoandroid.data.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.frannazario.proyectoandroid.data.repositories.PasswordRecoveryRepository +import com.frannazario.proyectoandroid.data.responses.PasswordRecoveryResponse + +class PasswordRecoveryViewModel(private val repository: PasswordRecoveryRepository = PasswordRecoveryRepository()): ViewModel() { + private val passwordRecoveryResponseLiveData = MutableLiveData<PasswordRecoveryResponse>() + + fun getPasswordRecoveryResultLiveData(): LiveData<PasswordRecoveryResponse> { + return passwordRecoveryResponseLiveData + } + + fun recover (email: String) { + val response = repository.recover(email) + passwordRecoveryResponseLiveData.postValue(response.value) + } +} diff --git a/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/SigninViewModel.kt b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/SigninViewModel.kt index e7f70ed..d2631b0 100644 --- a/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/SigninViewModel.kt +++ b/app/src/main/java/com/frannazario/proyectoandroid/data/viewmodels/SigninViewModel.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.frannazario.proyectoandroid.data.repositories.SigninRepository import com.frannazario.proyectoandroid.data.responses.SigninResponse +import com.frannazario.proyectoandroid.data.utils.isEmail +import com.frannazario.proyectoandroid.data.utils.isValidPassword class SigninViewModel(private val repository: SigninRepository = SigninRepository()): ViewModel() { @@ -14,8 +16,11 @@ class SigninViewModel(private val repository: SigninRepository = SigninRepositor return signinResponseLiveData } - fun register(email: String, password: String) { - val response = repository.register(email, password) - signinResponseLiveData.postValue(response.value) + fun register(email: String?, password: String?) { + if(email.isEmail() && + password.isValidPassword()) { + val response = repository.register(email ?: "", password ?: "") + signinResponseLiveData.postValue(response.value) + } } }
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/LoginFragment.kt b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/LoginFragment.kt index fcabbe1..7167738 100644 --- a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/LoginFragment.kt +++ b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/LoginFragment.kt @@ -7,11 +7,19 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.frannazario.proyectoandroid.R +import com.frannazario.proyectoandroid.data.responses.LoginResponse +import com.frannazario.proyectoandroid.data.viewmodels.LoginViewModel import com.frannazario.proyectoandroid.databinding.FragmentLoginBinding class LoginFragment: Fragment() { private lateinit var binding: FragmentLoginBinding + private lateinit var viewModel: LoginViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel = LoginViewModel() + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -26,4 +34,15 @@ class LoginFragment: Fragment() { } return binding.root } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewModel.getLoginResultLiveData().observe(viewLifecycleOwner) { response -> + when (response) { + is LoginResponse.Success -> {} + is LoginResponse.Error -> {} + } + } + } }
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/PasswordRecoveryFragment.kt b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/PasswordRecoveryFragment.kt index 35b56d0..7c7d922 100644 --- a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/PasswordRecoveryFragment.kt +++ b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/PasswordRecoveryFragment.kt @@ -5,10 +5,18 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import com.frannazario.proyectoandroid.data.responses.PasswordRecoveryResponse +import com.frannazario.proyectoandroid.data.viewmodels.PasswordRecoveryViewModel import com.frannazario.proyectoandroid.databinding.FragmentPasswordRecoveryBinding class PasswordRecoveryFragment: Fragment() { private lateinit var binding: FragmentPasswordRecoveryBinding + private lateinit var viewModel: PasswordRecoveryViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel = PasswordRecoveryViewModel() + } override fun onCreateView( inflater: LayoutInflater, @@ -18,4 +26,14 @@ class PasswordRecoveryFragment: Fragment() { binding = FragmentPasswordRecoveryBinding.inflate(inflater, container, false) return binding.root } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewModel.getPasswordRecoveryResultLiveData().observe(viewLifecycleOwner) { response -> + when (response) { + is PasswordRecoveryResponse.Success -> {} + is PasswordRecoveryResponse.Error -> {} + } + } + } }
\ No newline at end of file diff --git a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/SigninFragment.kt b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/SigninFragment.kt index 2b4f40e..7e1ab4e 100644 --- a/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/SigninFragment.kt +++ b/app/src/main/java/com/frannazario/proyectoandroid/presentation/fragments/SigninFragment.kt @@ -4,7 +4,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import com.frannazario.proyectoandroid.data.responses.SigninResponse import com.frannazario.proyectoandroid.data.viewmodels.SigninViewModel import com.frannazario.proyectoandroid.databinding.FragmentSigninBinding @@ -30,9 +32,19 @@ class SigninFragment: Fragment() { super.onViewCreated(view, savedInstanceState) viewModel.getSigninResultLiveData().observe(viewLifecycleOwner) { response -> when (response) { - is SigninResponse.Success -> {} - is SigninResponse.Error -> {} + is SigninResponse.Success -> { + Toast.makeText(requireContext(), "Funciona correctamente", Toast.LENGTH_LONG).show() + } + is SigninResponse.Error -> { + Toast.makeText(requireContext(), response.error, Toast.LENGTH_LONG).show() + } } } + binding.signupBtn.setOnClickListener { + viewModel.register( + binding.emailIet.text?.toString(), + binding.passwordIet.text?.toString() + ) + } } }
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index ca2d5bc..61f0a8d 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -59,6 +59,6 @@ app:layout_constraintTop_toBottomOf="@id/forget_password_btn" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:text="@string/signin" /> + android:text="@string/signup" /> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_signin.xml b/app/src/main/res/layout/fragment_signin.xml index 863e130..f88a274 100644 --- a/app/src/main/res/layout/fragment_signin.xml +++ b/app/src/main/res/layout/fragment_signin.xml @@ -4,14 +4,43 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> - <TextView + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/email_il" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/email_iet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/field_email" /> + + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/password_il" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/email_il"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/password_iet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/field_password" /> + + </com.google.android.material.textfield.TextInputLayout> + <Button + android:id="@+id/signup_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="A" - android:textSize="200sp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/password_il" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + android:text="@string/signup" /> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1a2566e..ac08189 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="field_email">Correo electronico</string> + <string name="field_password">Contrasena</string> <string name="field_signin">Registro</string> <string name="forgot_password">Olvidé la contraseña</string> - <string name="signin">Registrarte</string> + <string name="signup">Registrarte</string> <string name="login">Acceder</string> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 36859ed..acba2eb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,8 +2,9 @@ <string name="app_name" translatable="false">Proyecto android</string> <string name="field_email">Email</string> + <string name="field_password">Password</string> <string name="field_signin">Sign in</string> <string name="forgot_password">Forget password</string> - <string name="signin">Sign in</string> + <string name="signup">Sign Up</string> <string name="login">Login</string> </resources>
\ No newline at end of file |