Java tutorial
/* * Copyright (C) 2013 Google Inc. * * 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.dva217.shadowchess.app.BaseGameUtils; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Display; import android.view.WindowManager; import com.dva217.shadowchess.app.GameActivity; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatch; import com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig; import java.util.ArrayList; /** * Example base class for games. This implementation takes care of setting up * the API client object and managing its lifecycle. Subclasses only need to * override the @link{#onSignInSucceeded} and @link{#onSignInFailed} abstract * methods. To initiate the sign-in flow when the user clicks the sign-in * button, subclasses should call @link{#beginUserInitiatedSignIn}. By default, * this class only instantiates the GoogleApiClient object. If the PlusClient or * AppStateClient objects are also wanted, call the BaseGameActivity(int) * constructor and specify the requested clients. For example, to request * PlusClient and GamesClient, use BaseGameActivity(CLIENT_GAMES | CLIENT_PLUS). * To request all available clients, use BaseGameActivity(CLIENT_ALL). * Alternatively, you can also specify the requested clients via * @link{#setRequestedClients}, but you must do so before @link{#onCreate} * gets called, otherwise the call will have no effect. * * @author Bruno Oliveira (Google) */ public abstract class BaseGameActivity extends FragmentActivity implements GameHelper.GameHelperListener { // The game helper object. This class is mainly a wrapper around this object. protected GameHelper mHelper; // We expose these constants here because we don't want users of this class // to have to know about GameHelper at all. public static final int CLIENT_GAMES = GameHelper.CLIENT_GAMES; public static final int CLIENT_APPSTATE = GameHelper.CLIENT_APPSTATE; public static final int CLIENT_PLUS = GameHelper.CLIENT_PLUS; public static final int CLIENT_ALL = GameHelper.CLIENT_ALL; public static MediaPlayer mediaPlayer; public static android.graphics.Point screenSize; public static TurnBasedMatch match; public static boolean myTurn; public static TurnBasedMatchConfig tbmc; // Requested clients. By default, that's just the games client. protected int mRequestedClients = CLIENT_GAMES; private final static String TAG = "BaseGameActivity"; protected boolean mDebugLog = false; /** Constructs a BaseGameActivity with default client (GamesClient). */ protected BaseGameActivity() { super(); } /** * Constructs a BaseGameActivity with the requested clients. * @param requestedClients The requested clients (a combination of CLIENT_GAMES, * CLIENT_PLUS and CLIENT_APPSTATE). */ protected BaseGameActivity(int requestedClients) { super(); setRequestedClients(requestedClients); } /** * Sets the requested clients. The preferred way to set the requested clients is * via the constructor, but this method is available if for some reason your code * cannot do this in the constructor. This must be called before onCreate or getGameHelper() * in order to have any effect. If called after onCreate()/getGameHelper(), this method * is a no-op. * * @param requestedClients A combination of the flags CLIENT_GAMES, CLIENT_PLUS * and CLIENT_APPSTATE, or CLIENT_ALL to request all available clients. */ protected void setRequestedClients(int requestedClients) { mRequestedClients = requestedClients; } public GameHelper getGameHelper() { if (mHelper == null) { mHelper = new GameHelper(this, mRequestedClients); mHelper.enableDebugLog(mDebugLog); } return mHelper; } @Override protected void onCreate(Bundle b) { super.onCreate(b); if (mHelper == null) { getGameHelper(); } mHelper.setup(this); } @Override protected void onStart() { super.onStart(); mHelper.onStart(this); } @Override protected void onStop() { super.onStop(); mHelper.onStop(); } @Override protected void onActivityResult(int request, int response, Intent data) { super.onActivityResult(request, response, data); mHelper.onActivityResult(request, response, data); } protected GoogleApiClient getApiClient() { return mHelper.getApiClient(); } protected boolean isSignedIn() { return mHelper.isSignedIn(); } protected void beginUserInitiatedSignIn() { mHelper.beginUserInitiatedSignIn(); } protected void signOut() { mHelper.signOut(); } protected void showAlert(String message) { mHelper.makeSimpleDialog(message).show(); } protected void showAlert(String title, String message) { mHelper.makeSimpleDialog(title, message).show(); } protected void enableDebugLog(boolean enabled) { mDebugLog = true; if (mHelper != null) { mHelper.enableDebugLog(enabled); } } @Deprecated protected void enableDebugLog(boolean enabled, String tag) { Log.w(TAG, "BaseGameActivity.enabledDebugLog(bool,String) is " + "deprecated. Use enableDebugLog(boolean)"); enableDebugLog(enabled); } protected String getInvitationId() { return mHelper.getInvitationId(); } protected void reconnectClient() { mHelper.reconnectClient(); } protected boolean hasSignInError() { return mHelper.hasSignInError(); } protected GameHelper.SignInFailureReason getSignInError() { return mHelper.getSignInError(); } // Returns a point containing the width and height of the device screen. protected android.graphics.Point getScreenMetrics() { WindowManager wm = (WindowManager) BaseGameActivity.this.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); android.graphics.Point point = new android.graphics.Point(); display.getSize(point); return point; } protected void startGame() { myTurn = true; startActivity(new Intent(this, GameActivity.class)); } protected void matchJoin() { System.out.println("matchJoin() start"); int status = match.getStatus(); int turnStatus = match.getTurnStatus(); switch (status) { case TurnBasedMatch.MATCH_STATUS_CANCELED: showWarning("Canceled!", "This game was canceled!"); return; case TurnBasedMatch.MATCH_STATUS_EXPIRED: showWarning("Expired!", "This game is expired. So sad!"); return; case TurnBasedMatch.MATCH_STATUS_AUTO_MATCHING: showWarning("Waiting for auto-match...", "We're still waiting for an automatch partner."); return; case TurnBasedMatch.MATCH_STATUS_COMPLETE: if (turnStatus == TurnBasedMatch.MATCH_TURN_STATUS_COMPLETE) { showWarning("Complete!", "This game is over; someone finished it, and so did you! There is nothing to be done."); break; } // Note that in this state, you must still call "Finish" yourself, // so we allow this to continue. showWarning("Complete!", "This game is over; someone finished it! You can only finish it now."); } // OK, it's active. Check on turn status. switch (turnStatus) { case TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN: //mTurnData = SkeletonTurn.unpersist(mMatch.getData()); //setGameplayUI(); myTurn = true; startGame(); return; case TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN: // Should return results. showWarning("Alas...", "It's not your turn."); myTurn = false; startGame(); break; case TurnBasedMatch.MATCH_TURN_STATUS_INVITED: showWarning("Good inititative!", "Still waiting for invitations.\n\nBe patient!"); } System.out.println("matchJoin() end"); } // Generic warning/info dialog public void showWarning(String title, String message) { System.out.println(title + ":" + message); /*AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); // set title alertDialogBuilder.setTitle(title).setMessage(message); // set dialog message alertDialogBuilder.setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // if this button is clicked, close // current activity } }); // create alert dialog mAlertDialog = alertDialogBuilder.create(); // show it mAlertDialog.show();*/ } }