package com.fastaccess.ui.modules.repos.extras.labels; import android.content.Context; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import com.fastaccess.R; import com.fastaccess.data.dao.LabelListModel; import com.fastaccess.data.dao.LabelModel; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; import com.fastaccess.ui.adapter.LabelsAdapter; import com.fastaccess.ui.base.BaseDialogFragment; import com.fastaccess.ui.modules.repos.extras.labels.create.CreateLabelDialogFragment; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.StateLayout; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.OnClick; import icepick.State; /** * Created by Kosh on 22 Feb 2017, 7:23 PM */ public class LabelsDialogFragment extends BaseDialogFragment<LabelsMvp.View, LabelsPresenter> implements LabelsMvp.View { @BindView(R.id.title) FontTextView title; @BindView(R.id.recycler) DynamicRecyclerView recycler; @BindView(R.id.add) View add; @BindView(R.id.stateLayout) StateLayout stateLayout; @State HashMap<Integer, LabelModel> selectionMap; private LabelsAdapter adapter; private LabelsMvp.SelectedLabelsListener callback; public static LabelsDialogFragment newInstance(@NonNull List<LabelModel> models, @Nullable LabelListModel selectedLabels, @NonNull String repo, @NonNull String login) { LabelsDialogFragment fragment = new LabelsDialogFragment(); fragment.setArguments(Bundler.start() .putParcelableArrayList(BundleConstant.ITEM, (ArrayList<? extends Parcelable>) models) .putParcelableArrayList(BundleConstant.EXTRA, selectedLabels) .put(BundleConstant.EXTRA_TWO, repo) .put(BundleConstant.EXTRA_THREE, login) .end()); return fragment; } @OnClick(R.id.add) void onAddLabel() { String repo = getArguments().getString(BundleConstant.EXTRA_TWO); String login = getArguments().getString(BundleConstant.EXTRA_THREE); if (!InputHelper.isEmpty(repo) && !InputHelper.isEmpty(login)) { CreateLabelDialogFragment.newInstance(login, repo).show(getChildFragmentManager(), "CreateLabelDialogFragment"); } } @Override public void onAttach(Context context) { super.onAttach(context); if (getParentFragment() instanceof LabelsMvp.SelectedLabelsListener) { callback = (LabelsMvp.SelectedLabelsListener) getParentFragment(); } else if (context instanceof LabelsMvp.SelectedLabelsListener) { callback = (LabelsMvp.SelectedLabelsListener) context; } else { throw new IllegalArgumentException("Parent Fragment or Activity must implement LabelsMvp.SelectedLabelsListener"); } } @Override public void onDetach() { super.onDetach(); callback = null; } @Override protected int fragmentLayout() { return R.layout.simple_footer_list_dialog; } @Override protected void onFragmentCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { stateLayout.setEmptyText(R.string.no_labels); recycler.setEmptyView(stateLayout); recycler.addKeyLineDivider(); title.setText(R.string.labels); add.setVisibility(View.VISIBLE); List<LabelModel> list = getArguments().getParcelableArrayList(BundleConstant.ITEM); List<LabelModel> selectedLabels = getArguments().getParcelableArrayList(BundleConstant.EXTRA); if (list != null) { adapter = new LabelsAdapter(list, this); recycler.setAdapter(adapter); if (savedInstanceState == null) { if (selectedLabels != null && !selectedLabels.isEmpty()) { Stream.of(selectedLabels) .map(list::indexOf) .filter(value -> value != -1) .forEach(integer -> onToggleSelection(integer, true)); } } } } @NonNull @Override public LabelsPresenter providePresenter() { return new LabelsPresenter(); } @Override public boolean isLabelSelected(int position) { return getSelectionMap().get(position) != null; } @Override public void onToggleSelection(int position, boolean select) { if (select) { getSelectionMap().put(position, adapter.getItem(position)); } else { getSelectionMap().remove(position); } adapter.notifyDataSetChanged(); } @Override public void onLabelAdded(@NonNull LabelModel labelModel) { adapter.addItem(labelModel, 0); recycler.scrollToPosition(0); } @OnClick({R.id.cancel, R.id.ok}) public void onClick(View view) { switch (view.getId()) { case R.id.cancel: dismiss(); break; case R.id.ok: ArrayList<LabelModel> labels = Stream.of(selectionMap) .filter(value -> value.getValue() != null) .map(Map.Entry::getValue) .collect(Collectors.toCollection(ArrayList::new)); if (labels != null && !labels.isEmpty()) { callback.onSelectedLabels(labels); } dismiss(); break; } } public HashMap<Integer, LabelModel> getSelectionMap() { if (selectionMap == null) { selectionMap = new LinkedHashMap<>(); } return selectionMap; } }