/****************************************************************************************
* Copyright (c) 2015 Timothy Rae <perceptualchaos2@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
package com.ichi2.anki.dialogs;
import android.app.Dialog;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.View;
import com.afollestad.materialdialogs.MaterialDialog;
import com.ichi2.anki.AnkiActivity;
import com.ichi2.anki.CollectionHelper;
import com.ichi2.anki.DeckPicker;
import com.ichi2.anki.R;
import com.ichi2.anki.StudyOptionsFragment;
import com.ichi2.libanki.Collection;
import java.util.ArrayList;
import java.util.HashMap;
import timber.log.Timber;
public class DeckPickerContextMenu extends DialogFragment {
/**
* Context Menus
*/
private static final int CONTEXT_MENU_RENAME_DECK = 0;
private static final int CONTEXT_MENU_DECK_OPTIONS = 1;
private static final int CONTEXT_MENU_CUSTOM_STUDY = 2;
private static final int CONTEXT_MENU_DELETE_DECK = 3;
private static final int CONTEXT_MENU_EXPORT_DECK = 4;
private static final int CONTEXT_MENU_UNBURY = 5;
private static final int CONTEXT_MENU_CUSTOM_STUDY_REBUILD = 6;
private static final int CONTEXT_MENU_CUSTOM_STUDY_EMPTY = 7;
public static DeckPickerContextMenu newInstance(long did) {
DeckPickerContextMenu f = new DeckPickerContextMenu();
Bundle args = new Bundle();
args.putLong("did", did);
f.setArguments(args);
return f;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long did = getArguments().getLong("did");
String title = CollectionHelper.getInstance().getCol(getContext()).getDecks().name(did);
int[] itemIds = getListIds();
return new MaterialDialog.Builder(getActivity())
.title(title)
.cancelable(true)
.autoDismiss(false)
.itemsIds(itemIds)
.items(ContextMenuHelper.getValuesFromKeys(getKeyValueMap(), itemIds))
.itemsCallback(mContextMenuListener)
.build();
}
private HashMap<Integer, String> getKeyValueMap() {
Resources res = getResources();
HashMap<Integer, String> keyValueMap = new HashMap<>();
keyValueMap.put(CONTEXT_MENU_RENAME_DECK, res.getString(R.string.rename_deck));
keyValueMap.put(CONTEXT_MENU_DECK_OPTIONS, res.getString(R.string.study_options));
keyValueMap.put(CONTEXT_MENU_CUSTOM_STUDY, res.getString(R.string.custom_study));
keyValueMap.put(CONTEXT_MENU_DELETE_DECK, res.getString(R.string.contextmenu_deckpicker_delete_deck));
keyValueMap.put(CONTEXT_MENU_EXPORT_DECK, res.getString(R.string.export_deck));
keyValueMap.put(CONTEXT_MENU_UNBURY, res.getString(R.string.unbury));
keyValueMap.put(CONTEXT_MENU_CUSTOM_STUDY_REBUILD, res.getString(R.string.rebuild_cram_label));
keyValueMap.put(CONTEXT_MENU_CUSTOM_STUDY_EMPTY, res.getString(R.string.empty_cram_label));
return keyValueMap;
}
/**
* Retrieve the list of ids to put in the context menu list
* @return the ids of which values to show
*/
private int[] getListIds() {
Collection col = CollectionHelper.getInstance().getCol(getContext());
long did = getArguments().getLong("did");
ArrayList<Integer> itemIds = new ArrayList<>();
if (col.getDecks().isDyn(did)) {
itemIds.add(CONTEXT_MENU_CUSTOM_STUDY_REBUILD);
itemIds.add(CONTEXT_MENU_CUSTOM_STUDY_EMPTY);
}
itemIds.add(CONTEXT_MENU_RENAME_DECK);
itemIds.add(CONTEXT_MENU_DECK_OPTIONS);
if (!col.getDecks().isDyn(did)) {
itemIds.add(CONTEXT_MENU_CUSTOM_STUDY);
}
itemIds.add(CONTEXT_MENU_DELETE_DECK);
itemIds.add(CONTEXT_MENU_EXPORT_DECK);
if (col.getSched().haveBuried(did)) {
itemIds.add(CONTEXT_MENU_UNBURY);
}
return ContextMenuHelper.integerListToArray(itemIds);
}
// Handle item selection on context menu which is shown when the user long-clicks on a deck
private MaterialDialog.ListCallback mContextMenuListener = new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog materialDialog, View view, int item,
CharSequence charSequence) {
switch (view.getId()) {
case CONTEXT_MENU_DELETE_DECK:
Timber.i("Delete deck selected");
((DeckPicker) getActivity()).confirmDeckDeletion();
break;
case CONTEXT_MENU_DECK_OPTIONS:
Timber.i("Open deck options selected");
((DeckPicker) getActivity()).showContextMenuDeckOptions();
((AnkiActivity) getActivity()).dismissAllDialogFragments();
break;
case CONTEXT_MENU_CUSTOM_STUDY: {
Timber.i("Custom study option selected");
long did = getArguments().getLong("did");
CustomStudyDialog d = CustomStudyDialog.newInstance(
CustomStudyDialog.CONTEXT_MENU_STANDARD, did);
((AnkiActivity) getActivity()).showDialogFragment(d);
break;
}
case CONTEXT_MENU_RENAME_DECK:
Timber.i("Rename deck selected");
((DeckPicker) getActivity()).renameDeckDialog();
break;
case CONTEXT_MENU_EXPORT_DECK:
Timber.i("Export deck selected");
((DeckPicker) getActivity()).showContextMenuExportDialog();
break;
case CONTEXT_MENU_UNBURY: {
Timber.i("Unbury deck selected");
Collection col = CollectionHelper.getInstance().getCol(getContext());
col.getSched().unburyCardsForDeck(getArguments().getLong("did"));
((StudyOptionsFragment.StudyOptionsListener) getActivity()).onRequireDeckListUpdate();
((AnkiActivity) getActivity()).dismissAllDialogFragments();
break;
}
case CONTEXT_MENU_CUSTOM_STUDY_REBUILD: {
Timber.i("Empty deck selected");
((DeckPicker) getActivity()).rebuildFiltered();
((AnkiActivity) getActivity()).dismissAllDialogFragments();
break;
}
case CONTEXT_MENU_CUSTOM_STUDY_EMPTY: {
Timber.i("Empty deck selected");
((DeckPicker) getActivity()).emptyFiltered();
((AnkiActivity) getActivity()).dismissAllDialogFragments();
break;
}
}
}
};
}