package org.openlmis.core.view.fragment; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.joda.time.DateTime; import org.openlmis.core.R; import org.openlmis.core.presenter.BaseReportPresenter; import org.openlmis.core.presenter.RapidTestReportFormPresenter; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.ToastUtil; import org.openlmis.core.view.adapter.RapidTestReportRowAdapter; import org.openlmis.core.view.holder.RapidTestReportGridViewHolder; import org.openlmis.core.view.viewmodel.RapidTestFormGridViewModel; import org.openlmis.core.view.viewmodel.RapidTestReportViewModel; import org.openlmis.core.view.widget.SingleClickButtonListener; import roboguice.RoboGuice; import roboguice.inject.InjectView; import rx.Subscription; import rx.functions.Action1; public class RapidTestReportFormFragment extends BaseReportFragment { @InjectView(R.id.rv_rapid_report_row_item_list) RecyclerView rvReportRowItemListView; @InjectView(R.id.vg_rapid_test_report_empty_header) ViewGroup emptyHeaderView; RapidTestReportFormPresenter presenter; RapidTestReportRowAdapter adapter; public static int ROW_HEADER_WIDTH = -1; public static int GRID_SIZE = -1; @Override protected BaseReportPresenter injectPresenter() { presenter = RoboGuice.getInjector(getActivity()).getInstance(RapidTestReportFormPresenter.class); return presenter; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); loading(); long formId = getActivity().getIntent().getLongExtra(Constants.PARAM_FORM_ID, 0L); DateTime periodBegin = (DateTime) getActivity().getIntent().getSerializableExtra(Constants.PARAM_PERIOD_BEGIN); updateHeaderSize(); setUpRowItems(); if (isSavedInstanceState && presenter.getViewModel() != null) { updateUI(); } else { loadForm(formId, periodBegin); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_rapid_test_report_form, container, false); } private void updateHeaderSize() { calculateRowHeaderAndGridSize(); emptyHeaderView.getLayoutParams().width = ROW_HEADER_WIDTH; } private void calculateRowHeaderAndGridSize() { DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); int totalWidthWithoutBorders = metrics.widthPixels - 2; GRID_SIZE = totalWidthWithoutBorders / 5; ROW_HEADER_WIDTH = GRID_SIZE + totalWidthWithoutBorders % 5; } private void loadForm(long formId, DateTime periodBegin) { loading(); Subscription subscription = presenter.loadViewModel(formId, periodBegin).subscribe(getOnViewModelLoadedAction()); subscriptions.add(subscription); } private void setUpRowItems() { adapter = new RapidTestReportRowAdapter(getQuantityChangeListener()); rvReportRowItemListView.setLayoutManager(new LinearLayoutManager(getActivity())); rvReportRowItemListView.setAdapter(adapter); } private RapidTestReportGridViewHolder.QuantityChangeListener getQuantityChangeListener() { return new RapidTestReportGridViewHolder.QuantityChangeListener() { @Override public void updateTotal(RapidTestFormGridViewModel.ColumnCode columnCode, boolean isConsume) { presenter.getViewModel().updateTotal(columnCode, isConsume); adapter.updateTotal(); } }; } private void updateActionPanel() { actionPanelView.setVisibility(presenter.getViewModel().getStatus().isEditable() ? View.VISIBLE : View.GONE); updateButtonName(); actionPanelView.setListener(getOnCompleteClickListener(), getOnSaveClickListener()); } @NonNull private SingleClickButtonListener getOnSaveClickListener() { return new SingleClickButtonListener() { @Override public void onSingleClick(View v) { onSaveForm(); } }; } @NonNull private SingleClickButtonListener getOnCompleteClickListener() { return new SingleClickButtonListener() { @Override public void onSingleClick(View v) { if (presenter.getViewModel().isFormEmpty()) { ToastUtil.show(getString(R.string.error_empty_rapid_test)); } else if (!presenter.getViewModel().validate()) { ToastUtil.show(getString(R.string.error_positive_larger_than_consumption)); } else { showSignDialog(); } } }; } public void onSaveForm() { loading(); Subscription subscription = presenter.onAuthoriseDraftForm().subscribe(getOnSavedAction()); subscriptions.add(subscription); } public void onSubmitForm() { loading(); Subscription subscription = presenter.onSaveDraftForm().subscribe(getOnSubmittedAction()); subscriptions.add(subscription); } private Action1<? super RapidTestReportViewModel> getOnSubmittedAction() { return new Action1<RapidTestReportViewModel>() { @Override public void call(RapidTestReportViewModel viewModel) { showMessageNotifyDialog(); updateUIAfterSubmit(); loaded(); } }; } private void updateButtonName() { actionPanelView.setPositiveButtonText(presenter.getViewModel().isDraft() ? getResources().getString(R.string.btn_submit) : getResources().getString(R.string.btn_complete)); } @Override protected String getSignatureDialogTitle() { return presenter.getViewModel().isDraft() ? getResources().getString(R.string.msg_rapid_test_submit_signature) : getResources().getString(R.string.msg_approve_signature_rapid_test); } protected Action1<? super Void> getOnSignedAction() { return new Action1<Void>() { @Override public void call(Void aVoid) { if (presenter.getViewModel().isAuthorized()) { onSaveForm(); } else { onSubmitForm(); } } }; } public void updateUIAfterSubmit() { adapter.setEditable(false); adapter.notifyDataSetChanged(); updateButtonName(); } @Override protected String getNotifyDialogMsg() { return getString(R.string.msg_requisition_signature_message_notify_rapid_test); } private Action1<? super RapidTestReportViewModel> getOnSavedAction() { return new Action1<RapidTestReportViewModel>() { @Override public void call(RapidTestReportViewModel viewModel) { loaded(); finish(); } }; } @NonNull private Action1<RapidTestReportViewModel> getOnViewModelLoadedAction() { return new Action1<RapidTestReportViewModel>() { @Override public void call(RapidTestReportViewModel viewModel) { updateUI(); if (presenter.isSubmitted()) { showMessageNotifyDialog(); } } }; } public void updateUI() { populateFormData(presenter.getViewModel()); updateActionPanel(); loaded(); } private void populateFormData(RapidTestReportViewModel viewModel) { adapter.refresh(viewModel.getItemViewModelList(), viewModel.isEditable()); } }