Skip to content

Instantly share code, notes, and snippets.

@acidjazz
Created June 18, 2013 18:22
Show Gist options
  • Save acidjazz/5807923 to your computer and use it in GitHub Desktop.
Save acidjazz/5807923 to your computer and use it in GitHub Desktop.
//
// FacebookConnect.java
//
// Created by Olivier Louvignes on 2012-07-20.
//
// Copyright 2012 Olivier Louvignes. All rights reserved.
// MIT Licensed
package org.apache.cordova.plugins;
import org.apache.cordova.api.*;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import com.facebook.android.*;
import com.facebook.android.Facebook.*;
@SuppressWarnings("deprecation")
public class FacebookConnect extends CordovaPlugin {
private final String CLASS = "FacebookConnect";
private String appId;
private Facebook _facebook;
private AuthorizeDialogListener authorizeDialogListener;
//private final Handler handler = new Handler();
public Facebook getFacebook() {
if(this.appId == null) {
Log.e(CLASS, "ERROR: You must provide a non-empty appId.");
}
if(this._facebook == null) {
this._facebook = new Facebook(this.appId);
}
return _facebook;
}
//@Override
public PluginResult execute(final String action, final JSONArray args, final String callbackId) {
PluginResult pluginResult = new PluginResult(PluginResult.Status.INVALID_ACTION, "Unsupported operation: " + action);
try {
if(action.equals("initWithAppId")) pluginResult = this.initWithAppId(args, callbackId);
else if(action.equals("login")) pluginResult = this.login(args, callbackId);
else if(action.equals("requestWithGraphPath")) pluginResult = this.requestWithGraphPath(args, callbackId);
else if(action.equals("dialog")) pluginResult = this.dialog(args, callbackId);
else if(action.equals("logout")) pluginResult = this.logout(args, callbackId);
} catch (MalformedURLException e) {
e.printStackTrace();
pluginResult = new PluginResult(PluginResult.Status.MALFORMED_URL_EXCEPTION);
} catch (IOException e) {
e.printStackTrace();
pluginResult = new PluginResult(PluginResult.Status.IO_EXCEPTION);
} catch (JSONException e) {
e.printStackTrace();
pluginResult = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
return pluginResult;
}
/**
* Cordova interface to initialize the appId
*
* @param args
* @param callbackId
* @return PluginResult
* @throws JSONException
*/
public PluginResult initWithAppId(final JSONArray args, final String callbackId) throws JSONException {
Log.d(CLASS, "initWithAppId()");
JSONObject params = args.getJSONObject(0);
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
JSONObject result = new JSONObject();
this.appId = params.getString("appId");
Facebook facebook = this.getFacebook();
result.put("appId", this.appId);
// Check for any stored session update Facebook session information
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext());
String accessToken = prefs.getString("access_token", null);
Long accessExpires = prefs.getLong("access_expires", 0);
if(accessToken != null) facebook.setAccessToken(accessToken);
if(accessExpires != 0) facebook.setAccessExpires(accessExpires);
result.put("accessToken", accessToken);
result.put("expirationDate", accessExpires);
pluginResult = new PluginResult(PluginResult.Status.OK, result);
this.success(pluginResult, callbackId);
return pluginResult;
}
/**
* Cordova interface to perform a login
*
* @param args
* @param callbackId
* @return PluginResult
* @throws JSONException
* @throws MalformedURLException
* @throws IOException
*/
public PluginResult login(final JSONArray args, final String callbackId) throws JSONException, MalformedURLException, IOException {
Log.d(CLASS, "login() :" + args.toString());
JSONObject params = args.getJSONObject(0);
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
if(params.has("appId")) this.appId = params.getString("appId");
Facebook facebook = this.getFacebook();
// Check for any stored session update Facebook session information
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext());
String accessToken = prefs.getString("access_token", null);
Long accessExpires = prefs.getLong("access_expires", 0);
if(accessToken != null) facebook.setAccessToken(accessToken);
if(accessExpires != 0) facebook.setAccessExpires(accessExpires);
if(!this.getFacebook().isSessionValid()) {
JSONArray permissionsArray = (JSONArray)params.get("permissions");
final String[] permissions = new String[permissionsArray.length()];
for (int i=0; i < permissionsArray.length(); i++) {
permissions[i] = permissionsArray.getString(i);
}
final FacebookConnect me = this;
this.authorizeDialogListener = new AuthorizeDialogListener(me, callbackId);
this.cordova.setActivityResultCallback(this);
Runnable runnable = new Runnable() {
public void run() {
me.getFacebook().authorize(me.cordova.getActivity(), permissions, me.authorizeDialogListener);
};
};
pluginResult.setKeepCallback(true);
this.cordova.getActivity().runOnUiThread(runnable);
} else {
JSONObject result = new JSONObject(facebook.request("/me"));
result.put("accessToken", accessToken);
result.put("expirationDate", accessExpires);
Log.d(CLASS, "login::result " + result.toString());
pluginResult = new PluginResult(PluginResult.Status.OK, result);
}
return pluginResult;
}
/**
* Cordova interface to perfom a graph request
*
* @param args
* @param callbackId
* @return PluginResult
* @throws JSONException
* @throws FileNotFoundException
* @throws MalformedURLException
* @throws IOException
*/
public PluginResult requestWithGraphPath(final JSONArray args, final String callbackId) throws JSONException, FileNotFoundException, MalformedURLException, IOException {
Log.d(CLASS, "requestWithGraphPath() :" + args.toString());
JSONObject params = args.getJSONObject(0);
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
Facebook facebook = this.getFacebook();
String path = params.has("path") ? params.getString("path") : "me";
JSONObject optionsObject = (JSONObject)params.get("options");
final Bundle options = new Bundle();
Iterator<?> keys = optionsObject.keys();
while( keys.hasNext() ){
String key = (String)keys.next();
options.putString(key, optionsObject.getString(key));
//if(optionsObject.get(key) instanceof JSONObject)
}
String httpMethod = params.has("httpMethod") ? params.getString("httpMethod") : "GET";
JSONObject result = new JSONObject(facebook.request(path, options, httpMethod));
Log.d(CLASS, "requestWithGraphPath::result " + result.toString());
pluginResult = new PluginResult(PluginResult.Status.OK, result);
return pluginResult;
}
/**
* Cordova interface to display a dialog
*
* @param args
* @param callbackId
* @return PluginResult
* @throws JSONException
* @throws FileNotFoundException
* @throws MalformedURLException
* @throws IOException
*/
public PluginResult dialog(final JSONArray args, final String callbackId) throws JSONException, FileNotFoundException, MalformedURLException, IOException {
Log.d(CLASS, "dialog() :" + args.toString());
JSONObject params = args.getJSONObject(0);
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
final String method = params.has("method") ? params.getString("method") : "feed";
JSONObject optionsObject = (JSONObject)params.get("params");
final Bundle options = new Bundle();
Iterator<?> keys = optionsObject.keys();
while( keys.hasNext() ){
String key = (String)keys.next();
options.putString(key, optionsObject.getString(key));
//if(optionsObject.get(key) instanceof JSONObject)
}
final FacebookConnect me = this;
Runnable runnable = new Runnable() {
public void run() {
me.getFacebook().dialog(me.cordova.getActivity().getApplicationContext(), method, options, new RegularDialogListener(me, callbackId));
};
};
pluginResult.setKeepCallback(true);
this.cordova.getActivity().runOnUiThread(runnable);
return pluginResult;
}
/**
* Cordova interface to logout from Facebook
*
* @param args
* @param callbackId
* @return PluginResult
* @throws JSONException
* @throws MalformedURLException
* @throws IOException
*/
public PluginResult logout(final JSONArray args, final String callbackId) throws JSONException, MalformedURLException, IOException {
Log.d(CLASS, "logout() :" + args.toString());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext());
prefs.edit().remove("access_expires").commit();
prefs.edit().remove("access_token").commit();
this.getFacebook().logout(this.cordova.getActivity().getApplicationContext());
return new PluginResult(PluginResult.Status.OK);
}
//@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
this.getFacebook().authorizeCallback(requestCode, resultCode, data);
//this.webView.sendJavascript("window.alert('test')"); //@todo not working :(
}
/**
* RegularDialogListener
*/
class AuthorizeDialogListener implements DialogListener {
private Facebook facebook;
private CordovaInterface cordova;
private String callbackId;
private FacebookConnect source;
public AuthorizeDialogListener(FacebookConnect me, final String callbackId) {
super();
this.source = me;
this.facebook = me.getFacebook();
this.cordova = me.cordova;
this.callbackId = callbackId;
}
//@Override
public void onComplete(Bundle values) {
Log.d(CLASS, "AuthorizeDialogListener::onComplete() " + values.toString());
// Update session information
final String accessToken = this.facebook.getAccessToken();
final long accessExpires = this.facebook.getAccessExpires();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext());
prefs.edit().putString("access_token", accessToken).commit();
prefs.edit().putLong("access_expires", accessExpires).commit();
final AuthorizeDialogListener me = this;
Thread thread = new Thread(new Runnable() {
public void run() {
PluginResult pluginResult = new PluginResult(PluginResult.Status.ERROR, "UnknownError");
try {
JSONObject result = new JSONObject(me.facebook.request("/me"));
result.put("accessToken", accessToken);
result.put("expirationDate", accessExpires);
Log.d(CLASS, "AuthorizeDialogListener::result " + result.toString());
pluginResult = new PluginResult(PluginResult.Status.OK, result);
} catch (MalformedURLException e) {
pluginResult = new PluginResult(PluginResult.Status.ERROR, "MalformedURLException");
e.printStackTrace();
} catch (JSONException e) {
pluginResult = new PluginResult(PluginResult.Status.ERROR, "JSONException");
e.printStackTrace();
} catch (IOException e) {
pluginResult = new PluginResult(PluginResult.Status.ERROR, "JSONException");
e.printStackTrace();
}
me.source.success(pluginResult, callbackId);
}
});
thread.start();
}
//@Override
public void onFacebookError(FacebookError e) {
Log.d(CLASS, "AuthorizeDialogListener::onFacebookError() " + e.getMessage());
JSONObject result = new JSONObject();
try { result.put("error", 1); result.put("message", e.getMessage()); } catch (JSONException ex) {}
this.source.error(result, this.callbackId);
}
//@Override
public void onError(DialogError e) {
Log.d(CLASS, "AuthorizeDialogListener::onError() " + e.getMessage());
JSONObject result = new JSONObject();
try { result.put("error", 1); result.put("message", e.getMessage()); } catch (JSONException ex) {}
this.source.error(result, this.callbackId);
}
//@Override
public void onCancel() {
Log.d(CLASS, "AuthorizeDialogListener::onCancel()");
JSONObject result = new JSONObject();
try { result.put("cancelled", 1); } catch (JSONException e) {}
this.source.error(result, callbackId);
}
}
/**
* RegularDialogListener
*/
class RegularDialogListener implements DialogListener {
//private Facebook facebook;
//private CordovaInterface cordova;
private String callbackId;
private FacebookConnect source;
public RegularDialogListener(FacebookConnect me, final String callbackId) {
super();
this.source = me;
//this.facebook = me.getFacebook();
//this.cordova = me.cordova;
this.callbackId = callbackId;
}
//@Override
public void onComplete(Bundle values) {
Log.d(CLASS, "RegularDialogListener::onComplete() " + values.toString());
JSONObject result = new JSONObject();
Iterator<?> keys = values.keySet().iterator();
while( keys.hasNext() ){
String key = (String)keys.next();
try {
result.put(key, values.get(key));
} catch (JSONException e) {
e.printStackTrace();
}
}
PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, result);
pluginResult.setKeepCallback(false);
this.source.success(pluginResult, this.callbackId);
}
//@Override
public void onFacebookError(FacebookError e) {
Log.d(CLASS, "RegularDialogListener::onFacebookError() " + e.getMessage());
JSONObject result = new JSONObject();
try { result.put("error", 1); result.put("message", e.getMessage()); } catch (JSONException ex) {}
this.source.error(result, this.callbackId);
}
//@Override
public void onError(DialogError e) {
Log.d(CLASS, "RegularDialogListener::onError() " + e.getMessage());
JSONObject result = new JSONObject();
try { result.put("error", 1); result.put("message", e.getMessage()); } catch (JSONException ex) {}
this.source.error(result, this.callbackId);
}
//@Override
public void onCancel() {
Log.d(CLASS, "RegularDialogListener::onCancel()");
JSONObject result = new JSONObject();
try { result.put("cancelled", 1); } catch (JSONException e) {}
this.source.error(result, this.callbackId);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment