From 05bb4551b25afe7065fb1e8ba97aba4b5e7c783e Mon Sep 17 00:00:00 2001 From: Aditya_WDI Date: Mon, 7 Aug 2023 21:01:41 +0530 Subject: [PATCH] . --- .idea/deploymentTargetDropDown.xml | 12 - .../welcome/welcomecg/WelcomeApiService.java | 25 + .../welcome/welcomecg/WelcomeContracts.java | 40 ++ .../fragments/CgChangePwdFragment.java | 123 ++++- .../fragments/CgCheckEmailFragment.java | 153 +++++- .../fragments/CgConnectFragment.java | 35 +- .../fragments/CgForgotPasswordFragment.java | 67 ++- .../fragments/CgRegisterFragment.java | 54 ++- .../welcomecg/fragments/CgSignInFragment.java | 85 +++- .../welcomecg/mvvm/CgForgotPwdResult.java | 21 + .../welcomecg/mvvm/CgWelcomeRepository.java | 161 ++++++ .../welcomecg/mvvm/CgWelcomeViewModel.java | 30 ++ .../welcomecg/mvvm/ConnectCgResult.java | 17 + .../forgotpin/CheckMailFragment.java | 11 + .../fragments/register/LocationFragment.java | 2 + .../layout/cg_change_password_fragment.xml | 12 +- .../res/layout/cg_check_email_fragment.xml | 9 - .../layout/cg_profile_progress_fragment.xml | 458 ++++++++++++++++++ .../main/res/layout/cg_register_fragment.xml | 6 +- .../main/res/layout/cg_sign_in_fragment.xml | 32 +- app/src/main/res/layout/password_pop_up.xml | 30 +- .../main/res/navigation/welcome_nav_graph.xml | 2 +- app/src/main/res/values/strings.xml | 3 +- 23 files changed, 1303 insertions(+), 85 deletions(-) create mode 100644 app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgForgotPwdResult.java create mode 100644 app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/ConnectCgResult.java create mode 100644 app/src/main/res/layout/cg_profile_progress_fragment.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 34e766f..de51dd0 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,18 +1,6 @@ - - - - - - - - - - - - diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeApiService.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeApiService.java index c130d86..9e66fc5 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeApiService.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeApiService.java @@ -1,12 +1,18 @@ package com.ssb.simplitend.welcome.welcomecg; import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgForgotPwdResult; +import com.ssb.simplitend.welcome.welcomecg.mvvm.ConnectCgResult; import com.ssb.simplitend.welcome.welcomepatient.mvvm.models.CallResponse; import java.util.Map; +import okhttp3.Request; import okhttp3.RequestBody; import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.Header; import retrofit2.http.Multipart; import retrofit2.http.POST; import retrofit2.http.PartMap; @@ -17,4 +23,23 @@ public interface WelcomeApiService { @POST("api/auth/caregiver-register") Call> registerCareGiver(@PartMap Map body); + @POST("api/auth/caregiver-login") + Call> loginCaregiver(@Body Map body); + + @POST("api/auth/patient-caregiver-connect") + Call> verifyCgOTP(@Body Map body); + + @GET("api/auth/forgot-caregiver-password") + Call> sendForgotCodeEmail(@Header("email") String email); + + @POST("api/auth/verify-caregiver-otp") + Call> verifyForgotOTP(@Body Map body); + + @Multipart + @POST("api/auth/change-caregiver-password") + Call> changeCgPassword(@PartMap Map body); + + @POST("api/auth/patient-caregiver-connect") + Call> connectCg(@Body Map body); + } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeContracts.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeContracts.java index 952c60b..bd67d4d 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeContracts.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/WelcomeContracts.java @@ -1,6 +1,8 @@ package com.ssb.simplitend.welcome.welcomecg; import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgForgotPwdResult; +import com.ssb.simplitend.welcome.welcomecg.mvvm.ConnectCgResult; public interface WelcomeContracts { @@ -12,4 +14,42 @@ public interface WelcomeContracts { } + interface VerifyCgOTPCallback{ + void onOTPVerifies(); + + void onVerifyOTPFailed(Throwable t, String message); + } + + interface CgLoginCallback{ + void onLoginSuccess(CareGiverData careGiverData, String token); + + void onLogInFailed(Throwable t, String message); + } + + interface ForgotPwdSentCodeCallback{ + void onEmailSentSuccess(CgForgotPwdResult result); + + void onEmailSentFailed(Throwable t, String message); + } + + interface VerifyForgotOTP{ + void onOTPVerified(); + + void onOTPVerificationFailed(Throwable t, String message); + } + + interface ChangePasswordCallback{ + void onPasswordChanged(CareGiverData careGiverData); + + void onPasswordChangeFailed(Throwable t, String message); + } + + interface ConnectCgCallback{ + + void onCgConnected(ConnectCgResult result); + + void onCgConnectFailed(Throwable throwable, String message); + + } + } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgChangePwdFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgChangePwdFragment.java index 38e9a86..15d1a36 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgChangePwdFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgChangePwdFragment.java @@ -1,21 +1,43 @@ package com.ssb.simplitend.welcome.welcomecg.fragments; +import static com.ssb.simplitend.welcome.welcomecg.fragments.CgCheckEmailFragment.FORGOT_EMAIL; + +import android.app.ProgressDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.Navigation; +import com.ssb.simplitend.R; import com.ssb.simplitend.databinding.CgChangePasswordFragmentBinding; +import com.ssb.simplitend.welcome.welcomecg.WelcomeContracts; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgWelcomeViewModel; -public class CgChangePwdFragment extends Fragment { +import java.util.HashMap; +import java.util.Map; + +import okhttp3.MediaType; +import okhttp3.RequestBody; + +public class CgChangePwdFragment extends Fragment implements WelcomeContracts.ChangePasswordCallback { protected CgChangePasswordFragmentBinding binding; - public CgChangePwdFragment(){ + private ProgressDialog progressDialog; + + private CgWelcomeViewModel viewModel; + + private String eEmail; + + public CgChangePwdFragment() { // required } @@ -24,6 +46,103 @@ public class CgChangePwdFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = CgChangePasswordFragmentBinding.inflate(inflater, container, false); + viewModel = new ViewModelProvider(requireActivity()).get(CgWelcomeViewModel.class); + + progressDialog = new ProgressDialog(requireContext()); + + clickEvents(); + return binding.getRoot(); } + + private void clickEvents() { + binding.resetPin.setOnClickListener(v -> { + if (allOkay()) { + changePassword(); + } + }); + } + + private void changePassword() { + if (eEmail == null || + binding.password.getText() == null || + binding.confirmPassword.getText() == null) { + Toast.makeText(requireContext(), "Something goes wrong, Try again.", Toast.LENGTH_SHORT).show(); + return; + } + + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we change your password."); + progressDialog.setCancelable(false); + progressDialog.show(); + + Map body = new HashMap<>(); + + RequestBody email_body = RequestBody.create(eEmail, MediaType.parse("text/plain")); + body.put("email", email_body); + + RequestBody password_body = RequestBody.create(binding.password.getText().toString(), MediaType.parse("text/plain")); + body.put("password", password_body); + + RequestBody c_password_body = RequestBody.create(binding.confirmPassword.getText().toString(), MediaType.parse("text/plain")); + body.put("c_password", c_password_body); + + viewModel.changeCgPassword(body, this); + + } + + private boolean allOkay() { + boolean allOkay = true; + + if (binding.password.getText() != null && binding.confirmPassword.getText() != null) { + String password = binding.password.getText().toString(); + + if (password.length() < 8) { + allOkay = false; + Toast.makeText(requireContext(), "Password must be at least 8 characters.", Toast.LENGTH_SHORT).show(); + } else if (password.contains(" ")) { + allOkay = false; + Toast.makeText(requireContext(), "Password should not contains white spaces.", Toast.LENGTH_SHORT).show(); + } else if (!password.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^a-zA-Z0-9]).{8,}$")) { + allOkay = false; + Toast.makeText(requireContext(), "Password doesn't match the required criteria.", Toast.LENGTH_SHORT).show(); + } else if (!binding.confirmPassword.getText().toString().equals(password)) { + allOkay = false; + Toast.makeText(requireContext(), "Confirm password doesn't match.", Toast.LENGTH_SHORT).show(); + } + } + + return allOkay; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Bundle bundle = getArguments(); + + if (bundle == null || + bundle.getString(FORGOT_EMAIL, null) == null) { + Navigation.findNavController(binding.getRoot()).popBackStack(); + Toast.makeText(requireContext(), "Something went wrong.", Toast.LENGTH_SHORT).show(); + return; + } + + eEmail = bundle.getString(FORGOT_EMAIL); + } + + @Override + public void onPasswordChanged(CareGiverData careGiverData) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "Password changed successfully.", Toast.LENGTH_SHORT).show(); + Navigation.findNavController(binding.getRoot()) + .popBackStack(R.id.cgSignInFragment, false); + } + + @Override + public void onPasswordChangeFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "" + message, Toast.LENGTH_SHORT).show(); + } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgCheckEmailFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgCheckEmailFragment.java index 706abde..cca94b0 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgCheckEmailFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgCheckEmailFragment.java @@ -1,27 +1,46 @@ package com.ssb.simplitend.welcome.welcomecg.fragments; +import android.app.ProgressDialog; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; import com.bumptech.glide.Glide; import com.ssb.simplitend.R; import com.ssb.simplitend.apputils.AppUtil; import com.ssb.simplitend.databinding.CgCheckEmailFragmentBinding; +import com.ssb.simplitend.welcome.welcomecg.WelcomeContracts; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgForgotPwdResult; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgWelcomeViewModel; -public class CgCheckEmailFragment extends Fragment { +import java.util.HashMap; +import java.util.Map; + +public class CgCheckEmailFragment extends Fragment implements WelcomeContracts.ForgotPwdSentCodeCallback, + WelcomeContracts.VerifyForgotOTP { protected CgCheckEmailFragmentBinding binding; - public CgCheckEmailFragment(){ + public static final String FORGOT_EMAIL = "forgot_mail"; + public static final String CG_USER_XID = "cg_user_xid"; + + private String mEmail, mUserXid; + + private CgWelcomeViewModel viewModel; + + private ProgressDialog progressDialog; + + public CgCheckEmailFragment() { // required } @@ -30,6 +49,8 @@ public class CgCheckEmailFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = CgCheckEmailFragmentBinding.inflate(inflater, container, false); + viewModel = new ViewModelProvider(requireActivity()).get(CgWelcomeViewModel.class); + initViews(); clickEvents(); @@ -37,15 +58,68 @@ public class CgCheckEmailFragment extends Fragment { return binding.getRoot(); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Bundle bundle = getArguments(); + + if (bundle == null || + bundle.getString(FORGOT_EMAIL, null) == null || + bundle.getString(CG_USER_XID, null) == null) { + // no data received + Navigation.findNavController(binding.getRoot()).popBackStack(); + Toast.makeText(requireContext(), "Something went wrong.", Toast.LENGTH_SHORT).show(); + return; + } + + mEmail = bundle.getString(FORGOT_EMAIL); + mUserXid = bundle.getString(CG_USER_XID); + + binding.emailAt.setVisibility(View.VISIBLE); + binding.email.setText(mEmail); + + } + private void clickEvents() { binding.submit.setOnClickListener(view -> { - Navigation.findNavController(view) - .navigate(R.id.action_cgCheckEmailFragment_to_cgChangePwdFragment); + if (checkOTPInputs()){ + verifyOTP(); + }else{ + Toast.makeText(requireContext(), "Enter OTP received on your email.", Toast.LENGTH_SHORT).show(); + } + }); + + binding.resendOtp.setOnClickListener(v -> { + if (mEmail == null) return; + + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we resend you an OTP."); + progressDialog.setCancelable(false); + progressDialog.show(); + + viewModel.sendForgotCodeEmail(mEmail, this); }); } + private void verifyOTP() { + progressDialog.setTitle("Please wait"); + progressDialog.setMessage("while we verify your OTP."); + progressDialog.setCancelable(false); + progressDialog.show(); + + Map body = new HashMap<>(); + + body.put("otp_code", getOTPFromInputs()); + + body.put("user_id", mUserXid); + + viewModel.verifyForgotOTP(body, this); + } + private void initViews() { + progressDialog = new ProgressDialog(requireContext()); + // showing gif Glide.with(binding.image) .asGif() @@ -57,6 +131,13 @@ public class CgCheckEmailFragment extends Fragment { } + private String getOTPFromInputs() { + return binding.otp1.getText().toString() + + binding.otp2.getText().toString() + + binding.otp3.getText().toString() + + binding.otp4.getText().toString(); + } + /* setting text change listener for every edit text for otp */ @@ -77,7 +158,7 @@ public class CgCheckEmailFragment extends Fragment { public void afterTextChanged(Editable s) { if (!s.toString().trim().isEmpty()) { binding.otp2.requestFocus(); - if (checkOTPInputs()){ + if (checkOTPInputs()) { AppUtil.closeKeyboard(requireActivity()); } } @@ -102,7 +183,7 @@ public class CgCheckEmailFragment extends Fragment { public void afterTextChanged(Editable s) { if (!s.toString().trim().isEmpty()) { binding.otp3.requestFocus(); - if (checkOTPInputs()){ + if (checkOTPInputs()) { AppUtil.closeKeyboard(requireActivity()); } } else { @@ -129,7 +210,7 @@ public class CgCheckEmailFragment extends Fragment { public void afterTextChanged(Editable s) { if (!s.toString().trim().isEmpty()) { binding.otp4.requestFocus(); - if (checkOTPInputs()){ + if (checkOTPInputs()) { AppUtil.closeKeyboard(requireActivity()); } } else { @@ -168,19 +249,67 @@ public class CgCheckEmailFragment extends Fragment { } - public boolean checkOTPInputs(){ + public boolean checkOTPInputs() { - if (binding.otp3.getText().toString().trim().length() != 1){ + if (binding.otp3.getText().toString().trim().length() != 1) { return false; - }else if (binding.otp2.getText().toString().trim().length() != 1){ + } else if (binding.otp2.getText().toString().trim().length() != 1) { return false; - }else if (binding.otp3.getText().toString().trim().length() != 1){ + } else if (binding.otp3.getText().toString().trim().length() != 1) { return false; - }else if (binding.otp4.getText().toString().trim().length() != 1){ + } else if (binding.otp4.getText().toString().trim().length() != 1) { return false; } return true; } + // otp send callback + @Override + public void onEmailSentSuccess(CgForgotPwdResult result) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "OTP resent successfully.", Toast.LENGTH_SHORT).show(); + + clearInputs(); + } + + private void clearInputs() { + binding.otp1.setText(null); + binding.otp2.setText(null); + binding.otp3.setText(null); + binding.otp4.setText(null); + + binding.otp1.requestFocus(); + } + + @Override + public void onEmailSentFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "Couldn't resend OTP.", Toast.LENGTH_SHORT).show(); + } + + // verify otp callback + + + @Override + public void onOTPVerified() { + Bundle bundle = new Bundle(); + bundle.putString(FORGOT_EMAIL, mEmail); + + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "OTP verification successful.", Toast.LENGTH_SHORT).show(); + + Navigation.findNavController(binding.getRoot()) + .navigate(R.id.action_cgCheckEmailFragment_to_cgChangePwdFragment, bundle); + } + + @Override + public void onOTPVerificationFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "" + message, Toast.LENGTH_SHORT).show(); + } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgConnectFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgConnectFragment.java index 15ef3b3..c828163 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgConnectFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgConnectFragment.java @@ -4,20 +4,28 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.navigation.Navigation; import com.bumptech.glide.Glide; import com.ssb.simplitend.R; import com.ssb.simplitend.databinding.ConnectCaregiverFragmentBinding; +import com.ssb.simplitend.welcome.welcomecg.WelcomeContracts; public class CgConnectFragment extends Fragment { protected ConnectCaregiverFragmentBinding binding; - public CgConnectFragment(){ + public static final String CAREGIVER_EMAIL = "cg_email"; + public static final String CAREGIVER_PASSWORD = "caregiver_pwd"; + + private String cg_email, cg_password; + + public CgConnectFragment() { // required } @@ -39,5 +47,30 @@ public class CgConnectFragment extends Fragment { .load(R.raw.email_sending_anim) .placeholder(R.drawable.forgot_pin_email_img) .into(binding.image); + + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + Bundle bundle = getArguments(); + + if (bundle == null || + bundle.getString(CAREGIVER_EMAIL, null) == null || + bundle.getString(CAREGIVER_PASSWORD, null) == null) { + // no data received + // Thus, asking cg_user to sign in again + Navigation.findNavController(binding.getRoot()) + .popBackStack(R.id.cgSignInFragment, false); + + return; + }else{ + cg_email = bundle.getString(CAREGIVER_EMAIL); + cg_password = bundle.getString(CAREGIVER_PASSWORD); + + binding.emailAddress.setText(cg_email); + Toast.makeText(requireContext(), "" + cg_password, Toast.LENGTH_SHORT).show(); + } } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgForgotPasswordFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgForgotPasswordFragment.java index a70d6f5..4a3fc41 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgForgotPasswordFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgForgotPasswordFragment.java @@ -1,23 +1,43 @@ package com.ssb.simplitend.welcome.welcomecg.fragments; +import static com.ssb.simplitend.welcome.welcomecg.fragments.CgCheckEmailFragment.CG_USER_XID; +import static com.ssb.simplitend.welcome.welcomecg.fragments.CgCheckEmailFragment.FORGOT_EMAIL; + +import android.app.ProgressDialog; import android.os.Bundle; +import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; import com.bumptech.glide.Glide; import com.ssb.simplitend.R; +import com.ssb.simplitend.apputils.AppUtil; import com.ssb.simplitend.databinding.CgForgotPasswordBinding; +import com.ssb.simplitend.welcome.welcomecg.WelcomeContracts; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgForgotPwdResult; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgWelcomeViewModel; -public class CgForgotPasswordFragment extends Fragment { +import java.util.HashMap; +import java.util.Map; + +public class CgForgotPasswordFragment extends Fragment implements WelcomeContracts.ForgotPwdSentCodeCallback { protected CgForgotPasswordBinding binding; + private CgWelcomeViewModel viewModel; + + private ProgressDialog progressDialog; + + String mEmail; + public CgForgotPasswordFragment(){ // required } @@ -27,6 +47,8 @@ public class CgForgotPasswordFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = CgForgotPasswordBinding.inflate(inflater, container, false); + viewModel = new ViewModelProvider(requireActivity()).get(CgWelcomeViewModel.class); + initViews(); clickEvents(); @@ -37,14 +59,31 @@ public class CgForgotPasswordFragment extends Fragment { private void clickEvents() { binding.submit.setOnClickListener(v -> { - Navigation.findNavController(v) - .navigate(R.id.action_cgForgotPasswordFragment_to_cgCheckEmailFragment); + + if (!Patterns.EMAIL_ADDRESS.matcher(binding.emailAddress.getText().toString().trim()).matches()){ + binding.emailAddress.setError("Invalid email."); + return; + } + + AppUtil.closeKeyboard(requireActivity()); + + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we send you an email with a code."); + progressDialog.setCancelable(false); + progressDialog.show(); + + mEmail = binding.emailAddress.getText().toString().trim(); + + viewModel.sendForgotCodeEmail(mEmail, this); + }); } private void initViews() { + progressDialog = new ProgressDialog(requireContext()); + // showing gif Glide.with(binding.image) .asGif() @@ -54,4 +93,26 @@ public class CgForgotPasswordFragment extends Fragment { } + @Override + public void onEmailSentSuccess(CgForgotPwdResult result) { + Bundle bundle = new Bundle(); + + bundle.putString(FORGOT_EMAIL, mEmail); + bundle.putString(CG_USER_XID, result.principal_xid); + + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "OTP sent successfully.", Toast.LENGTH_SHORT).show(); + + Navigation.findNavController(binding.getRoot()) + .navigate(R.id.action_cgForgotPasswordFragment_to_cgCheckEmailFragment, bundle); + + } + + @Override + public void onEmailSentFailed(Throwable t, String message) { + progressDialog.dismiss(); + + Toast.makeText(requireContext(), "" + message, Toast.LENGTH_SHORT).show(); + } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java index 66805da..2fe06b9 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgRegisterFragment.java @@ -1,5 +1,8 @@ package com.ssb.simplitend.welcome.welcomecg.fragments; +import static com.ssb.simplitend.welcome.welcomecg.fragments.CgConnectFragment.CAREGIVER_EMAIL; +import static com.ssb.simplitend.welcome.welcomecg.fragments.CgConnectFragment.CAREGIVER_PASSWORD; + import android.app.DatePickerDialog; import android.app.ProgressDialog; import android.content.Intent; @@ -27,6 +30,7 @@ import androidx.navigation.Navigation; import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; +import com.ssb.simplitend.R; import com.ssb.simplitend.apputils.AppUtil; import com.ssb.simplitend.apputils.EditTextErrorRemover; import com.ssb.simplitend.databinding.CgRegisterFragmentBinding; @@ -62,6 +66,8 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg private PopupWindow passwordWindow; + private String mPassword; + private Calendar dob_selected; public CgRegisterFragment(){ @@ -140,7 +146,7 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg AppUtil.closeKeyboard(requireActivity()); progressDialog.setTitle("Please wait..."); - progressDialog.setMessage("while we verify your entered email."); + progressDialog.setMessage("while we register you as a caregiver."); progressDialog.setCancelable(false); progressDialog.show(); @@ -166,7 +172,13 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg RequestBody email_body = RequestBody.create(binding.email.getText().toString().trim(), MediaType.parse("text/plain")); body.put("email", email_body); - RequestBody password_body = RequestBody.create(binding.password.getText().toString().trim(), MediaType.parse("text/plain")); + if (binding.password.getText() == null){ + mPassword = ""; + }else{ + mPassword = binding.password.getText().toString(); + } + + RequestBody password_body = RequestBody.create(mPassword, MediaType.parse("text/plain")); body.put("password", password_body); viewModel.registerCareGiver(body, this); @@ -375,6 +387,25 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg allOkay = false; } + if (allOkay && binding.password.getText() != null && binding.confirmPassword.getText() != null){ + String password = binding.password.getText().toString(); + + if (password.length() < 8){ + allOkay = false; + Toast.makeText(requireContext(), "Password must be at least 8 characters.", Toast.LENGTH_SHORT).show(); + }else if (password.contains(" ")){ + allOkay = false; + Toast.makeText(requireContext(), "Password should not contains white spaces.", Toast.LENGTH_SHORT).show(); + }else if (!password.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^a-zA-Z0-9]).{8,}$")){ + allOkay = false; + Toast.makeText(requireContext(), "Password doesn't match the required criteria.", Toast.LENGTH_SHORT).show(); + passwordWindow.showAsDropDown(binding.pwdTitle); + }else if (!binding.confirmPassword.getText().toString().equals(password)){ + allOkay = false; + Toast.makeText(requireContext(), "Confirm password doesn't match.", Toast.LENGTH_SHORT).show(); + } + } + if (!binding.tncCheck.isChecked() && allOkay) { AppUtil.showAlert(requireContext(), "Accept terms and conditions", @@ -387,18 +418,31 @@ public class CgRegisterFragment extends Fragment implements WelcomeContracts.Reg allOkay = false; } - // TODO: 02-08-2023 password check - return allOkay; } @Override public void onCareGiverRegistered(CareGiverData careGiverData) { + Toast.makeText(requireContext(), "Caregiver registered successfully.", Toast.LENGTH_SHORT).show(); + Bundle bundle = new Bundle(); + bundle.putString(CAREGIVER_EMAIL, careGiverData.email); + bundle.putString(CAREGIVER_PASSWORD, mPassword); + + progressDialog.dismiss(); + + Navigation.findNavController(binding.getRoot()) + .navigate(R.id.action_cgRegisterFragment_to_cgConnectFragment, bundle); } @Override public void onRegisterFailed(Throwable t, String message) { - + progressDialog.dismiss(); + AppUtil.showAlert(requireContext(), + getString(R.string.something_went_wrong), + message, + getString(R.string.ok), + ((dialogInterface, i) -> {}), + null, null); } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgSignInFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgSignInFragment.java index e5b8c6f..014fd6b 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgSignInFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/fragments/CgSignInFragment.java @@ -1,24 +1,37 @@ package com.ssb.simplitend.welcome.welcomecg.fragments; +import android.app.ProgressDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; import com.ssb.simplitend.R; -import com.ssb.simplitend.databinding.CgHowToSetUpFragmentBinding; +import com.ssb.simplitend.apputils.AppUtil; import com.ssb.simplitend.databinding.CgSignInFragmentBinding; +import com.ssb.simplitend.welcome.welcomecg.WelcomeContracts; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CareGiverData; +import com.ssb.simplitend.welcome.welcomecg.mvvm.CgWelcomeViewModel; -public class CgSignInFragment extends Fragment { +import java.util.HashMap; +import java.util.Map; + +public class CgSignInFragment extends Fragment implements WelcomeContracts.CgLoginCallback { // view binding protected CgSignInFragmentBinding binding; + private CgWelcomeViewModel viewModel; + + private ProgressDialog progressDialog; + public CgSignInFragment(){ // required empty const. } @@ -28,7 +41,47 @@ public class CgSignInFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = CgSignInFragmentBinding.inflate(inflater, container, false); + viewModel = new ViewModelProvider(requireActivity()).get(CgWelcomeViewModel.class); + + initViews(); + + clickEvents(); + + return binding.getRoot(); + } + + private void initViews() { + progressDialog = new ProgressDialog(requireContext()); + } + + private void clickEvents() { binding.signInBtn.setOnClickListener(v -> { + AppUtil.closeKeyboard(requireActivity()); + + binding.email.setError(null); + + if (allOkay()){ + + progressDialog.setTitle("Please wait..."); + progressDialog.setMessage("while we sign you in."); + progressDialog.setCancelable(false); + progressDialog.show(); + + Map body = new HashMap<>(); + body.put("email", binding.email.getText().toString()); + + String password; + if (binding.password.getText() == null) { + password = ""; + } + else{ + password = binding.password.getText().toString(); + } + + body.put("password", password); + + viewModel.loginCaregiver(body, this); + } }); binding.registerBtn.setOnClickListener(v -> { @@ -39,7 +92,33 @@ public class CgSignInFragment extends Fragment { Navigation.findNavController(v) .navigate(R.id.action_cgSignInFragment_to_cgForgotPasswordFragment); }); + } - return binding.getRoot(); + private boolean allOkay() { + boolean allOkay = true; + + if (binding.email.getText().toString().trim().isEmpty()){ + allOkay = false; + binding.email.setError("Please enter email."); + } + + if (binding.password.getText() != null && binding.password.getText().toString().trim().isEmpty()){ + allOkay = false; + Toast.makeText(requireContext(), "Please enter password.", Toast.LENGTH_SHORT).show(); + } + + return allOkay; + } + + @Override + public void onLoginSuccess(CareGiverData careGiverData, String token) { + progressDialog.dismiss(); + Toast.makeText(requireContext(), "Log in success.", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onLogInFailed(Throwable t, String message) { + progressDialog.dismiss(); + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgForgotPwdResult.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgForgotPwdResult.java new file mode 100644 index 0000000..65d7f15 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgForgotPwdResult.java @@ -0,0 +1,21 @@ +package com.ssb.simplitend.welcome.welcomecg.mvvm; + +public class CgForgotPwdResult{ + public int id; + public String principal_xid; + public String contact_xid; + public String availability_working_hours; + public String availability_weekend_holiday; + public String availability_overnight; + public String is_suspended; + public String is_archived; + public String active; + public String deleted_at; + public String created_by; + public String updated_by; + public String created_at; + public String updated_at; + + public CgForgotPwdResult(){} + +} diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeRepository.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeRepository.java index 8f17b6f..9df17e1 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeRepository.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeRepository.java @@ -64,4 +64,165 @@ public class CgWelcomeRepository { } + public void verifyCgOTP(Map body, + WelcomeContracts.VerifyCgOTPCallback verifyCgOTPCallback){ + + apiService.verifyCgOTP(body) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200){ + verifyCgOTPCallback.onVerifyOTPFailed(new Exception(), response.body().message); + return; + } + + verifyCgOTPCallback.onOTPVerifies(); + }else{ + verifyCgOTPCallback.onVerifyOTPFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + Log.e(TAG, "onFailure: ", t); + verifyCgOTPCallback.onVerifyOTPFailed(t, "Please try again later."); + } + }); + + } + + public void loginCaregiver(Map body, + WelcomeContracts.CgLoginCallback loginCallback){ + + apiService.loginCaregiver(body) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + loginCallback.onLogInFailed(new Exception(), response.body().message); + return; + } + + loginCallback.onLoginSuccess(response.body().result, response.body().token); + }else{ + loginCallback.onLogInFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + loginCallback.onLogInFailed(new Exception(), "Please try again later."); + } + }); + + } + + public void sendForgotCodeEmail(String email, + WelcomeContracts.ForgotPwdSentCodeCallback sentCodeCallback){ + apiService.sendForgotCodeEmail(email) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + sentCodeCallback.onEmailSentFailed(new Exception(), response.body().message); + return; + } + + sentCodeCallback.onEmailSentSuccess(response.body().result); + }else{ + sentCodeCallback.onEmailSentFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + sentCodeCallback.onEmailSentFailed(new Exception(), "Please try again later."); + } + }); + } + + public void verifyForgotOTP(Map body, + WelcomeContracts.VerifyForgotOTP forgotOTPCallback){ + + apiService.verifyForgotOTP(body) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200){ + forgotOTPCallback.onOTPVerificationFailed(new Exception(), response.body().message); + return; + } + + forgotOTPCallback.onOTPVerified(); + }else{ + forgotOTPCallback.onOTPVerificationFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + forgotOTPCallback.onOTPVerificationFailed(new Exception(), "Please try again later."); + } + }); + + } + + public void changeCgPassword(Map body, + WelcomeContracts.ChangePasswordCallback changePasswordCallback){ + + apiService.changeCgPassword(body) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + changePasswordCallback.onPasswordChangeFailed(new Exception(), response.body().message); + return; + } + + changePasswordCallback.onPasswordChanged(response.body().result); + }else{ + changePasswordCallback.onPasswordChangeFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + changePasswordCallback.onPasswordChangeFailed(new Exception(), "Please try again later."); + } + }); + + } + + public void connectCg(Map body, + WelcomeContracts.ConnectCgCallback connectCgCallback){ + + apiService.connectCg(body) + .enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null){ + if (response.body().status != 200 || response.body().result == null){ + connectCgCallback.onCgConnectFailed(new Exception(), response.body().message); + return; + } + + connectCgCallback.onCgConnected(response.body().result); + }else{ + connectCgCallback.onCgConnectFailed(new Exception(), "Please try again later."); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + connectCgCallback.onCgConnectFailed(new Exception(), "Please try again later."); + } + }); + + } + } diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeViewModel.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeViewModel.java index 0ff0c21..4bf6094 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeViewModel.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/CgWelcomeViewModel.java @@ -36,6 +36,36 @@ public class CgWelcomeViewModel extends ViewModel { repository.registerCareGiver(body, registerCareGiverCallback); } + public void verifyCgOTP(Map body, + WelcomeContracts.VerifyCgOTPCallback verifyCgOTPCallback){ + repository.verifyCgOTP(body, verifyCgOTPCallback); + } + + public void loginCaregiver(Map body, + WelcomeContracts.CgLoginCallback loginCallback){ + repository.loginCaregiver(body, loginCallback); + } + + public void sendForgotCodeEmail(String email, + WelcomeContracts.ForgotPwdSentCodeCallback sentCodeCallback){ + repository.sendForgotCodeEmail(email, sentCodeCallback); + } + + public void verifyForgotOTP(Map body, + WelcomeContracts.VerifyForgotOTP forgotOTPCallback){ + repository.verifyForgotOTP(body, forgotOTPCallback); + } + + public void changeCgPassword(Map body, + WelcomeContracts.ChangePasswordCallback changePasswordCallback){ + repository.changeCgPassword(body, changePasswordCallback); + } + + public void connectCg(Map body, + WelcomeContracts.ConnectCgCallback connectCgCallback){ + repository.connectCg(body, connectCgCallback); + } + public ArrayList loadCountryCodeDropDown(Context context) { ArrayList countryCodeList = new ArrayList<>(); diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/ConnectCgResult.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/ConnectCgResult.java new file mode 100644 index 0000000..e549bc0 --- /dev/null +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomecg/mvvm/ConnectCgResult.java @@ -0,0 +1,17 @@ +package com.ssb.simplitend.welcome.welcomecg.mvvm; + +public class ConnectCgResult{ + public int id; + public String patient_xid; + public String care_giver_xid; + public String link_code; + public int is_connected; + public String active; + public String deleted_at; + public String created_by; + public String updated_by; + public String created_at; + public String updated_at; + + public ConnectCgResult(){} +} diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/forgotpin/CheckMailFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/forgotpin/CheckMailFragment.java index 4bcb4bd..930c8f9 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/forgotpin/CheckMailFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/forgotpin/CheckMailFragment.java @@ -292,6 +292,15 @@ public class CheckMailFragment extends Fragment implements WelcomeContracts.Veri return encoded_email + "@" + arr[1]; } + private void clearInputs() { + binding.otp1.setText(null); + binding.otp2.setText(null); + binding.otp3.setText(null); + binding.otp4.setText(null); + + binding.otp1.requestFocus(); + } + @Override public void onOTPVerified() { progressDialog.dismiss(); @@ -320,6 +329,8 @@ public class CheckMailFragment extends Fragment implements WelcomeContracts.Veri user_id = otpSentResponse.principal_xid; Toast.makeText(requireContext(), "OTP resent successfully.", Toast.LENGTH_SHORT).show(); + + clearInputs(); } @Override diff --git a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java index 0d0397a..0b780ef 100644 --- a/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java +++ b/app/src/main/java/com/ssb/simplitend/welcome/welcomepatient/fragments/register/LocationFragment.java @@ -471,6 +471,8 @@ public class LocationFragment extends Fragment implements OnMapReadyCallback, binding.stateSpinner.selectItemByIndex(state_index); } } + }else{ + binding.countrySpinner.clearSelectedItem(); } } diff --git a/app/src/main/res/layout/cg_change_password_fragment.xml b/app/src/main/res/layout/cg_change_password_fragment.xml index 95b05a4..e3207d9 100644 --- a/app/src/main/res/layout/cg_change_password_fragment.xml +++ b/app/src/main/res/layout/cg_change_password_fragment.xml @@ -78,7 +78,7 @@ > @@ -177,7 +177,7 @@ > diff --git a/app/src/main/res/layout/cg_check_email_fragment.xml b/app/src/main/res/layout/cg_check_email_fragment.xml index 06a92a3..2a959ed 100644 --- a/app/src/main/res/layout/cg_check_email_fragment.xml +++ b/app/src/main/res/layout/cg_check_email_fragment.xml @@ -56,20 +56,11 @@ android:id="@+id/email_at" android:orientation="horizontal"> - - diff --git a/app/src/main/res/layout/cg_profile_progress_fragment.xml b/app/src/main/res/layout/cg_profile_progress_fragment.xml new file mode 100644 index 0000000..acc1ee1 --- /dev/null +++ b/app/src/main/res/layout/cg_profile_progress_fragment.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cg_register_fragment.xml b/app/src/main/res/layout/cg_register_fragment.xml index 167a25e..ef5f707 100644 --- a/app/src/main/res/layout/cg_register_fragment.xml +++ b/app/src/main/res/layout/cg_register_fragment.xml @@ -275,8 +275,8 @@ diff --git a/app/src/main/res/layout/cg_sign_in_fragment.xml b/app/src/main/res/layout/cg_sign_in_fragment.xml index ff92873..48607f5 100644 --- a/app/src/main/res/layout/cg_sign_in_fragment.xml +++ b/app/src/main/res/layout/cg_sign_in_fragment.xml @@ -107,7 +107,7 @@ > - + + + + + + + + + + + + - android:layout_centerVertical="true" - /> + + - + xmlns:app="http://schemas.android.com/apk/res-auto" + app:cardCornerRadius="@dimen/_5sdp" + app:cardBackgroundColor="@color/pwd_bg"> - - android:text="@string/password_details" - android:fontFamily="@font/nunito_regular" - android:textColor="@color/white" - android:textSize="11sp" + + android:padding="10dp" + /> - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/welcome_nav_graph.xml b/app/src/main/res/navigation/welcome_nav_graph.xml index c6c8ce2..45bc19d 100644 --- a/app/src/main/res/navigation/welcome_nav_graph.xml +++ b/app/src/main/res/navigation/welcome_nav_graph.xml @@ -2,7 +2,7 @@ + app:startDestination="@id/cgSignInFragment"> Enter email address Submit Check your mail - Please enter the temporary pin recieved at email address + Please enter the temporary pin received at email address Didn\'t your receive any code? Resend Change your Pin @@ -292,5 +292,6 @@ Enter OTP info + Create Geo Fence \ No newline at end of file