/*
* This program is part of the OpenLMIS logistics management information
* system platform software.
*
* Copyright © 2015 ThoughtWorks, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. This program is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details. You should
* have received a copy of the GNU Affero General Public License along with
* this program. If not, see http://www.gnu.org/licenses. For additional
* information contact info@OpenLMIS.org
*/
package org.openlmis.core.view.widget;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewStub;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.model.Regimen;
import org.openlmis.core.model.RegimenItem;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.presenter.MMIARequisitionPresenter;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.view.activity.SelectRegimeProductsActivity;
import org.openlmis.core.view.fragment.MMIARequisitionFragment;
import org.openlmis.core.view.fragment.SimpleDialogFragment;
import java.util.ArrayList;
import java.util.List;
import rx.Subscriber;
public class MMIARegimeList extends LinearLayout {
private Context context;
private TextView totalView;
private List<RegimenItem> dataList;
private List<EditText> editTexts;
private LayoutInflater layoutInflater;
private ArrayList<RegimenItem> adults;
private ArrayList<RegimenItem> paediatrics;
protected MMIARequisitionPresenter presenter;
private MMIARegimeListener regimeListener;
public MMIARegimeList(Context context) {
super(context);
init(context);
}
public MMIARegimeList(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
this.context = context;
setOrientation(LinearLayout.VERTICAL);
layoutInflater = LayoutInflater.from(context);
}
public void initView(TextView totalView, MMIARequisitionPresenter presenter) {
this.presenter = presenter;
this.dataList = presenter.getRnRForm().getRegimenItemListWrapper();
this.editTexts = new ArrayList<>();
initCategoryList(dataList);
this.totalView = totalView;
addHeaderView();
for (int i = 0; i < adults.size(); i++) {
addItemView(adults.get(i), i);
}
if (isCustomEnable()) {
addAdultBtnView();
}
for (int i = 0; i < paediatrics.size(); i++) {
addItemView(paediatrics.get(i), adults.size() + i);
}
if (isCustomEnable()) {
addPaediatricsBtnView();
}
editTexts.get(editTexts.size() - 1).setImeOptions(EditorInfo.IME_ACTION_DONE);
totalView.setText(String.valueOf(getTotal()));
}
private boolean isCustomEnable() {
return !presenter.getRnRForm().isAuthorized();
}
private void addAdultBtnView() {
final TextView view = (TextView) layoutInflater.inflate(R.layout.item_add_custom_regime, this, false);
view.setText(R.string.label_add_adult_regime);
view.setBackgroundResource(R.color.color_green_light);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragment().startActivityForResult(SelectRegimeProductsActivity.getIntentToMe(view.getContext(), Regimen.RegimeType.Adults), MMIARequisitionFragment.REQUEST_FOR_CUSTOM_REGIME);
}
});
addView(view);
}
private void addPaediatricsBtnView() {
final TextView view = (TextView) layoutInflater.inflate(R.layout.item_add_custom_regime, this, false);
view.setText(R.string.label_add_child_regime);
view.setBackgroundResource(R.color.color_regime_baby);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragment().startActivityForResult(SelectRegimeProductsActivity.getIntentToMe(view.getContext(), Regimen.RegimeType.Paediatrics), MMIARequisitionFragment.REQUEST_FOR_CUSTOM_REGIME);
}
});
addView(view);
}
private Fragment getFragment() {
return ((Activity) getContext()).getFragmentManager().findFragmentById(R.id.fragment_requisition);
}
private void initCategoryList(List<RegimenItem> regimenItems) {
adults = new ArrayList<>();
paediatrics = new ArrayList<>();
for (RegimenItem item : regimenItems) {
if (item == null) {
continue;
}
if (Regimen.RegimeType.Paediatrics.equals(item.getRegimen().getType())) {
paediatrics.add(item);
} else {
adults.add(item);
}
}
}
public List<RegimenItem> getDataList() {
return dataList;
}
private void addHeaderView() {
addItemView(null, true, 0);
}
private void addItemView(final RegimenItem item, int position) {
addItemView(item, false, position);
}
private void addItemView(final RegimenItem item, boolean isHeaderView, final int position) {
View view = layoutInflater.inflate(R.layout.item_regime, this, false);
TextView tvName = (TextView) view.findViewById(R.id.tv_name);
EditText etTotal = (EditText) view.findViewById(R.id.et_total);
if (isHeaderView) {
tvName.setGravity(Gravity.CENTER);
etTotal.setEnabled(false);
view.setBackgroundResource(R.color.color_mmia_speed_list_header);
tvName.setText(R.string.label_regime_header_name);
etTotal.setText(getResources().getString(R.string.total).toUpperCase());
} else {
editTexts.add(etTotal);
Regimen regimen = item.getRegimen();
tvName.setText(regimen.getName());
if (item.getAmount() != null) {
etTotal.setText(String.valueOf(item.getAmount()));
}
setBackground(view, regimen);
etTotal.addTextChangedListener(new EditTextWatcher(item));
etTotal.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
if ((position + 1) < editTexts.size()) {
editTexts.get(position + 1).requestFocus();
return true;
}
}
return false;
}
});
setDelIconForCustomRegime(item, view);
}
addView(view);
}
private void setBackground(View view, Regimen regimen) {
if (Regimen.RegimeType.Paediatrics.equals(regimen.getType())) {
view.setBackgroundResource(R.color.color_regime_baby);
} else {
view.setBackgroundResource(R.color.color_green_light);
}
}
private void setDelIconForCustomRegime(final RegimenItem item, View view) {
if (item.getRegimen().isCustom() && isCustomEnable()) {
View ivDel = ((ViewStub) view.findViewById(R.id.vs_del)).inflate();
ivDel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDelConfirmDialog(item);
}
});
}
}
protected void showDelConfirmDialog(final RegimenItem item) {
SimpleDialogFragment dialogFragment = SimpleDialogFragment.newInstance(
LMISApp.getContext().getString(R.string.msg_regime_del_confirm));
dialogFragment.show(((Activity) getContext()).getFragmentManager(), "del_confirm_dialog");
dialogFragment.setCallBackListener(new SimpleDialogFragment.MsgDialogCallBack() {
@Override
public void positiveClick(String tag) {
if (regimeListener != null) {
regimeListener.loading();
}
presenter.deleteRegimeItem(item).subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
refreshRegimeView();
if (regimeListener != null) {
regimeListener.loaded();
}
}
@Override
public void onError(Throwable e) {
ToastUtil.show(e.getMessage());
if (regimeListener != null) {
regimeListener.loaded();
}
}
@Override
public void onNext(Void aVoid) {
}
});
}
@Override
public void negativeClick(String tag) {
}
});
}
public void highLightTotal() {
totalView.setBackground(getResources().getDrawable(R.drawable.border_bg_red));
}
public void deHighLightTotal() {
totalView.setBackground(getResources().getDrawable(R.color.color_page_gray));
}
public boolean hasEmptyField() {
for (RegimenItem item : dataList) {
if (null == item.getAmount()) {
return true;
}
}
return false;
}
public void refreshRegimeView() {
removeAllViews();
initView(totalView, presenter);
}
public void addCustomRegimenItem(Regimen regimen) {
if (presenter.isRegimeItemExists(regimen)) {
ToastUtil.show(R.string.msg_regime_already_exist);
return;
}
if (regimeListener != null) {
regimeListener.loading();
}
presenter.addCustomRegimenItem(regimen).subscribe(customRegimenItemSubscriber());
}
private Subscriber<Void> customRegimenItemSubscriber() {
return new Subscriber<Void>() {
@Override
public void onCompleted() {
refreshRegimeView();
if (regimeListener != null) {
regimeListener.loaded();
}
}
@Override
public void onError(Throwable e) {
ToastUtil.show(e.getMessage());
if (regimeListener != null) {
regimeListener.loaded();
}
}
@Override
public void onNext(Void data) {
}
};
}
class EditTextWatcher implements android.text.TextWatcher {
private final RegimenItem item;
public EditTextWatcher(RegimenItem item) {
this.item = item;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
try {
item.setAmount(Long.parseLong(editable.toString()));
} catch (NumberFormatException e) {
item.setAmount(null);
}
totalView.setText(String.valueOf(getTotal()));
}
}
public boolean isCompleted() {
for (EditText editText : editTexts) {
if (TextUtils.isEmpty(editText.getText().toString())) {
editText.setError(context.getString(R.string.hint_error_input));
editText.requestFocus();
return false;
}
}
return true;
}
public long getTotal() {
return RnRForm.calculateTotalRegimenAmount(dataList);
}
public interface MMIARegimeListener {
void loading();
void loaded();
}
public void setRegimeListener(MMIARegimeListener regimeListener) {
this.regimeListener = regimeListener;
}
}