From 21f2f69bd24cccd73979df6bdea5b57ba1f0defe Mon Sep 17 00:00:00 2001 From: Preyea Regmi Date: Wed, 3 Jun 2020 18:46:47 +0545 Subject: [PATCH] Reset password fixes --- .../loginV2/view/LoginV2Activity.java | 13 +- .../ResetPassViewModelFactory.java | 28 +++ .../presenter/ResetPassV2Presenter.java | 104 ++++++++--- .../ResetPassV2PresenterInterface.java | 9 +- .../presenter/ResetPassViewLiveData.java | 54 ++++++ .../resetpassV2/view/ResetPassV2Activity.java | 171 ++++-------------- .../res/layout/activity_reset_pass_v2.xml | 107 ++--------- 7 files changed, 221 insertions(+), 265 deletions(-) create mode 100644 app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java create mode 100644 app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java index b603a514..94ea2708 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java @@ -106,8 +106,8 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene RxTextView.textChanges(passwordEdTxt).skipInitialValue() )); - loginRelatedViewEvents.getUserIdInputLiveData().observe(this, this::showUserIdError); - loginRelatedViewEvents.getPasswordInputLiveData().observe(this, this::showPasswordError); + loginRelatedViewEvents.getUserIdInputLiveData().observe(this, this::onUserIdDataReceived); + loginRelatedViewEvents.getPasswordInputLiveData().observe(this, this::onPasswordDataReceived); loginRelatedViewEvents.getAllFormValidLiveData().observe(this, result -> loginBtn.setEnabled(result.isValid())); } @@ -124,14 +124,17 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene } - private void showPasswordError(FormInputStateDTO formInputStateDTO) { - if (formInputStateDTO.isValid()) + private void onPasswordDataReceived(FormInputStateDTO formInputStateDTO) { + if (formInputStateDTO.isValid()) { passwordTxtInputLayout.setError(null); + if(formInputStateDTO.hasData()) + passwordEdTxt.setText(formInputStateDTO.getData()); + } else passwordTxtInputLayout.setError(formInputStateDTO.getErrorMessage()); } - private void showUserIdError(FormInputStateDTO formInputStateDTO) { + private void onUserIdDataReceived(FormInputStateDTO formInputStateDTO) { if (formInputStateDTO.isValid()) { usernameIdTxtInputLayout.setError(null); if (formInputStateDTO.hasData()) { diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java new file mode 100644 index 00000000..68cba0bb --- /dev/null +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java @@ -0,0 +1,28 @@ +package com.gmeremit.online.gmeremittance_native.resetpassV2; + +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import com.gmeremit.online.gmeremittance_native.loginV2.gateway.LoginV2Gateway; +import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2Presenter; +import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2PresenterInterface; +import com.gmeremit.online.gmeremittance_native.resetpassV2.gateway.ResetPassV2Gateway; +import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2Presenter; +import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2PresenterInterface; + +public class ResetPassViewModelFactory implements ViewModelProvider.Factory { + + private final ResetPassV2PresenterInterface.ResetPassV2ContractInterface view; + + public ResetPassViewModelFactory(ResetPassV2PresenterInterface.ResetPassV2ContractInterface view) { + this.view=view; + } + + @SuppressWarnings("unchecked") + @NonNull + @Override + public T create(@NonNull Class modelClass) { + return (T) new ResetPassV2Presenter(view,new ResetPassV2Gateway()); + } +} diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java index 9faca6be..4294f766 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java @@ -2,7 +2,8 @@ package com.gmeremit.online.gmeremittance_native.resetpassV2.presenter; import com.gmeremit.online.gmeremittance_native.GmeApplication; import com.gmeremit.online.gmeremittance_native.R; -import com.gmeremit.online.gmeremittance_native.base.BasePresenter; +import com.gmeremit.online.gmeremittance_native.base.BaseViewModel; +import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO; import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog; import com.gmeremit.online.gmeremittance_native.resetpassV2.gateway.ResetPassV2Gateway; import com.gmeremit.online.gmeremittance_native.resetpassV2.model.ResetApiResponse; @@ -12,29 +13,36 @@ import com.gmeremit.online.gmeremittance_native.utils.https.GenericApiObserverRe import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableObserver; import io.reactivex.schedulers.Schedulers; -public class ResetPassV2Presenter extends BasePresenter implements ResetPassV2PresenterInterface, ResetPassV2InteractorInterface { +public class ResetPassV2Presenter extends BaseViewModel implements ResetPassV2PresenterInterface, ResetPassV2InteractorInterface { private final ResetPassV2Gateway gateway; private final ResetPassV2ContractInterface view; - CompositeDisposable compositeDisposable; + private final CompositeDisposable useCaseCompositeDisposable; + private final CompositeDisposable viewEventCompositeDisposable; + private final ResetPassValidator resetPassValidator; + private final ResetPassViewLiveData resetPassViewLiveData; public ResetPassV2Presenter(ResetPassV2PresenterInterface.ResetPassV2ContractInterface view,ResetPassV2Gateway gateway) { this.gateway= gateway; - compositeDisposable=new CompositeDisposable(); + useCaseCompositeDisposable =new CompositeDisposable(); + viewEventCompositeDisposable = new CompositeDisposable(); + resetPassValidator=new ResetPassValidator(); this.view=view; + resetPassViewLiveData = new ResetPassViewLiveData(); } @Override - public void resetPassword(String emailId, String dob) { + public void resetPassword() { GmeApplication.AppRelatedMetaData appRelatedMetaData=GmeApplication.getAppRelatedMetaData(view.getContext()); String auth = "Basic " + Utils.toBase64("172017F9EC11222E8107142733:QRK2UM0Q:" + appRelatedMetaData.getDeviceId()); - compositeDisposable.add( - gateway.resetPassV2(auth,emailId,dob) + useCaseCompositeDisposable.add( + gateway.resetPassV2(auth,resetPassValidator.userId,"") .doOnSubscribe(d->view.showProgressBar(true,getStringfromStringId(R.string.processing_request_text))) .doFinally(()->view.showProgressBar(false,"")) .subscribeOn(Schedulers.io()) @@ -46,40 +54,76 @@ public class ResetPassV2Presenter extends BasePresenter implements ResetPassV2Pr } @Override - public boolean validateAll(String email, String dob) { - boolean isEmailValid=validateEmail(email); - boolean isDobValid=validateDob(dob); - return isEmailValid&&isDobValid; + public ResetPassViewLiveData getResetPassViewEvents(ResetPassViewLiveData.ResetPassViewBindings viewBindings) { + bindView(viewBindings); + return resetPassViewLiveData; } + private void bindView(ResetPassViewLiveData.ResetPassViewBindings viewBindings) { + this.viewEventCompositeDisposable.add( + viewBindings.getUserIdTextObservable().map(this.resetPassValidator::isUserIdValid) + .subscribeWith(new DisposableObserver() { - private boolean validateEmail(String emailId) { - if(!Utils.isValidEmail(emailId)) - { - this.view.showIncorrectEmail(getStringfromStringId(R.string.email_valid_error)); - return false; - } - this.view.showIncorrectEmail(null); - return true; + @Override + public void onNext(Boolean aBoolean) { + resetPassViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(aBoolean, "")); + } + + @Override + public void onError(Throwable e) { + resetPassViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(false, "")); + } + + @Override + public void onComplete() { + + } + }) + ); } - private boolean validateDob(String dobString) { -// if(dobString==null||dobString.trim().length()<1) -// { -// view.showIncorrectDob(getStringfromStringId(R.string.dob_valid_error)); -// return false; -// } -// view.showIncorrectDob(null); - return true; + + @Override + public void onViewReady() { + + } + + @Override + public void onViewNotReady() { + } @Override public void onViewDestroyed() { super.onViewDestroyed(); - if (compositeDisposable != null & !compositeDisposable.isDisposed()) { - compositeDisposable.dispose(); - compositeDisposable.clear(); + if ( !useCaseCompositeDisposable.isDisposed()) { + useCaseCompositeDisposable.dispose(); + } + } + + public class ResetPassValidator + { + private String userId; + + + public boolean isUserIdValid(CharSequence userID) + { + if(userID==null|| userID.length()<1) + { + resetPassViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(false, getStringfromStringId(R.string.user_id_empty_error))); + this.userId = null; + return false; + } + else + { + resetPassViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(true, "")); + this.userId = userID.toString(); + return true; + } + + } + } public class ResetPassObserver extends GenericApiObserverResponse diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java index 1d40a5e4..1aef28b1 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java @@ -9,17 +9,16 @@ public interface ResetPassV2PresenterInterface extends BasePresenterInterface { - void resetPassword(String emailId, String dob); + void resetPassword(); + + ResetPassViewLiveData getResetPassViewEvents(ResetPassViewLiveData.ResetPassViewBindings viewBindings); - boolean validateAll(String email,String dob); interface ResetPassV2ContractInterface extends BaseContractInterface { - void showIncorrectEmail(String message); - void showIncorrectDob(String message); - Context getContext(); + }} diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java new file mode 100644 index 00000000..270c7c17 --- /dev/null +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java @@ -0,0 +1,54 @@ +package com.gmeremit.online.gmeremittance_native.resetpassV2.presenter; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO; + +import io.reactivex.Observable; + +public class ResetPassViewLiveData { + + private MutableLiveData> userIdInputLiveData; + private MutableLiveData allFormValidLiveData; + + + public ResetPassViewLiveData() { + userIdInputLiveData=new MutableLiveData<>(); + allFormValidLiveData=new MutableLiveData<>(); + + } + + + public LiveData getAllFormValidLiveData() { + return allFormValidLiveData; + } + + public void setAllFormValidLiveData(FormInputStateDTO allFormValidLiveData) { + this.allFormValidLiveData.setValue(allFormValidLiveData); + } + + public LiveData> getUserIdInputLiveData() { + return userIdInputLiveData; + } + + public void setUserIdInputLiveData(FormInputStateDTO userIdInputLiveData) { + this.userIdInputLiveData.setValue(userIdInputLiveData); + } + + + public static class ResetPassViewBindings + { + private Observable userIdTextObservable; + private Observable passwordInputLiveData; + + public ResetPassViewBindings(Observable userIdTextObservable) { + this.userIdTextObservable = userIdTextObservable; + } + + public Observable getUserIdTextObservable() { + return userIdTextObservable; + } + + } +} diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java index f41243e1..f885ace2 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java @@ -1,47 +1,32 @@ package com.gmeremit.online.gmeremittance_native.resetpassV2.view; -import android.content.Context; -import android.graphics.Rect; - -import androidx.core.view.GestureDetectorCompat; -import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -import android.view.GestureDetector; -import android.view.MotionEvent; import android.view.View; import android.widget.EditText; -import android.widget.FrameLayout; + +import androidx.lifecycle.ViewModelProvider; import com.gmeremit.online.gmeremittance_native.R; import com.gmeremit.online.gmeremittance_native.base.BaseActivity; -import com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView; -import com.gmeremit.online.gmeremittance_native.resetpassV2.gateway.ResetPassV2Gateway; +import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO; +import com.gmeremit.online.gmeremittance_native.resetpassV2.ResetPassViewModelFactory; import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2Presenter; import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2PresenterInterface; -import com.gmeremit.online.gmeremittance_native.utils.Utils; -import com.tsongkha.spinnerdatepicker.SpinnerDatePickerDialogBuilder; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Locale; +import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassViewLiveData; +import com.google.android.material.textfield.TextInputLayout; +import com.jakewharton.rxbinding3.widget.RxTextView; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; -public class ResetPassV2Activity extends BaseActivity implements View.OnClickListener, ResetPassV2PresenterInterface.ResetPassV2ContractInterface { - - @BindView(R.id.email_mobile) - EditText emailId; - - @BindView(R.id.ed_dob) - EditText ed_dob; +public class ResetPassV2Activity extends BaseActivity implements ResetPassV2PresenterInterface.ResetPassV2ContractInterface { - @BindView(R.id.emailErrorTxt) - GmeErrorTextView emailErrorTxt; - - @BindView(R.id.dateErrorTxt) - GmeErrorTextView dateErrorTxt; + @BindView(R.id.email_mobile_TxtInputLayout) + TextInputLayout emailTxtInputLayout; + @BindView(R.id.email_mobile_edTxt) + EditText emailIdEdTxt; @BindView(R.id.btn_submit) View btn_submit; @@ -50,17 +35,10 @@ public class ResetPassV2Activity extends BaseActivity implements View.OnClickLis View iv_back; - @BindView(R.id.ed_dob_container) - FrameLayout ed_dob_container; - - - private ResetPassV2PresenterInterface presenterInterface; + private ResetPassViewLiveData resetPassLiveData; - private GestureDetectorCompat dobConatinerClickGestureDetector; - private ResetDobClickGestureDetector dobContainerOnClickGestureDetector; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -71,128 +49,45 @@ public class ResetPassV2Activity extends BaseActivity implements View.OnClickLis } private void initialize() { - presenterInterface = new ResetPassV2Presenter(this,new ResetPassV2Gateway()); iv_back.setVisibility(View.VISIBLE); - dobContainerOnClickGestureDetector = new ResetDobClickGestureDetector(); - dobConatinerClickGestureDetector = new GestureDetectorCompat(this, dobContainerOnClickGestureDetector); - } - - private void performDefaultAction(Bundle savedInstanceState) { - - } - - -// @Override -// public boolean dispatchTouchEvent(MotionEvent ev) { -// return (dobConatinerClickGestureDetector.onTouchEvent(ev) || super.dispatchTouchEvent(ev)); -// } - + presenterInterface = new ViewModelProvider(this, new ResetPassViewModelFactory(this)).get(ResetPassV2Presenter.class); + resetPassLiveData = presenterInterface.getResetPassViewEvents(new ResetPassViewLiveData.ResetPassViewBindings(RxTextView.textChanges(emailIdEdTxt).skipInitialValue())); - @Override - protected void onStart() { - super.onStart(); - btn_submit.setOnClickListener(this); - iv_back.setOnClickListener(this); + resetPassLiveData.getUserIdInputLiveData().observe(this, this::onUserIdDataRecieved); + resetPassLiveData.getAllFormValidLiveData().observe(this, result->btn_submit.setEnabled(result.isValid())); } - - @Override - protected void onStop() { - super.onStop(); - btn_submit.setOnClickListener(null); - iv_back.setOnClickListener(null); + private void onUserIdDataRecieved(FormInputStateDTO formData) { + if (formData.isValid()) { + emailTxtInputLayout.setError(null); + if (formData.hasData()) + emailIdEdTxt.setText(formData.getData()); + } else + emailTxtInputLayout.setError(formData.getErrorMessage()); } - @Override - public void onClick(View v) { - switch (v.getId()) { - - - case R.id.btn_submit: - if (presenterInterface.validateAll(emailId.getText().toString(),ed_dob.getText().toString()) ) { - hideKeyBoard(); - presenterInterface.resetPassword(emailId.getText().toString(), ed_dob.getText().toString()); - } - break; + private void performDefaultAction(Bundle savedInstanceState) { - case R.id.iv_back: - onBackPressed(); - break; - } } - public void promptDatePicker() { - - hideKeyBoard(); - SpinnerDatePickerDialogBuilder builder = new SpinnerDatePickerDialogBuilder(); - - builder.context(ResetPassV2Activity.this) - .spinnerTheme(R.style.NumberPickerStyle) - .showTitle(true) - .showDaySpinner(true) - .dialogTheme(R.style.DatePickerTheme) - .setTitle(getString(R.string.select_dob_text)) - .setPositiveButtonText(getString(R.string.ok_text)) - .setNegativeButtonText(getString(R.string.cancel_text)) - .setCurrentDateAsMaxDate() - .defaultDate(1990, 1, 1) - .callback(new com.tsongkha.spinnerdatepicker.DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(com.tsongkha.spinnerdatepicker.DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) { - Calendar newDate = Calendar.getInstance(); - newDate.set(year, monthOfYear, dayOfMonth); - ed_dob.setText(new SimpleDateFormat(Utils.getDefaultDateFormat(), Locale.US).format(newDate.getTime())); - } - }) - .build().show(); - - } - @Override - public void showIncorrectEmail(String message) { - emailErrorTxt.setErrorText(message); + @OnClick(R.id.iv_back) + public void onBackBtnClicked() { + onBackPressed(); } - @Override - public void showIncorrectDob(String message) { - dateErrorTxt.setErrorText(message); - } - @Override - public Context getContext() { - return this; + @OnClick(R.id.btn_submit) + public void onSubmitBtnClicked() { + presenterInterface.resetPassword(); } - class ResetDobClickGestureDetector extends GestureDetector.SimpleOnGestureListener { - @Override - public boolean onSingleTapUp(MotionEvent e) { - if (e.getAction() == MotionEvent.ACTION_UP) { - boolean isDobContainerClicked = checkIfDateContainerIsClicked(e.getX(), e.getY()); - if (isDobContainerClicked) - promptDatePicker(); - return isDobContainerClicked; - } - return super.onSingleTapUp(e); - } - - private boolean checkIfDateContainerIsClicked(float x, float y) { - int posX = (int) x; - int posY = (int) y; - - int[] dobConatinerLeftAndTopCoordinates = new int[2]; +} - ed_dob_container.getLocationOnScreen(dobConatinerLeftAndTopCoordinates); - Rect dobContainerBoundRect = new Rect(dobConatinerLeftAndTopCoordinates[0], dobConatinerLeftAndTopCoordinates[1], - dobConatinerLeftAndTopCoordinates[0] + ed_dob_container.getMeasuredWidth(), - dobConatinerLeftAndTopCoordinates[1] + ed_dob_container.getMeasuredHeight()); - return dobContainerBoundRect.contains(posX, posY); - } - } -} diff --git a/app/src/main/res/layout/activity_reset_pass_v2.xml b/app/src/main/res/layout/activity_reset_pass_v2.xml index 78cdd01e..18d96901 100644 --- a/app/src/main/res/layout/activity_reset_pass_v2.xml +++ b/app/src/main/res/layout/activity_reset_pass_v2.xml @@ -30,7 +30,7 @@ android:paddingBottom="5dp" android:text="@string/forgot_password_title_text" android:textColor="@color/colorAccent" - android:textSize="24sp" + android:textSize="@dimen/h5" app:txtfontName="@string/bold"/> - - - - - - - - - + + + + + + + />