package org.openlmis.core.view.widget; import android.app.DatePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.PorterDuff; import android.support.design.widget.TextInputLayout; import android.util.AttributeSet; import android.view.View; import android.widget.EditText; import android.widget.LinearLayout; import org.apache.commons.lang3.StringUtils; import org.openlmis.core.R; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.presenter.NewStockMovementPresenter; import org.openlmis.core.view.listener.MovementDateListener; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import roboguice.RoboGuice; import roboguice.inject.InjectView; public class MovementDetailsView extends LinearLayout { protected Context context; @InjectView(R.id.ly_requested_quantity) View lyRequestedQuantity; @InjectView(R.id.et_movement_date) EditText etMovementDate; @InjectView(R.id.ly_movement_date) TextInputLayout lyMovementDate; @InjectView(R.id.et_document_number) EditText etDocumentNumber; @InjectView(R.id.et_movement_reason) EditText etMovementReason; @InjectView(R.id.ly_movement_reason) TextInputLayout lyMovementReason; @InjectView(R.id.et_requested_quantity) EditText etRequestedQuantity; @InjectView(R.id.et_movement_quantity) EditText etMovementQuantity; @InjectView(R.id.ly_movement_quantity) TextInputLayout lyMovementQuantity; @InjectView(R.id.et_movement_signature) EditText etMovementSignature; @InjectView(R.id.ly_movement_signature) TextInputLayout lyMovementSignature; private NewStockMovementPresenter presenter; public MovementDetailsView(Context context) { super(context); } public MovementDetailsView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { this.context = context; inflate(context, R.layout.view_movement_details, this); RoboGuice.injectMembers(getContext(), this); RoboGuice.getInjector(getContext()).injectViewMembers(this); } public void initMovementDetailsView(NewStockMovementPresenter presenter) { this.presenter = presenter; initView(); } private void initView() { if (presenter.getMovementType().equals(MovementReasonManager.MovementType.ISSUE)) { lyRequestedQuantity.setVisibility(View.VISIBLE); } if (MovementReasonManager.MovementType.RECEIVE.equals(presenter.getMovementType()) || MovementReasonManager.MovementType.POSITIVE_ADJUST.equals(presenter.getMovementType())) { lyMovementReason.setHint(getResources().getString(R.string.hint_movement_reason_receive)); } else { lyMovementReason.setHint(getResources().getString(R.string.hint_movement_reason_negative)); } setMovementDateClickListener(); setSignatureListener(); } private void setSignatureListener() { etMovementSignature.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (StringUtils.isEmpty(etMovementSignature.getText())) { showSignatureError(getContext().getString(R.string.msg_empty_signature)); } else if (etMovementSignature.getText().length() < 2) { showSignatureError(getContext().getString(R.string.hint_signature_error_message)); } else { lyMovementSignature.setErrorEnabled(false); } } } }); } public void setMovementDateClickListener() { etMovementDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { etMovementDate.setEnabled(false); showDatePickerDialog(); } }); etMovementDate.setKeyListener(null); } public void setMovementReasonClickListener(OnClickListener movementReasonClickListener) { etMovementReason.setOnClickListener(movementReasonClickListener); etMovementReason.setKeyListener(null); } private void showDatePickerDialog() { final Calendar today = GregorianCalendar.getInstance(); DatePickerDialog dialog = new DatePickerDialog(getContext(), DatePickerDialog.BUTTON_NEUTRAL, new MovementDateListener(presenter.getViewModel(), presenter.getLastMovementDate(), etMovementDate), today.get(Calendar.YEAR), today.get(Calendar.MONTH), today.get(Calendar.DAY_OF_MONTH)); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { etMovementDate.setEnabled(true); } }); dialog.show(); } public void setMovementQuantityVisibility(int movementQuantityVisibility) { lyMovementQuantity.setVisibility(movementQuantityVisibility); } public void setMovementModelValue() { presenter.getViewModel().setMovementDate(etMovementDate.getText().toString()); presenter.getViewModel().setDocumentNo(etDocumentNumber.getText().toString()); presenter.getViewModel().setRequested(etRequestedQuantity.getText().toString()); HashMap<MovementReasonManager.MovementType, String> quantityMap = new HashMap<>(); quantityMap.put(presenter.getMovementType(), etMovementQuantity.getText().toString()); presenter.getViewModel().setTypeQuantityMap(quantityMap); presenter.getViewModel().setSignature(etMovementSignature.getText().toString()); } public void clearTextInputLayoutError() { lyMovementDate.setErrorEnabled(false); lyMovementReason.setErrorEnabled(false); lyMovementQuantity.setErrorEnabled(false); lyMovementSignature.setErrorEnabled(false); } public void showMovementDateEmptyError() { lyMovementDate.setError(getResources().getString(R.string.msg_empty_movement_date)); etMovementDate.getBackground().setColorFilter(getResources().getColor(R.color.color_red), PorterDuff.Mode.SRC_ATOP); requestFocus(etMovementDate); } public void showMovementReasonEmptyError() { lyMovementReason.setError(getResources().getString(R.string.msg_empty_movement_reason)); etMovementReason.getBackground().setColorFilter(getResources().getColor(R.color.color_red), PorterDuff.Mode.SRC_ATOP); requestFocus(etMovementReason); } public void requestFocus(final View view) { view.post(new Runnable() { @Override public void run() { view.getParent().requestChildFocus(view, view); } }); } public void showMovementQuantityError(String errorMsg) { lyMovementQuantity.setError(errorMsg); etMovementQuantity.getBackground().setColorFilter(getResources().getColor(R.color.color_red), PorterDuff.Mode.SRC_ATOP); requestFocus(lyMovementQuantity); } public void showSignatureError(String errorMsg) { lyMovementSignature.setError(errorMsg); etMovementSignature.getBackground().setColorFilter(getResources().getColor(R.color.color_red), PorterDuff.Mode.SRC_ATOP); } public void setMovementReasonText(String movementReasonText) { etMovementReason.setText(movementReasonText); } public boolean validate() { clearTextInputLayoutError(); boolean isValid = validateSignature(); isValid = validateQuantity() && isValid; isValid = validateMovementReason() && isValid; isValid = validateMovementDate() && isValid; return isValid; } private boolean validateQuantity() { if (!presenter.isKit()) { return true; } if (StringUtils.isEmpty(etMovementQuantity.getText().toString())) { showMovementQuantityError(getContext().getString(R.string.msg_empty_quantity)); return false; } if (Long.parseLong(etMovementQuantity.getText().toString()) <= 0) { showMovementQuantityError(getContext().getString(R.string.msg_entries_error)); return false; } if (!presenter.validateKitQuantity()) { showMovementQuantityError(getContext().getString(R.string.msg_invalid_quantity)); return false; } return true; } private boolean validateMovementDate() { if (StringUtils.isEmpty(etMovementDate.getText().toString())) { showMovementDateEmptyError(); return false; } return true; } private boolean validateMovementReason() { if (!presenter.getViewModel().validateMovementReason()) { showMovementReasonEmptyError(); return false; } return true; } public boolean validateSignature() { if (StringUtils.isBlank(etMovementSignature.getText())) { showSignatureError(getContext().getString(R.string.msg_empty_signature)); requestFocus(lyMovementSignature); return false; } else if (!presenter.getViewModel().validateSignature()) { showSignatureError(getContext().getString(R.string.hint_signature_error_message)); requestFocus(lyMovementSignature); return false; } return true; } }