Created
June 18, 2013 18:22
-
-
Save acidjazz/5807923 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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