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 ClassicGameActivity extends TrioGameActivity {
private final static int NUMBER_OF_HINTS = 10;
private final static long HINT_COST = 30000L;
SharedPreferences mPrefs;
Trio mTrio = new Trio();
Button mHintButton;
TextView mDeckStatus;
CardList gSelectedCards = new CardList();
ArrayList<CardView> gSelectedViews = new ArrayList<CardView>();
int gTriosFound = 0;
int gHintsRemained = NUMBER_OF_HINTS;
boolean gRestoredGame = false;
CardGrid mCardGrid;
final static int[] HELP_FRAGMENTS = {
R.layout.help_classic_fragment1,
R.layout.help_classic_fragment2,
R.layout.help_classic_fragment3
};
@Override
public int getContentView() {
return R.layout.classic;
}
@Override
public int[] getHelpFragments() {
return HELP_FRAGMENTS;
}
@Override
public void initGame() {
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mCardGrid = (CardGrid) findViewById(R.id.cardsContainer);
mHintButton = (Button) findViewById(R.id.gameHintButton);
mDeckStatus = (TextView) findViewById(R.id.gameDeckStatus);
attachCardListeners();
}
@Override
public void restoreGame(Bundle game) {
if (!restoreSavedGame()) {
mTrio.newGame();
gTriosFound = 0;
gHintsRemained = NUMBER_OF_HINTS;
gSelectedCards.clear();
gSelectedViews.clear();
}
}
@Override
public Bundle storeGame(Bundle stateToModify) {
saveGame();
return stateToModify;
}
@Override
public void onGameReset() {
super.onGameReset();
mCardGrid.setCards(mTrio.getTable());
}
@Override
protected boolean hasSeenHelp() {
return TrioSettings.hasSeenClassicHelp();
}
@Override
protected void setSeenHelp() {
TrioSettings.setSeenClassicHelp(true);
}
@Override
public void onGameStarted() {
super.onGameStarted();
mCardGrid.hideReverse();
}
@Override
public void onGameEnded(boolean won) {
super.onGameEnded(won);
if (won) {
TrioSettings.setSavedGamePresence(false);
if (isSignedIn()) {
GoogleApiClient client = getApiClient();
Games.Achievements.unlock(client, getString(R.string.achievement_classic_amateur));
Games.Achievements.increment(client, getString(R.string.achievement_classic_pro), 1);
Games.Achievements.increment(client, getString(R.string.achievement_classic_guru), 1);
Games.Leaderboards.submitScore(client, getString(R.string.leaderboard_classic_trio), getElapsedTime());
}
}
}
@Override
public void onGameUpdate() {
super.onGameUpdate();
mHintButton.setText(getString(R.string.classic_hint, gHintsRemained));
mDeckStatus.setText("" + mTrio.getGame().size());
}
@Override
public void onGamePaused() {
mCardGrid.showReverse();
}
private void updateOverlayLabels() {
TextView timeView = (TextView) getPauseOverlay().findViewById(R.id.gameTime);
TextView hintsView = (TextView) getPauseOverlay().findViewById(R.id.gameHintCount);
TextView trioView = (TextView) getPauseOverlay().findViewById(R.id.gameTrioCount);
timeView.setText(getElapsedTimeAsString(true));
hintsView.setText(getString(R.string.classic_hint_count, gHintsRemained));
trioView.setText(getString(R.string.classic_trio_count, gTriosFound));
}
@Override
public void onPauseOverlayShow() {
updateOverlayLabels();
TextView statusView = (TextView) getPauseOverlay().findViewById(R.id.gameStatus);
statusView.setText(getString(R.string.classic_status, mTrio.getGame().size()));
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_save_quit));
}
@Override
public void onEndingOverlayShow() {
updateOverlayLabels();
TextView statusView = (TextView) getPauseOverlay().findViewById(R.id.gameStatus);
statusView.setText(getString(R.string.classic_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();
}
}
});
}
@Override
protected void onPause() {
if (!isGameFinished()) {
saveGame();
}
super.onPause();
}
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());
mDeckStatus.setText(((Integer) mTrio.getGame().size()).toString());
gTriosFound += 1;
saveFoundTrio();
if (!mTrio.getTable().hasTrio() && !mTrio.getGame().hasNext()) {
endGame(true);
} else {
}
}
private boolean saveGame() {
SharedPreferences.Editor ed = mPrefs.edit();
ed.putString("game_string", mTrio.getGameString());
ed.putString("game", mTrio.getGame().toString());
ed.putString("table", mTrio.getTable().toString());
ed.putInt("trios_found", gTriosFound);
ed.putInt("hints", gHintsRemained);
ed.putLong("time", getElapsedTime());
ed.putBoolean("saved_game", true);
if (ed.commit()) {
if (Trio.LOCAL_LOGV)
Log.v("Classic Game", "saved progress");
return true;
} else {
Log.e("Classic Game", "failed to save progress");
return false;
}
}
private boolean clearSavedGame() {
SharedPreferences.Editor ed = mPrefs.edit();
ed.putBoolean("saved_game", false);
if (ed.commit()) {
if (Trio.LOCAL_LOGV)
Log.v("Classic Game", "unsaved progress");
return true;
} else {
Log.e("Classic Game", "failed to change progress");
return false;
}
}
private boolean restoreSavedGame() {
if (mPrefs.getBoolean("saved_game", false)) {
String game = mPrefs.getString("game", "");
String table = mPrefs.getString("table", "");
String gameString = mPrefs.getString("game_string", "");
gHintsRemained = mPrefs.getInt("hints", NUMBER_OF_HINTS);
gTriosFound = mPrefs.getInt("trios_found", 0);
setElapsedTime(mPrefs.getLong("time", 0L));
if (!game.equals("") && !table.equals("")) {
mTrio.setGame(CardList.fromString(mTrio.getDeck(), game));
mTrio.setTable(CardList.fromString(mTrio.getDeck(), table));
mTrio.setGameString(gameString);
if (Trio.LOCAL_LOGV)
Log.v("Classic Game", "Restored saved game");
return true;
} else {
Log.e("TrioState", "failed to restore saved game");
}
}
return false;
}
/**
* Button handlers
*/
public void onHintClicked(View v) {
makeClickSound();
if (gHintsRemained > 0) {
ArrayList<CardList> trios = mTrio.getTable().getTrios();
int selectedSize = gSelectedCards.size();
if (trios.size() > 0) {
// if no cards were selected before, select the first card
// possible - it is being done in the end of method
// if one card was selected, check if it makes trio with
// others. If yes, show next card, if no, deselect it and
// select another one
if (selectedSize == 1) {
Card selected = gSelectedCards.get(0);
for (CardList trio : trios) {
if (trio.contains(selected)) {
for (Card c : trio) {
if (!c.equals(selected)) {
gSelectedCards.add(c);
gSelectedViews.add(mCardGrid.select(c));
useHint();
if (Trio.LOCAL_LOGV)
Log.v("Single Game Hint",
"Hint showed second card");
return;
}
}
}
}
// if there're two cards selected check if they make any
// trio, if yes do not give additional hints, if no
// deselect them and select first one
} else if (selectedSize == 2) {
Card sel1 = gSelectedCards.get(0);
Card sel2 = gSelectedCards.get(1);
for (CardList trio : trios) {
if (trio.contains(sel1) && trio.contains(sel2)) {
Toast.makeText(getApplicationContext(),
getString(R.string.hints_ended),
Toast.LENGTH_SHORT).show();
return;
}
}
}
gSelectedCards.clear();
Card firstCard = trios.get(0).get(0);
mCardGrid.deselectAll();
gSelectedCards.clear();
gSelectedViews.clear();
gSelectedCards.add(firstCard);
gSelectedViews.add(mCardGrid.select(firstCard));
useHint();
if (Trio.LOCAL_LOGV)
Log.v("Single Game Hint", "Hint showed first card");
return;
} else {
Log.e("Single Game Hint",
"Trios were empty when they shouldn't");
}
} else {
Toast.makeText(this, getString(R.string.classic_hints_finished),
Toast.LENGTH_SHORT).show();
}
}
public void useHint() {
gHintsRemained -= 1;
mHintButton.setText(getString(R.string.classic_hint, gHintsRemained));
addTime(HINT_COST);
}
public void onPressedNewGame(View v) {
makeClickSound();
TrioSettings.setSavedGamePresence(false);
mTrio.newGame();
resetGame();
startGame();
}
public void onPressedQuitGame(View v) {
makeClickSound();
if (isGameFinished()) {
clearSavedGame();
} else {
saveGame();
}
startHomeActivity();
finish();
}
}