/* * Copyright (C) 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.apps.santatracker.games.common; import android.os.Bundle; import android.support.v7.app.ActionBar; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.Games; import java.util.HashMap; public abstract class PlayGamesActivity extends GameActivity { // list of achievements we are pending to unlock or increment (waiting for sign in) // Key is the achievement ID, value is the number of steps to increment. 0 means // unlock rather than increment. private HashMap<String, Integer> mAchievementsToSend = new HashMap<String, Integer>(); // score we are pending to send (waiting for sign in). Hash of leaderboard ID to score. private HashMap<String, Long> mScoresToSend = new HashMap<String, Long>(); // id of the layout to load during onCreate private int mLayoutId; protected Class<?> mBackClass; public PlayGamesActivity(int layoutId, Class<?> backClass) { super(); mLayoutId = layoutId; mBackClass = backClass; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(mLayoutId); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayHomeAsUpEnabled(false); } } @Override public boolean onSupportNavigateUp() { launchStartupActivity(); return true; } @Override public void onBackPressed() { launchStartupActivity(); } protected void launchStartupActivity() { finish(); } @Override public void onSignInSucceeded() { super.onSignInSucceeded(); tryToSendGameData(); } // Call from any thread public void postUnlockAchievement(final int achResId) { final String achievementId = getString(achResId); runOnUiThread(new Runnable() { @Override public void run() { if (!mAchievementsToSend.containsKey(achievementId)) { mAchievementsToSend.put(achievementId, 0); } tryToSendGameData(); } }); } // Call from any thread public void postIncrementAchievement(final int achResId, final int steps) { final String achievementId = getString(achResId); if (steps <= 0) { return; } runOnUiThread(new Runnable() { @Override public void run() { if (!mAchievementsToSend.containsKey(achievementId)) { mAchievementsToSend.put(achievementId, steps); } else { mAchievementsToSend.put(achievementId, mAchievementsToSend.get(achievementId) + steps); } tryToSendGameData(); } }); } // Call from any thread public void postSubmitScore(final int lbResId, final long score) { final String leaderboardId = getString(lbResId); runOnUiThread(new Runnable() { @Override public void run() { if (mScoresToSend.containsKey(leaderboardId)) { long existingScore = mScoresToSend.get(leaderboardId); if (existingScore >= score) { return; } } mScoresToSend.put(leaderboardId, score); tryToSendGameData(); } }); } // Call from UI thread only. private void tryToSendGameData() { if (isSignedIn() && getGamesApiClient().isConnected()) { GoogleApiClient apiClient = getGamesApiClient(); for (String achId : mAchievementsToSend.keySet()) { int arg = mAchievementsToSend.get(achId); if (arg <= 0) { Games.Achievements.unlock(apiClient, achId); } else { Games.Achievements.increment(apiClient, achId, arg); } } mAchievementsToSend.clear(); for (String lbId : mScoresToSend.keySet()) { Games.Leaderboards.submitScore(apiClient, lbId, mScoresToSend.get(lbId)); } mScoresToSend.clear(); } } public void startSignIn() { if (!isSignedIn()) { beginUserInitiatedSignIn(); } } }