diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java index 6a637b2d..0dac113a 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java @@ -64,7 +64,7 @@ public class HomeV2Presenter extends BasePresenter implements HomeV2PresenterInt @Override public void getRequiredData() { compositeDisposable.add( - Observable.concat(getDataFromServerAndSaveIt().timeout(5, TimeUnit.SECONDS).onErrorResumeNext(new Function>() { + Observable.concat(getDataFromServerAndSaveIt().timeout(10, TimeUnit.SECONDS).onErrorResumeNext(new Function>() { @Override public ObservableSource apply(Throwable throwable) throws Exception { if (throwable instanceof SessionExpiredException) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/gateway/FileDownloadGateway.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/gateway/FileDownloadGateway.java index 4c190cbc..be13ff75 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/gateway/FileDownloadGateway.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/gateway/FileDownloadGateway.java @@ -10,6 +10,8 @@ import com.google.android.gms.common.util.IOUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; import io.reactivex.Observable; import okhttp3.ResponseBody; @@ -24,9 +26,10 @@ public class FileDownloadGateway extends PrivilegedGateway { } public File getTempFile(Context context, String fileName) throws IOException { + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File storageDir = context.getCacheDir(); File image = File.createTempFile( - fileName, + fileName+"_"+timeStamp, ".jpg", storageDir ); diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java index f9d6f768..332b739d 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java @@ -259,7 +259,7 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter if (data.getPictures().getPassportPicture() != null && data.getPictures().getPassportPicture().length() > 0) compositeDisposable.add(fileDownloadGateway.downloadFile(data.getPictures().getPassportPicture()) .doOnSubscribe(subs -> passportImageLoadingLiveData.postValue(true)) - .delaySubscription(1, TimeUnit.SECONDS) + .delaySubscription(300, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .map(responseBody -> { File file = fileDownloadGateway.writeToFile(responseBody, fileDownloadGateway.getTempFile(view.getContext(), "AlternateIdDoc")); @@ -291,7 +291,7 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter if (data.getPictures().getAnotherIDPicture() != null && data.getPictures().getAnotherIDPicture().length() > 0) compositeDisposable.add(fileDownloadGateway.downloadFile(data.getPictures().getAnotherIDPicture()) .doOnSubscribe(subs -> alternateIDImageLoadingLiveData.postValue(true)) - .delaySubscription(1, TimeUnit.SECONDS) + .delaySubscription(300, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .map(responseBody -> { File file = fileDownloadGateway.writeToFile(responseBody, fileDownloadGateway.getTempFile(view.getContext(), "PassportIdDoc")); @@ -369,12 +369,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter validateAlternateIDFromServer(); return result; }), - this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDIssuedDateChangeEvent().map(val -> { - return validator.validateAlternateIDIssuedDate(val.toString()); - }), - this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDExpiryDateChangeEvent().map(val -> { - return validator.validateAlternateIDExpiryDate(val.toString()); - }), + this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDIssuedDateChangeEvent().map(val -> validator.validateAlternateIDIssuedDate(val.toString())), + this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDExpiryDateChangeEvent().map(val -> validator.validateAlternateIDExpiryDate(val.toString())), this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIdTypeChangeEvent().map(val -> { boolean result = validator.validateAlternateIdType(val); if (validator.hasRequiredDataForAlternatIdVerificationFromServer()) @@ -679,7 +675,6 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter } //Validate ID number with corresponding IdType from server after validating locally. - //So dependent data needs to be validated prior validating from server. @Override public void validateAlternateIDFromServer() { IDTypeDTO selectedIDType = validator.getKycRelatedDataDTO().getSelectedIdTYpeFromId(validator.getKycRelatedDataDTO().getPrimaryInformation().getAnotherIDType()); diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java index 8d0f58af..69aad689 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java @@ -306,27 +306,25 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present private void subscribeToSubmitButtonEnable(KYCV3ViewModel kycv3ViewModel) { kycv3ViewModel.getForm1SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit1.setEnabled(val)); - kycv3ViewModel.getForm2SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> { - btnSubmit2.setEnabled(val); -// if (val) -// btnSubmit2.requestFocus(); - }); - kycv3ViewModel.getForm3SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> { - btnSubmit3.setEnabled(val); -// if (val) -// btnSubmit3.requestFocus(); - }); + kycv3ViewModel.getForm2SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit2.setEnabled(val)); + kycv3ViewModel.getForm3SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit3.setEnabled(val)); } private void subscribeToCustomerRelatedData(KYCV3ViewModel kycv3ViewModel) { kycv3ViewModel.getCustomerDetailRelatedFormLiveData().observe(getViewLifecycleOwner(), val -> { + + //Since we are pre-selecting branch as first item from list if no branch is selected. + //So this data is always available to show to the user as preselected data IDTextDTO selectedGmeBranch = val.getSelectedGmeBranchFromId(val.getPrimaryInformation().getBranchId()); if (selectedGmeBranch != null) { ed_branch.setText(selectedGmeBranch.toString()); form2ViewBindings.branchSubject.onNext(selectedGmeBranch); } + //We want to show segmented form if data are available to display. + //Check data is available in cascading order. + //Order: Personal Info > Primary Info > Pictures if (val.isPersonalInfoAvailable()) { ed_firstname.setText(val.getPersonalInformation().getFullName()); ed_email.setText(val.getPersonalInformation().getEmail()); @@ -399,6 +397,8 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present }); + //Remaining data biding with corresponding views view + kycv3ViewModel.getPassportImageLiveData().observe(getViewLifecycleOwner(), bitmap -> { if (bitmap != null) { Utility.showImageFromBitmap(getActivity(), iv_passport_id, bitmap); @@ -454,7 +454,7 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present kycv3ViewModel.getPictureLabelForAnotherIDLiveData().observe(getViewLifecycleOwner(), label -> { if (label.length() == 0) { - anotherIdPictureLabel.setText("Another ID(Optional)"); + anotherIdPictureLabel.setText(getString(R.string.another_id_information_text)); iv_alternate_id.setImageResource(R.drawable.ic_another_id_picture); } else anotherIdPictureLabel.setText(label); @@ -506,10 +506,8 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present kycv3ViewModel.getAlternateImageRequiredLiveData().observe(getViewLifecycleOwner(), action -> { if (action) { - Log.d("ALTERNATEIMAGE", String.valueOf(action)); alternateIDImageViewContainer.setVisibility(View.VISIBLE); } else { - Log.d("ALTERNATEIMAGE", String.valueOf(action)); alternateIDImageViewContainer.setVisibility(View.GONE); } @@ -518,6 +516,7 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present } + //Error data binding with corresponding view elements in the form. private void subscribeToCustomerRelatedDataError(KYCV3ViewModel kycv3ViewModel) { kycv3ViewModel.getCustomerDetailRelatedFormErrorLiveData().getFullNameErrorLiveData().observe(getViewLifecycleOwner(), error -> fullNameWrapper.setError(error)); kycv3ViewModel.getCustomerDetailRelatedFormErrorLiveData().getGenderErrorLiveData().observe(getViewLifecycleOwner(), error -> genderListWrapper.setError(error)); @@ -555,7 +554,9 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present RxUtils.getAddressFromGPS(getActivity()) .doOnSubscribe(sub -> showProgressBar(true, "")) .subscribeOn(Schedulers.io()) - .map(address-> address.replaceAll("(?i)seoul", "")) + .map(address->address.replaceAll("-"," ")) + .map(address->address.replaceAll("[^a-zA-Z ]","")) + .map(address-> address.replaceAll("(?i)seoul", "").trim()) .observeOn(AndroidSchedulers.mainThread()) .doFinally(() -> showProgressBar(false, "")) .subscribe(new Observer() { @@ -566,6 +567,7 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present @Override public void onNext(String s) { + Log.d("RXGPSAddress","Final Address: "+s); if (s != null && s.length() > 0) ed_address.setText(s); else @@ -609,46 +611,22 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present @Override public void onStart() { super.onStart(); - setImeActionOnEdittexts(true); - rootView.setOnTouchListener((view, motionevent) -> { - hideKeyBoard(); - return true; - }); +// +// rootView.setOnTouchListener((view, motionevent) -> { +// hideKeyBoard(); +// return true; +// }); } @Override public void onStop() { super.onStop(); - setImeActionOnEdittexts(false); - rootView.setOnTouchListener(null); - } - public void setImeActionOnEdittexts(boolean action) { -// if(action) -// { -// ed_anotherId.setOnEditorActionListener((v, actionId, event) -> {new Handler().postDelayed(()-> promptDatePickerForIssueDate(ed_anotherId),250);return true;}); -// } -// else -// { -// ed_anotherId.setOnEditorActionListener(null); -// -// } +// rootView.setOnTouchListener(null); } - private boolean clearFocusableFields() { - boolean hasPassportFieldFocus = false; - boolean hasAlternateIDFieldFocus = false; - if (ed_passportId.hasFocus()) { - ed_passportId.clearFocus(); - hasPassportFieldFocus = true; - } - if (ed_anotherId.hasFocus()) { - ed_anotherId.clearFocus(); - hasAlternateIDFieldFocus = true; - } - return hasPassportFieldFocus || hasAlternateIDFieldFocus; - } + @OnClick(R.id.btn_submit3) public void onClick3() { @@ -888,7 +866,6 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present public void enablePassportNumberFocusChangeListener(boolean action) { if (action) { ed_passportId.setOnFocusChangeListener((v, hasFocus) -> { - Log.d("KYCProcessPassport", String.valueOf(hasFocus)); if (!hasFocus) { ViewModelProviders.of(getActivity()).get(KYCV3ViewModel.class).validatePassportNumberFromServer(); ed_passportId.setOnFocusChangeListener(null); @@ -905,7 +882,6 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present public void scrollToPassportNumberView() { scrollView.postDelayed(() -> { int scrollTo = ((View) passportIdWrapper.getParent().getParent()).getTop() + passportIdWrapper.getTop(); - ObjectAnimator.ofInt(scrollView, "scrollY", scrollTo).setDuration(750).start(); }, 300); diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/RxUtils.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/RxUtils.java index e645f16c..5039dcb2 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/RxUtils.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/RxUtils.java @@ -50,8 +50,7 @@ public class RxUtils { String address = ""; if (addresses.get(0).getAddressLine(0) != null) { - for(int i = 0; i <= addresses.get(0).getMaxAddressLineIndex(); i++) { - } + Log.d("RXGPSAddress","Unformatted address: "+addresses.get(0).toString()); address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex() address = address.replaceAll(",", ""); @@ -65,8 +64,8 @@ public class RxUtils { address = address.replace(addresses.get(0).getPostalCode(), ""); } } - return Observable.just(address.trim()); - }).timeout(6000, TimeUnit.MILLISECONDS).onErrorResumeNext(Observable.error(new Throwable(((Context) activity).getString(R.string.location_not_available)))); + return Observable.just(address); + }).timeout(10000, TimeUnit.MILLISECONDS).onErrorResumeNext(Observable.error(new Throwable(((Context) activity).getString(R.string.location_not_available)))); } else return Observable.error(new Throwable(((Context) activity).getString(R.string.gps_off_text))); diff --git a/app/src/main/res/layout/fragment_kyc_customer_detail.xml b/app/src/main/res/layout/fragment_kyc_customer_detail.xml index a2da7d0f..0fee4e59 100644 --- a/app/src/main/res/layout/fragment_kyc_customer_detail.xml +++ b/app/src/main/res/layout/fragment_kyc_customer_detail.xml @@ -224,12 +224,11 @@ + android:singleLine="true" />