package org.openlmis.core.view.holder; import android.text.Html; import android.text.Spanned; import android.view.MenuItem; import android.view.View; import android.view.ViewStub; import android.widget.PopupMenu; import android.widget.TextView; import org.openlmis.core.LMISApp; import org.openlmis.core.R; import org.openlmis.core.model.RnRForm; import org.openlmis.core.network.SyncErrorsMap; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.view.viewmodel.RnRFormViewModel; import org.openlmis.core.view.widget.SingleClickButtonListener; import roboguice.inject.InjectView; public class RnRFormViewHolder extends BaseViewHolder { private final RnRFormItemClickListener itemClickListener; @InjectView(R.id.tv_period) TextView tvPeriod; @InjectView(R.id.tv_report_status) TextView tvMessage; @InjectView(R.id.tv_drug_count) ViewStub vsDrugCount; TextView tvDrugCount; @InjectView(R.id.btn_report_entry) TextView btnView; @InjectView(R.id.iv_del) View ivDelete; public RnRFormViewHolder(View inflate, RnRFormItemClickListener itemClickListener) { super(inflate); this.itemClickListener = itemClickListener; } public void populate(final RnRFormViewModel model) { switch (model.getType()) { case RnRFormViewModel.TYPE_MISSED_PERIOD: configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_previous_period_missing)), R.drawable.ic_description, R.color.color_draft_title); break; case RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD: configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_missed_period)), R.drawable.ic_description, R.color.color_draft_title); setupButton(model, context.getString(R.string.btn_select_close_period)); setupButtonColor(); break; case RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY: showCannotDoMonthlyInventory(model); break; case RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD: if (isOfMmia(model)) { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_uncompleted_mmia_physical_inventory_message)), R.drawable.ic_description, R.color.color_draft_title); } else { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_uncompleted_physical_inventory_message, model.getName())), R.drawable.ic_description, R.color.color_draft_title); } setupButton(model, context.getString(R.string.btn_view_uncompleted_physical_inventory)); break; case RnRFormViewModel.TYPE_INVENTORY_DONE: case RnRFormViewModel.TYPE_CLOSE_OF_PERIOD_SELECTED: populateRnrFormNotBeCreatedView(model); break; case RnRFormViewModel.TYPE_CREATED_BUT_UNCOMPLETED: configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_incomplete_requisition, model.getName())), R.drawable.ic_description, R.color.color_draft_title); setupButton(model, context.getString(R.string.btn_view_incomplete_requisition, model.getName())); break; case RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL: populateRnrFormUnsyncedMessage(model); break; case RnRFormViewModel.TYPE_SYNCED_HISTORICAL: populateSyncedHistorical(model); break; } } private void showCannotDoMonthlyInventory(RnRFormViewModel model) { boolean isTraining = LMISApp.getInstance().getFeatureToggleFor(R.bool.feature_training); if (isOfMmia(model)) { if (isTraining) { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_training_can_not_create_mmia_rnr)), R.drawable.ic_description, R.color.color_draft_title); } else { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_can_not_create_mmia_rnr, DateUtil.getMonthAbbrByDate(model.getPeriodEndMonth().toDate()))), R.drawable.ic_description, R.color.color_draft_title); } } else { if (isTraining) { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_training_can_not_create_via_rnr)), R.drawable.ic_description, R.color.color_draft_title); } else { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_can_not_create_via_rnr, DateUtil.getMonthAbbrByDate(model.getPeriodEndMonth().toDate()))), R.drawable.ic_description, R.color.color_draft_title); } } } private void populateRnrFormNotBeCreatedView(RnRFormViewModel model) { if (isOfMmia(model)) { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_completed_mmia_physical_inventory_message)), R.drawable.ic_description, R.color.color_draft_title); } else { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_completed_physical_inventory_message, model.getName())), R.drawable.ic_description, R.color.color_draft_title); } setupButton(model, context.getString(R.string.btn_view_completed_physical_inventory, model.getName())); setupButtonColor(); } private void populateRnrFormUnsyncedMessage(RnRFormViewModel model) { String error; if (isOfMmia(model)) { error = context.getString(R.string.label_unsynced_mmia_requisition); } else { error = context.getString(R.string.label_unsynced_requisition, model.getName()); } if (model.getSyncServerErrorMessage() != null) { error = SyncErrorsMap.getDisplayErrorMessageBySyncErrorMessage(model.getSyncServerErrorMessage()); } configHolder(model.getTitle(), Html.fromHtml(error), R.drawable.ic_error, R.color.color_red); } private boolean isOfMmia(RnRFormViewModel model) { return model.getProgramCode().equals(Constants.MMIA_PROGRAM_CODE); } private void populateSyncedHistorical(RnRFormViewModel model) { RnRForm form = model.getForm(); if (isOfMmia(model)) { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_mmia_submitted_message, model.getSyncedTime())), R.drawable.ic_done_green, R.color.color_white); } else { configHolder(model.getTitle(), Html.fromHtml(context.getString(R.string.label_submitted_message, model.getName(), model.getSyncedTime())), R.drawable.ic_done_green, R.color.color_white); } showDeleteMenu(form); setupButton(model, context.getString(R.string.btn_view_requisition, model.getName())); if (form.isEmergency()) { showDrugCount(form.getRnrFormItemList().size()); } else { hideDrugCount(); } } private void hideDrugCount() { if (tvDrugCount != null) { tvDrugCount.setVisibility(View.GONE); } } private void showDrugCount(int size) { if (tvDrugCount != null) { tvDrugCount.setVisibility(View.VISIBLE); } else { tvDrugCount = (TextView) vsDrugCount.inflate(); } tvDrugCount.setText(Html.fromHtml(LMISApp.getContext().getResources().getQuantityString(R.plurals.label_drug_count_message, size, size))); } private void setupButtonColor() { btnView.setBackground(context.getResources().getDrawable(R.drawable.blue_button)); btnView.setTextColor(context.getResources().getColor(R.color.color_white)); } private void setupButton(RnRFormViewModel model, String buttonText) { btnView.setText(buttonText); btnView.setOnClickListener(new BtnViewClickListener(model)); btnView.setEnabled(true); } private void configHolder(String period, Spanned text, int icDescription, int colorDraftTitle) { tvPeriod.setText(period); tvPeriod.setCompoundDrawablesWithIntrinsicBounds(icDescription, 0, 0, 0); tvPeriod.setBackgroundResource(colorDraftTitle); tvMessage.setText(text); if (ivDelete != null) { ivDelete.setVisibility(View.GONE); } } private void showDeleteMenu(final RnRForm form) { ivDelete.setVisibility(View.VISIBLE); if (itemClickListener != null) { ivDelete.setOnClickListener(new SingleClickButtonListener() { @Override public void onSingleClick(View v) { PopupMenu popup = new PopupMenu(v.getContext(), v); popup.inflate(R.menu.menu_rnr_list_item); popup.show(); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { itemClickListener.deleteForm(form); return false; } }); } }); } } public interface RnRFormItemClickListener { void deleteForm(RnRForm form); void clickBtnView(RnRFormViewModel model, View view); } private class BtnViewClickListener extends SingleClickButtonListener { private final RnRFormViewModel model; public BtnViewClickListener(final RnRFormViewModel model) { setMinClickInterval(1000); this.model = model; } @Override public void onSingleClick(View v) { if (itemClickListener != null) { btnView.setEnabled(false); itemClickListener.clickBtnView(model, v); } } } }