package com.idunnolol.sotm.fragment;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import com.idunnolol.sotm.R;
import com.idunnolol.sotm.data.Card;
import com.idunnolol.sotm.data.Card.Type;
import com.idunnolol.sotm.data.Db;
import com.idunnolol.sotm.data.GameSetup;
import com.idunnolol.sotm.data.Prefs;
import com.idunnolol.sotm.widget.CardAdapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class CardPickerDialogFragment extends DialogFragment {
public static final String TAG = CardPickerDialogFragment.class.getName();
private static final String ARG_TYPE = "ARG_TYPE";
private static final String ARG_GAME_SETUP = "ARG_GAME_SETUP";
private static final String ARG_CARD = "ARG_CARD";
public static CardPickerDialogFragment newInstance(Type type, GameSetup gameSetup, Card card) {
CardPickerDialogFragment fragment = new CardPickerDialogFragment();
Bundle args = new Bundle();
args.putInt(ARG_TYPE, type.ordinal());
args.putParcelable(ARG_GAME_SETUP, gameSetup);
args.putParcelable(ARG_CARD, card);
fragment.setArguments(args);
return fragment;
}
private CardPickerDialogFragmentListener mListener;
private CardAdapter mAdapter;
private Type getType() {
return Type.values()[getArguments().getInt(ARG_TYPE)];
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mListener = (CardPickerDialogFragmentListener) activity;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Type type = getType();
GameSetup gameSetup = getArguments().getParcelable(ARG_GAME_SETUP);
// We disable heroes that are already selected. We don't bother with villains
// or environments; I don't care if someone re-selects what they already had.
//
// We do not disable the clicked card (and alts) because the user may want to
// select a different version of the current card.
Set<Card> disabledCards = new HashSet<Card>();
if (type == Type.HERO) {
Card currCard = getArguments().getParcelable(ARG_CARD);
for (Card hero : gameSetup.getHeroes()) {
if (!hero.equals(currCard)) {
disabledCards.addAll(Db.getCardAndAlternates(hero));
}
}
}
Collection<Card> cards = Db.getCards(type);
// Add in advanced cards (if allowed)
if (type == Type.VILLAIN && Prefs.isAdvancedAllowed()) {
Collection<Card> baseCards = cards;
cards = new ArrayList<Card>(baseCards.size() * 2);
for (Card villain : baseCards) {
cards.add(villain);
if (villain.canBeAdvanced()) {
Card advancedVillain = new Card(villain);
advancedVillain.makeAdvanced();
cards.add(advancedVillain);
}
}
}
mAdapter = new CardAdapter(getActivity(), cards, disabledCards);
int titleResId;
final Card randomCard;
switch (type) {
case HERO:
titleResId = R.string.title_hero;
randomCard = Card.RANDOM_HERO;
break;
case VILLAIN:
titleResId = R.string.title_villain;
randomCard = Card.RANDOM_VILLAIN;
break;
case ENVIRONMENT:
default:
titleResId = R.string.title_environment;
randomCard = Card.RANDOM_ENVIRONMENT;
break;
}
return new AlertDialog.Builder(getActivity())
.setTitle(titleResId)
.setSingleChoiceItems(mAdapter, 0, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dismissAllowingStateLoss();
mListener.onCardSelected(mAdapter.getItem(which));
}
})
.setNeutralButton(R.string.card_random, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mListener.onCardSelected(randomCard);
}
})
.setNegativeButton(R.string.cancel, null)
.create();
}
//////////////////////////////////////////////////////////////////////////
// Listener interface
public interface CardPickerDialogFragmentListener {
public void onCardSelected(Card card);
}
}