package com.idunnolol.sotm.fragment; import android.app.Activity; import android.app.DialogFragment; import android.app.ListFragment; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import com.idunnolol.sotm.R; import com.idunnolol.sotm.Randomizer; import com.idunnolol.sotm.activity.CardConfigActivity; import com.idunnolol.sotm.data.Card; import com.idunnolol.sotm.data.Card.Type; import com.idunnolol.sotm.data.Db; import com.idunnolol.sotm.data.Difficulty; import com.idunnolol.sotm.data.GameSetup; import com.idunnolol.sotm.fragment.CardPickerDialogFragment.CardPickerDialogFragmentListener; import com.idunnolol.sotm.fragment.DifficultyDialogFragment.DifficultyDialogFragmentListener; import com.idunnolol.sotm.fragment.SpecifyDifficultyDialogFragment.SpecifyDifficultyDialogFragmentListener; import com.idunnolol.sotm.widget.GameSetupAdapter; import com.idunnolol.sotm.widget.GameSetupAdapter.GameSetupAdapterListener; import java.util.List; public class RandomizerListFragment extends ListFragment implements GameSetupAdapterListener, CardPickerDialogFragmentListener, DifficultyDialogFragmentListener, SpecifyDifficultyDialogFragmentListener { public static final String TAG = RandomizerListFragment.class.getName(); private static final String INSTANCE_SELECTED_CARD_TYPE = "INSTANCE_SELECTED_CARD_TYPE"; private static final String INSTANCE_SELECTED_CARD_INDEX = "INSTANCE_SELECTED_CARD_INDEX"; private static final String INSTANCE_GAME_SETUP = "INSTANCE_GAME_SETUP"; private static final String INSTANCE_BASE_GAME_SETUP = "INSTANCE_BASE_GAME_SETUP"; private static final String INSTANCE_TARGET_WIN_PERCENT = "INSTANCE_TARGET_WIN_PERCENT"; private RandomizerListFragmentListener mListener; private GameSetupAdapter mAdapter; private GameSetup mGameSetup; // We keep the base GameSetup around, in case we want to randomize multiple times in a row private int mTargetWinPercent; private GameSetup mBaseGameSetup; // Which index we're currently selecting for the card dialog fragment private Type mSelectCardType; private int mSelectCardIndex; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); if (savedInstanceState == null) { mGameSetup = new GameSetup(); } else { mGameSetup = savedInstanceState.getParcelable(INSTANCE_GAME_SETUP); if (savedInstanceState.containsKey(INSTANCE_BASE_GAME_SETUP)) { mBaseGameSetup = savedInstanceState.getParcelable(INSTANCE_BASE_GAME_SETUP); mTargetWinPercent = savedInstanceState.getInt(INSTANCE_TARGET_WIN_PERCENT); } if (savedInstanceState.containsKey(INSTANCE_SELECTED_CARD_TYPE)) { mSelectCardType = Type.values()[savedInstanceState.getInt(INSTANCE_SELECTED_CARD_TYPE)]; mSelectCardIndex = savedInstanceState.getInt(INSTANCE_SELECTED_CARD_INDEX); } } } @Override public void onAttach(Activity activity) { super.onAttach(activity); mListener = (RandomizerListFragmentListener) activity; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mAdapter = new GameSetupAdapter(getActivity(), mGameSetup, this); setListAdapter(mAdapter); } @Override public void onResume() { super.onResume(); // Check that all selected cards are still enabled // (May have been disabled in card config activity) validateGameSetup(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(INSTANCE_GAME_SETUP, mGameSetup); if (mBaseGameSetup != null) { outState.putParcelable(INSTANCE_BASE_GAME_SETUP, mBaseGameSetup); outState.putInt(INSTANCE_TARGET_WIN_PERCENT, mTargetWinPercent); } if (mSelectCardType != null) { outState.putInt(INSTANCE_SELECTED_CARD_TYPE, mSelectCardType.ordinal()); } outState.putInt(INSTANCE_SELECTED_CARD_INDEX, mSelectCardIndex); } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); mSelectCardType = mAdapter.getType(position); // Check that we even have something to select from if (Db.getCards(mSelectCardType).size() == 0) { DialogFragment df = NotEnoughCardsDialogFragment.newInstance(mSelectCardType); df.show(getFragmentManager(), NotEnoughCardsDialogFragment.TAG); } else { int start = mAdapter.getTypeStart(mSelectCardType); mSelectCardIndex = position - start - 1; Card card = (Card) mAdapter.getItem(position); CardPickerDialogFragment dialogFragment = CardPickerDialogFragment.newInstance(mSelectCardType, mGameSetup, card); dialogFragment.show(getFragmentManager(), CardPickerDialogFragment.TAG); } } public GameSetup getGameSetup() { return mGameSetup; } /** * Indicate that some outside settings may have changed and invalidated the game setup; if so, we want * to change things so we are still legit . */ public void validateGameSetup() { boolean hasChanged = false; List<Card> heroes = mGameSetup.getHeroes(); for (int a = 0; a < heroes.size(); a++) { if (!heroes.get(a).isEnabled()) { mGameSetup.setHero(a, Card.RANDOM_HERO); hasChanged = true; } } if (!mGameSetup.getVillain().isEnabled()) { mGameSetup.setVillain(Card.RANDOM_VILLAIN); hasChanged = true; } if (!mGameSetup.getEnvironment().isEnabled()) { mGameSetup.setEnvironment(Card.RANDOM_ENVIRONMENT); hasChanged = true; } if (hasChanged) { onGameSetupChanged(); } } public void launchRandomizerDialog(boolean fromStats) { if (!mGameSetup.canRandomize()) { if (fromStats) { startActivity(new Intent(getActivity(), CardConfigActivity.class)); } else { DialogFragment df = NotEnoughCardsDialogFragment.newInstance(mGameSetup.getFirstLackingType()); df.show(getFragmentManager(), NotEnoughCardsDialogFragment.TAG); } } else { DifficultyDialogFragment df = new DifficultyDialogFragment(); df.show(getFragmentManager(), DifficultyDialogFragment.TAG); } } private void onGameSetupChanged() { onGameSetupChanged(null); } private void onGameSetupChanged(GameSetup gameSetup) { mBaseGameSetup = gameSetup; mAdapter.notifyDataSetChanged(); mListener.onGameSetupChanged(mGameSetup); getActivity().invalidateOptionsMenu(); } private void randomize(int targetWinPercent) { GameSetup baseGameSetup = mBaseGameSetup; if (baseGameSetup == null) { baseGameSetup = new GameSetup(mGameSetup); } Randomizer randomizer = new Randomizer(baseGameSetup); if (baseGameSetup.canRandomize()) { if (targetWinPercent == Difficulty.RANDOM.getTargetWinPercent()) { mGameSetup.updateFrom(randomizer.randomize()); } else { mGameSetup.updateFrom(randomizer.randomize(targetWinPercent)); } onGameSetupChanged(baseGameSetup); mTargetWinPercent = targetWinPercent; } else { DialogFragment df = NotEnoughCardsDialogFragment.newInstance(baseGameSetup.getFirstLackingType()); df.show(getFragmentManager(), NotEnoughCardsDialogFragment.TAG); } } ////////////////////////////////////////////////////////////////////////// // Action bar @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_randomizer, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.action_reroll).setVisible(mBaseGameSetup != null); menu.findItem(R.id.action_randomize).setVisible(mBaseGameSetup == null && mGameSetup.hasRandomCards()); menu.findItem(R.id.action_reset).setVisible(!mGameSetup.isCompletelyRandom()); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_randomize: launchRandomizerDialog(false); return true; case R.id.action_reroll: randomize(mTargetWinPercent); return true; case R.id.action_reset: mGameSetup.reset(); onGameSetupChanged(); return true; } return super.onOptionsItemSelected(item); } ////////////////////////////////////////////////////////////////////////// // GameSetupAdapterListener @Override public void onAdd(Type type) { mGameSetup.addHero(); onGameSetupChanged(); } @Override public void onRemove(Type type, int index) { mGameSetup.removeHero(index); onGameSetupChanged(); } ////////////////////////////////////////////////////////////////////////// // CardPickerDialogFragmentListener @Override public void onCardSelected(Card card) { switch (mSelectCardType) { case HERO: mGameSetup.setHero(mSelectCardIndex, card); break; case VILLAIN: mGameSetup.setVillain(card); break; case ENVIRONMENT: mGameSetup.setEnvironment(card); break; } onGameSetupChanged(); } ////////////////////////////////////////////////////////////////////////// // DifficultyDialogFragmentListener @Override public void onDifficultyChosen(Difficulty difficulty) { if (difficulty == Difficulty.PICK_YOUR_OWN) { SpecifyDifficultyDialogFragment df = new SpecifyDifficultyDialogFragment(); df.show(getFragmentManager(), SpecifyDifficultyDialogFragment.TAG); } else { randomize(difficulty.getTargetWinPercent()); } } ////////////////////////////////////////////////////////////////////////// // SpecifyDifficultyDialogFragmentListener @Override public void onSpecificDifficultyChosen(int targetWinPercent) { randomize(targetWinPercent); } ////////////////////////////////////////////////////////////////////////// // Interface public interface RandomizerListFragmentListener { public void onGameSetupChanged(GameSetup gameSetup); } }