/* Copyright (c) 2014 Intel Corporation. All rights reserved. * Use of this source code is governed by a MIT-style license that can be * found in the LICENSE file. */ package com.intel; import com.intel.GooglePlayGamesService; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaWebView; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.Games; import com.google.android.gms.games.Player; import com.google.android.gms.games.Games.GamesOptions; /** * * @author Ian Maffet * @copyright 2014 * @file ggamesPlugin for Cordova * */ public class GooglePlayGamesPlugin extends CordovaPlugin { private String TAG = "GooglePlayGamesPlugin"; private GooglePlayGamesService playGamesService; private static final int SIGNIN_ACTIVITY=1; private CallbackContext cb; /** * strings for actions from the plugin */ public static final String PLAY_SERVICES_MESSAGE="com.intel.googleplayservices.action"; public static final String PLAY_SERVICES_LOGIN="com.intel.googleplayservices.login"; public static final String PLAY_SERVICES_LOGOUT="com.intel.googleplayservices.logout"; private static int REQUEST_ACHIEVEMENTS=1001; private static int REQUEST_LEADERBOARD=1002; private Activity mainActivity; private GoogleApiClient mGoogleApiClient; GamesOptions mGamesApiOptions = GamesOptions.builder().build(); @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize(cordova, webView); mainActivity = cordova.getActivity(); getApiClient(); } protected GoogleApiClient getApiClient(){ if(!isSignedIn()){ mGoogleApiClient = new GoogleApiClient.Builder(mainActivity) .addApi(Games.API, mGamesApiOptions) .addScope(Games.SCOPE_GAMES) .build(); mGoogleApiClient.connect(); } return mGoogleApiClient; } public boolean isSignedIn() { return mGoogleApiClient != null && mGoogleApiClient.isConnected(); } @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { String intentAction=""; // Check for compatible Google Play services APK if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this.cordova.getActivity()) != 0) { // Google Play Services is missing, return error Log.e(TAG, "Google Play Services are unavailable"); callbackContext.error(GGSError.UNAVAILABLE); return true; } else { Log.d(TAG, "** Google Play Services are available **"); } if (playGamesService == null) { playGamesService = new GooglePlayGamesService(); } cb=callbackContext; if(action.equals("authenticate")){ if(isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } getApiClient();//Make the connection here intentAction=PLAY_SERVICES_LOGIN; Context context=this.cordova.getActivity().getApplicationContext(); // Intent intent=new Intent(context,GooglePlayGamesService.class); intent.putExtra(PLAY_SERVICES_MESSAGE, intentAction); cordova.startActivityForResult(this, intent, SIGNIN_ACTIVITY); return true; } else if(action.equals("logout")) { if(mGoogleApiClient!=null||mGoogleApiClient.isConnected()){ getApiClient().disconnect(); } cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } else if(action.equals("achievements")){ if(!isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.ERROR,"1")); return true; } cordova.startActivityForResult(this,Games.Achievements.getAchievementsIntent(getApiClient()), REQUEST_ACHIEVEMENTS); return true; } else if(action.equals("addAchievement")){ if(!isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.ERROR,"1")); return true; } if(args.length()==0) return false; String achievementId=""; try { achievementId=args.get(0).toString(); } catch (JSONException e) { // TODO Auto-generated catch block return false; } Games.Achievements.unlock(getApiClient(), achievementId); cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } else if(action.equals("incrementAchievement")){ if(!isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.ERROR,"1")); return true; } if(args.length()==0) return false; String achievementId=""; int value=0; try { achievementId=args.get(0).toString(); value=Integer.parseInt(args.get(1).toString()); } catch (JSONException e) { // TODO Auto-generated catch block return false; } Games.Achievements.increment(getApiClient(), achievementId, value); cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } else if(action.equals("showLeaderboard")) { if(!isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.ERROR,"1")); return true; } if(args.length()==0) return false; String leaderboardId=""; try { leaderboardId=args.get(0).toString(); } catch (JSONException e) { // TODO Auto-generated catch block return false; } cordova.startActivityForResult(this,Games.Leaderboards.getLeaderboardIntent(getApiClient(), leaderboardId), REQUEST_LEADERBOARD); } else if(action.equals("updateLeaderboardScore")){ if(!isSignedIn()){ cb.sendPluginResult(new PluginResult(PluginResult.Status.ERROR,"1")); return true; } if(args.length()==0) return false; String leaderboardId=""; Long score; try { leaderboardId=args.get(0).toString(); score=Long.parseLong(args.get(1).toString()); } catch (JSONException e) { // TODO Auto-generated catch block return false; } Games.Leaderboards.submitScore(getApiClient(), leaderboardId, score); cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } else if(action.equals("connect")) { cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,"-1")); return true; } return true; } public void onActivityResult(int requestCode, int resultCode, Intent data) { cb.sendPluginResult(new PluginResult(PluginResult.Status.OK,Integer.toString(resultCode))); } } // A simple static error handler, prevent us messing up string names manually final class GGSError { // When Google Play is not installed on device return this error public static String UNAVAILABLE = "UNAVAILABLE"; }