package com.barcicki.trio; import java.util.ArrayList; import java.util.List; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.barcicki.trio.core.Card; import com.barcicki.trio.core.CardGrid; import com.barcicki.trio.core.CardList; import com.barcicki.trio.core.Trio; import com.barcicki.trio.core.TrioSettings; import com.barcicki.trio.views.CardView; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.Games; public class PracticeGameActivity extends TrioGameActivity { private static final String TRIO_LIST_DELIMITER = ";"; private static final int NUMBER_OF_TRIOS = 3; SharedPreferences mPrefs; Trio mTrio = new Trio(); CardList mGame = new CardList(); CardList gSelectedCards = new CardList(); ArrayList<CardView> gSelectedViews = new ArrayList<CardView>(); ArrayList<CardList> gFoundTrios = new ArrayList<CardList>(); CardGrid mTriosGrid; CardGrid mCardGrid; private TextView mGameStatus; private boolean mHasWon = false; private final int[] HELP_FRAGMENTS = { R.layout.help_practice_fragment1, R.layout.help_practice_fragment2, R.layout.help_practice_fragment3 }; @Override public int getContentView() { return R.layout.practice; } @Override public int[] getHelpFragments() { return HELP_FRAGMENTS; } @Override public void initGame() { mPrefs = PreferenceManager.getDefaultSharedPreferences(this); mCardGrid = (CardGrid) findViewById(R.id.cardsContainer); mTriosGrid = (CardGrid) findViewById(R.id.triosContainer); mGameStatus = (TextView) findViewById(R.id.gameStatus); attachCardListeners(); } @Override protected boolean hasSeenHelp() { return TrioSettings.hasSeenTripleHelp(); } @Override protected void setSeenHelp() { TrioSettings.setSeenTripleHelp(true); } @Override public void onGameStarted() { super.onGameStarted(); mCardGrid.hideReverse(); } @Override public void onGamePaused() { mCardGrid.showReverse(); } @Override public Bundle storeGame(Bundle stateToModify) { List<String> foundTrio = new ArrayList<String>(); for (CardList trio : gFoundTrios) { foundTrio.add(trio.toString()); } stateToModify.putString("challenge", mGame.toString()); stateToModify.putString("found", TextUtils.join(TRIO_LIST_DELIMITER, foundTrio)); stateToModify.putLong("time", getElapsedTime()); return stateToModify; } @Override public void restoreGame(Bundle savedInstanceState) { if (savedInstanceState != null) { setElapsedTime(savedInstanceState.getLong("time")); String foundTrios = savedInstanceState.getString("found"); String challenge = savedInstanceState.getString("challenge"); CardList three = new CardList(); gFoundTrios.clear(); if (foundTrios != null && !foundTrios.equals("")) { for (String card : TextUtils.split(foundTrios, TRIO_LIST_DELIMITER)) { three.addAll(CardList.fromString(mTrio.getDeck(), card)); if (three.size() == 3) { gFoundTrios.add(new CardList(three)); three.clear(); } } } else { Log.d("TripleTrio", "Could not restore found trios"); } gSelectedCards = new CardList(); gSelectedViews = new ArrayList<CardView>(); mGame = CardList.fromString(mTrio.getDeck(), challenge); } else { setElapsedTime(0); gFoundTrios.clear(); gSelectedCards = new CardList(); gSelectedViews = new ArrayList<CardView>(); mGame = mTrio.getSetWithTrios(NUMBER_OF_TRIOS); } } @Override public void onGameReset() { super.onGameReset(); if (mCardGrid != null) { mCardGrid.setCards(mGame); } if (mTriosGrid != null) { mTriosGrid.setEmptyCardList(9); mTriosGrid.setResourceImageForAll(R.drawable.square_question); mTriosGrid.showReverse(); int index = 0; for (CardList trio : gFoundTrios) { mTriosGrid.setCardsToCardViews(trio, index); mTriosGrid.revealCard(trio); index += trio.size(); } } mHasWon = false; } @Override public void onGameUpdate() { super.onGameUpdate(); mGameStatus.setText("" + (NUMBER_OF_TRIOS - gFoundTrios.size())); } @Override public void onGameEnded(boolean won) { super.onGameEnded(won); mHasWon = won; if (isSignedIn() && mHasWon) { GoogleApiClient client = getApiClient(); Games.Achievements.increment(client, getString(R.string.achievement_triple_amateur), 1); Games.Achievements.increment(client, getString(R.string.achievement_triple_pro), 1); Games.Achievements.increment(client, getString(R.string.achievement_triple_guru), 1); Games.Leaderboards.submitScore(client, getString(R.string.leaderboard_triple_trio), getElapsedTime()); } } private void attachCardListeners() { mCardGrid.setOnItemClickListener(new OnClickListener() { public void onClick(View v) { CardView cv = (CardView) v; Card card = cv.getCard(); if (!gSelectedCards.contains(card)) { gSelectedCards.add(card); gSelectedViews.add(cv); cv.setSelected(true); if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Selected " + card.toString()); } else { gSelectedCards.remove(card); gSelectedViews.remove(cv); cv.setSelected(false); if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Deselected " + card.toString()); } if (gSelectedCards.size() == 3) { if (gSelectedCards.hasTrio()) { onTrioFound(gSelectedCards, gSelectedViews); } else { onNotTrioFound(gSelectedCards, gSelectedViews); } gSelectedCards.clear(); gSelectedViews.clear(); } else { makeClickSound(); } } }); } protected void onNotTrioFound(CardList selectedCards, ArrayList<CardView> selectedViews) { if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Trio NOT found"); makeFailSound(); for (CardView cv : selectedViews) { cv.animateFail(); } if (TrioSettings.displaysWhatIsWrong()) { displayWhatIsWrong(selectedCards); } } protected void onTrioAlreadyFound(CardList selectedCards, ArrayList<CardView> selectedViews) { if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Trio is already found"); makeFailSound(); for (CardView cv : selectedViews) { cv.animateFail(); } if (TrioSettings.displaysWhatIsWrong()) { Toast.makeText(this, getString(R.string.practice_already_found), Toast.LENGTH_SHORT).show(); } } protected void onTrioFound(CardList selectedCards, ArrayList<CardView> selectedViews) { if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Trio found"); boolean alreadyFound = false; for (CardList list : gFoundTrios) { if (CardList.areEqual(selectedCards, list)) { alreadyFound = true; } } if (alreadyFound) { onTrioAlreadyFound(selectedCards, selectedViews); } else { makeSuccessSound(); mTriosGrid.setCardsToCardViews(selectedCards, gFoundTrios.size() * 3); gFoundTrios.add(new CardList(selectedCards)); final ArrayList<CardView> views = new ArrayList<CardView>(selectedViews); mTriosGrid.setRevealCardListener(new AnimationListener() { public void onAnimationStart(Animation animation) {} public void onAnimationRepeat(Animation animation) {} public void onAnimationEnd(Animation animation) { for (CardView cv : views) { cv.setSelected(false); cv.invalidate(); cv.refreshDrawableState(); } } }); mTriosGrid.revealCard(selectedCards); saveFoundTrio(); updateGame(); } if (gFoundTrios.size() == NUMBER_OF_TRIOS) { endGame(true); } } private void updateOverlayLabels() { TextView timeView = (TextView) getPauseOverlay().findViewById(R.id.gameTime); timeView.setText(getElapsedTimeAsString(true)); } @Override public void onPauseOverlayShow() { updateOverlayLabels(); TextView trioView = (TextView) getPauseOverlay().findViewById(R.id.gameTrioCount); trioView.setText(getString(R.string.practice_trio_count, gFoundTrios.size(), NUMBER_OF_TRIOS )); Button buttonContinue = (Button) getPauseOverlay().findViewById(R.id.gameContinue); buttonContinue.setText(R.string.pause_continue); buttonContinue.setVisibility(View.VISIBLE); Button buttonNewGame = (Button) getPauseOverlay().findViewById(R.id.gameNew); buttonNewGame.setVisibility(View.VISIBLE); CardGrid notFoundHolder = (CardGrid) getPauseOverlay().findViewById(R.id.gameNotFound); notFoundHolder.setVisibility(View.INVISIBLE); } @Override public void onEndingOverlayShow() { updateOverlayLabels(); Button buttonContinue = (Button) getPauseOverlay().findViewById(R.id.gameContinue); buttonContinue.setVisibility(View.GONE); Button buttonNewGame = (Button) getPauseOverlay().findViewById(R.id.gameNew); buttonNewGame.setVisibility(View.VISIBLE); TextView statusView = (TextView) getPauseOverlay().findViewById(R.id.gameTrioCount); CardGrid notFoundHolder = (CardGrid) getPauseOverlay().findViewById(R.id.gameNotFound); if (mHasWon) { statusView.setText(getString(R.string.practice_end)); notFoundHolder.setVisibility(View.INVISIBLE); } else { statusView.setText(getString(R.string.practice_resigned, NUMBER_OF_TRIOS - gFoundTrios.size())); CardList cards = mCardGrid.getCardsFromViews(); ArrayList<CardList> trios = cards.getTrios(); notFoundHolder.setVisibility(View.VISIBLE); notFoundHolder.setCards(CardList.difference(trios, gFoundTrios)); notFoundHolder.forceColumnSize(3); notFoundHolder.render(); } } public void onPressedNewGame(View v) { makeClickSound(); resetGame(); startGame(); } public void onPressedQuitGame(View v) { makeClickSound(); startHomeActivity(); finish(); } public void onResignPressed(View v) { makeClickSound(); endGame(false); } }