package com.barcicki.trio; import java.util.ArrayList; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; 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 SpeedGameActivity extends TrioGameActivity { final static long TIME_LIMIT = 120000L; SharedPreferences mPrefs; Trio mTrio = new Trio(); TextView mDeckStatus; CardList gSelectedCards = new CardList(); ArrayList<CardView> gSelectedViews = new ArrayList<CardView>(); int gTriosFound = 0; boolean gRestoredGame = false; CardGrid mCardGrid; private final int[] HELP_FRAGMENTS = { R.layout.help_speed_fragment1, R.layout.help_speed_fragment2 }; @Override public int getContentView() { return R.layout.speed; } @Override public int[] getHelpFragments() { return HELP_FRAGMENTS; } @Override public void initGame() { mPrefs = PreferenceManager.getDefaultSharedPreferences(this); mCardGrid = (CardGrid) findViewById(R.id.cardsContainer); mDeckStatus = (TextView) findViewById(R.id.gameDeckStatus); attachCardListeners(); } @Override protected boolean hasSeenHelp() { return TrioSettings.hasSeenSpeedHelp(); } @Override protected void setSeenHelp() { TrioSettings.setSeenSpeedHelp(true); } @Override public void onGameStarted() { super.onGameStarted(); mCardGrid.hideReverse(); } @Override public Bundle storeGame(Bundle outState) { outState.putString("game_string", mTrio.getGameString()); outState.putString("game", mTrio.getGame().toString()); outState.putString("table", mTrio.getTable().toString()); outState.putInt("trios_found", gTriosFound); outState.putLong("time", getElapsedTime()); return outState; } @Override public void restoreGame(Bundle savedInstanceState) { if (savedInstanceState != null) { String game = savedInstanceState.getString("game"); String table = savedInstanceState.getString("table"); String gameString = savedInstanceState.getString("game_string"); gTriosFound = savedInstanceState.getInt("trios_found"); setElapsedTime(savedInstanceState.getLong("time")); setCountdown(TIME_LIMIT); if (!game.equals("") && !table.equals("")) { mTrio.setGameString(gameString); mTrio.setGame(CardList.fromString(mTrio.getDeck(), game)); mTrio.setTable(CardList.fromString(mTrio.getDeck(), table)); mCardGrid.setCards(mTrio.getTable()); } else { Log.e("TrioState", "failed to restore saved game"); } } else { setElapsedTime(0); setCountdown(TIME_LIMIT); gTriosFound = 0; gSelectedCards = new CardList(); gSelectedViews = new ArrayList<CardView>(); mTrio.newGame(); } } @Override public void onGameReset() { super.onGameReset(); if (mCardGrid != null) { mCardGrid.setCards(mTrio.getTable()); } } @Override public void onGamePaused() { super.onGamePaused(); mCardGrid.showReverse(); } @Override public void onGameUpdate() { super.onGameUpdate(); mDeckStatus.setText("" + gTriosFound); } @Override public void onGameEnded(boolean won) { super.onGameEnded(won); if (isSignedIn() && won) { GoogleApiClient client = getApiClient(); Games.Achievements.increment(client, getString(R.string.achievement_speed_amateur), 1); Games.Achievements.increment(client, getString(R.string.achievement_speed_pro), 1); Games.Achievements.increment(client, getString(R.string.achievement_speed_guru), 1); Games.Leaderboards.submitScore(client, getString(R.string.leaderboard_speed_trio), gTriosFound); } } private void updateOverlayLabels() { TextView timeView = (TextView) getPauseOverlay().findViewById(R.id.gameTime); timeView.setText(getString(R.string.speed_time_left, (int) Math.ceil(getRemainingTime() / 1000))); TextView trioView = (TextView) getPauseOverlay().findViewById(R.id.gameTrioCount); trioView.setText(getString(R.string.speed_found, gTriosFound)); } @Override public void onPauseOverlayShow() { updateOverlayLabels(); Button buttonContinue = (Button) findViewById(R.id.gameContinue); buttonContinue.setText(getString(R.string.pause_continue)); buttonContinue.setVisibility(View.VISIBLE); Button buttonNewGame = (Button) findViewById(R.id.gameNew); buttonNewGame.setVisibility(View.VISIBLE); Button buttonQuit = (Button) findViewById(R.id.gameQuit); buttonQuit.setText(getString(R.string.pause_quit)); } @Override public void onEndingOverlayShow() { updateOverlayLabels(); TextView statusView = (TextView) getPauseOverlay().findViewById(R.id.gameTime); statusView.setText(getString(R.string.speed_end)); Button buttonContinue = (Button) getPauseOverlay().findViewById(R.id.gameContinue); buttonContinue.setVisibility(View.GONE); Button buttonNewGame = (Button) getPauseOverlay().findViewById(R.id.gameNew); buttonNewGame.setVisibility(View.VISIBLE); Button buttonQuit = (Button) getPauseOverlay().findViewById(R.id.gameQuit); buttonQuit.setText(getString(R.string.pause_quit)); } 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 onTrioFound(CardList selectedCards, ArrayList<CardView> selectedViews) { if (Trio.LOCAL_LOGV) Log.v("Classic Game", "Trio found"); makeSuccessSound(); mTrio.foundTrio(selectedCards); mCardGrid.updateGrid(mTrio.getTable()); gTriosFound += 1; mDeckStatus.setText(Integer.toString(gTriosFound)); saveFoundTrio(); if (!mTrio.getTable().hasTrio() && !mTrio.getGame().hasNext()) { endGame(true); } } // private void restoreGame(Bundle savedInstanceState) { // resetGame(); // // if (savedInstanceState != null) { // String game = savedInstanceState.getString("game"); // String table = savedInstanceState.getString("table"); // String gameString = savedInstanceState.getString("game_string"); // gTriosFound = savedInstanceState.getInt("trios_found"); // // setElapsedTime(savedInstanceState.getLong("time")); // // if (!game.equals("") && !table.equals("")) { // // mTrio.setGameString(gameString); // mTrio.setGame(CardList.fromString(mTrio.getDeck(), game)); // mTrio.setTable(CardList.fromString(mTrio.getDeck(), table)); // mCardGrid.setCards(mTrio.getTable()); // // } else { // Log.e("TrioState", "failed to restore saved game"); // // resetGame(); // } // } // // setGame(); // } /** * Button handlers */ public void onPressedNewGame(View v) { makeClickSound(); resetGame(); startGame(); } public void onPressedQuitGame(View v) { makeClickSound(); startHomeActivity(); finish(); } @Override public void onCountdownFinish() { super.onCountdownFinish(); endGame(true); } }