package org.openlmis.core.view.holder;
import android.text.Editable;
import android.text.InputFilter;
import android.view.View;
import android.widget.EditText;
import org.openlmis.core.R;
import org.openlmis.core.utils.SingleTextWatcher;
import org.openlmis.core.view.viewmodel.RapidTestFormGridViewModel;
import roboguice.inject.InjectView;
public class RapidTestReportGridViewHolder extends BaseViewHolder {
public static final int MAX_INPUT_LENGTH = 9;
public static final int MAX_TOTAL_LENGTH = 11;
@InjectView(R.id.et_consume_rapid_test_report_grid)
EditText etConsume;
@InjectView(R.id.et_positive_rapid_test_report_grid)
EditText etPositive;
RapidTestFormGridViewModel viewModel;
private Boolean editable;
private QuantityChangeListener quantityChangeListener;
public RapidTestReportGridViewHolder(View itemView) {
super(itemView);
}
public void populate(RapidTestFormGridViewModel viewModel, Boolean editable, QuantityChangeListener quantityChangeListener) {
this.viewModel = viewModel;
this.editable = editable;
this.quantityChangeListener = quantityChangeListener;
populateData(viewModel);
setEditable(editable);
updateEditTextMaxLength();
setTextWatcher();
updateAlert();
}
private void updateEditTextMaxLength() {
if (isInTotalRow()) {
etConsume.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_TOTAL_LENGTH)});
etPositive.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_TOTAL_LENGTH)});
} else {
etConsume.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_INPUT_LENGTH)});
etPositive.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_INPUT_LENGTH)});
}
}
public void setEditable(Boolean editable) {
etConsume.setFocusableInTouchMode(editable);
etPositive.setFocusableInTouchMode(editable);
}
public void populateData(RapidTestFormGridViewModel viewModel) {
etConsume.setText(viewModel.getConsumptionValue());
etPositive.setText(viewModel.getPositiveValue());
}
private void setTextWatcher() {
TextWatcher textWatcherConsume = new TextWatcher(etConsume);
TextWatcher textWatcherPositive = new TextWatcher(etPositive);
etPositive.removeTextChangedListener(textWatcherPositive);
etConsume.removeTextChangedListener(textWatcherConsume);
if (editable) {
etConsume.addTextChangedListener(textWatcherConsume);
etPositive.addTextChangedListener(textWatcherPositive);
}
}
private void updateAlert() {
if (editable && !viewModel.validate()) {
etPositive.setTextColor(context.getResources().getColor(R.color.color_red));
etConsume.setTextColor(context.getResources().getColor(R.color.color_red));
} else {
etPositive.setTextColor(context.getResources().getColor(R.color.color_black));
etConsume.setTextColor(context.getResources().getColor(R.color.color_black));
}
}
class TextWatcher extends SingleTextWatcher {
private final EditText editText;
public TextWatcher(EditText editText) {
this.editText = editText;
}
@Override
public void afterTextChanged(Editable s) {
boolean isConsume = editText.getId() == R.id.et_consume_rapid_test_report_grid;
viewModel.setValue(isConsume, s.toString());
updateTotal(isConsume);
updateAlert();
}
}
public void updateTotal(boolean isConsume) {
if (!isInTotalRow()) {
quantityChangeListener.updateTotal(viewModel.getColumnCode(), isConsume);
}
}
public boolean isInTotalRow() {
return quantityChangeListener == null;
}
public interface QuantityChangeListener {
void updateTotal(RapidTestFormGridViewModel.ColumnCode columnCode, boolean isConsume);
}
}