package org.openlmis.core.view.holder;
import android.app.Activity;
import android.app.DialogFragment;
import android.text.Editable;
import android.text.Html;
import android.text.InputFilter;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.utils.SingleTextWatcher;
import org.openlmis.core.view.fragment.SimpleDialogFragment;
import org.openlmis.core.view.viewmodel.RequisitionFormItemViewModel;
import org.openlmis.core.view.widget.InputFilterMinMax;
import lombok.Getter;
import roboguice.inject.InjectView;
public class RequisitionFormViewHolder extends BaseViewHolder {
@InjectView(R.id.tx_FNM)
TextView productCode;
@InjectView(R.id.tx_product_name)
TextView productName;
@InjectView(R.id.tx_initial_amount)
TextView initAmount;
@InjectView(R.id.tx_received)
TextView received;
@InjectView(R.id.tx_issued)
TextView issued;
@InjectView(R.id.tx_theoretical)
TextView theoreticalInventory;
@InjectView(R.id.tx_total)
TextView total;
@InjectView(R.id.tx_inventory)
TextView inventory;
@InjectView(R.id.tx_different)
TextView different;
@InjectView(R.id.tx_total_request)
TextView totalRequest;
@InjectView(R.id.et_request_amount)
EditText requestAmount;
@InjectView(R.id.et_approved_amount)
EditText approvedAmount;
@InjectView(R.id.iv_adjustment_theoratical)
ImageView adjustTheoreticalIcon;
@Getter
boolean hasDataChanged;
public RequisitionFormViewHolder(View itemView) {
super(itemView);
requestAmount.setFilters(new InputFilter[]{new InputFilterMinMax(Integer.MAX_VALUE)});
approvedAmount.setFilters(new InputFilter[]{new InputFilterMinMax(Integer.MAX_VALUE)});
}
public void populate(RequisitionFormItemViewModel entry, RnRForm.STATUS status) {
productCode.setText(entry.getFmn());
productName.setText(entry.getProductName());
initAmount.setText(entry.getInitAmount());
received.setText(entry.getReceived());
issued.setText(entry.getIssued());
theoreticalInventory.setText(entry.getTheoretical());
total.setText(entry.getTotal());
inventory.setText(entry.getInventory());
different.setText(entry.getDifferent());
totalRequest.setText(entry.getAdjustedTotalRequest());
populateAdjustmentTheoreticalIcon(entry);
if (LMISApp.getInstance().getFeatureToggleFor(R.bool.feature_training)) {
fakePopulateRequestApprovedAmount(entry, status);
} else {
populateRequestApprovedAmount(entry, status);
}
}
private void populateAdjustmentTheoreticalIcon(final RequisitionFormItemViewModel itemViewModel) {
if (itemViewModel.getAdjustmentViewModels() == null || itemViewModel.getAdjustmentViewModels().size() == 0) {
adjustTheoreticalIcon.setVisibility(View.GONE);
} else {
adjustTheoreticalIcon.setVisibility(View.VISIBLE);
adjustTheoreticalIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment dialogFragment = SimpleDialogFragment.newInstance(null,
Html.fromHtml(itemViewModel.getFormattedKitAdjustmentMessage()),
context.getString(R.string.btn_ok));
dialogFragment.show(((Activity)context).getFragmentManager(), "adjustmentTheoreticalDialog");
}
});
}
}
private void populateRequestApprovedAmount(RequisitionFormItemViewModel entry, RnRForm.STATUS status) {
MyTextWatcher mySimpleTextWatcher = new MyTextWatcher(entry, status);
requestAmount.removeTextChangedListener(mySimpleTextWatcher);
approvedAmount.removeTextChangedListener(mySimpleTextWatcher);
requestAmount.setText(entry.getRequestAmount());
requestAmount.setError(null);
approvedAmount.setText(entry.getApprovedAmount());
if (status == RnRForm.STATUS.SUBMITTED) {
showDisabledAmount(requestAmount);
showEnabledAmount(approvedAmount);
approvedAmount.addTextChangedListener(mySimpleTextWatcher);
} else if (status == RnRForm.STATUS.DRAFT) {
showEnabledAmount(requestAmount);
showDisabledAmount(approvedAmount);
requestAmount.addTextChangedListener(mySimpleTextWatcher);
}
}
private void fakePopulateRequestApprovedAmount(RequisitionFormItemViewModel entry, RnRForm.STATUS status) {
if (status == RnRForm.STATUS.SUBMITTED_MISSED) {
status = RnRForm.STATUS.SUBMITTED;
} else if (status == RnRForm.STATUS.DRAFT_MISSED) {
status = RnRForm.STATUS.DRAFT;
}
MyTextWatcher mySimpleTextWatcher = new MyTextWatcher(entry, status);
requestAmount.removeTextChangedListener(mySimpleTextWatcher);
approvedAmount.removeTextChangedListener(mySimpleTextWatcher);
requestAmount.setText(entry.getRequestAmount());
requestAmount.setError(null);
approvedAmount.setText(entry.getApprovedAmount());
if (status == RnRForm.STATUS.SUBMITTED) {
showDisabledAmount(requestAmount);
showEnabledAmount(approvedAmount);
approvedAmount.addTextChangedListener(mySimpleTextWatcher);
} else if (status == RnRForm.STATUS.DRAFT) {
requestAmount.setEnabled(true);
showEnabledAmount(requestAmount);
showDisabledAmount(approvedAmount);
requestAmount.addTextChangedListener(mySimpleTextWatcher);
}
}
private void showDisabledAmount(View view) {
view.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
view.setEnabled(false);
}
private void showEnabledAmount(View view) {
view.setBackgroundColor(context.getResources().getColor(R.color.color_white));
view.setEnabled(true);
}
class MyTextWatcher extends SingleTextWatcher {
private final RequisitionFormItemViewModel entry;
private RnRForm.STATUS status;
public MyTextWatcher(RequisitionFormItemViewModel entry, RnRForm.STATUS status) {
this.entry = entry;
this.status = status;
}
@Override
public void afterTextChanged(Editable editable) {
hasDataChanged = true;
String value = editable.toString();
if (status == RnRForm.STATUS.SUBMITTED) {
entry.setApprovedAmount(value);
} else if (status == RnRForm.STATUS.DRAFT) {
approvedAmount.setText(value);
entry.setApprovedAmount(value);
entry.setRequestAmount(value);
}
}
}
}