package com.nostra13.socialsharing.facebook;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.nostra13.socialsharing.Constants;
import com.nostra13.socialsharing.common.AuthListener;
import com.nostra13.socialsharing.facebook.extpack.com.facebook.android.AsyncFacebookRunner;
import com.nostra13.socialsharing.facebook.extpack.com.facebook.android.DialogError;
import com.nostra13.socialsharing.facebook.extpack.com.facebook.android.Facebook;
import com.nostra13.socialsharing.facebook.extpack.com.facebook.android.FacebookError;
/**
* @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
*/
public class FacebookFacade {
private static final String TAG = FacebookFacade.class.getSimpleName();
private Activity context;
private Facebook facebook;
private AsyncFacebookRunner asyncFacebook;
public FacebookFacade(Activity context, String facebookAppId) {
this.context = context;
facebook = new Facebook(facebookAppId);
FacebookSessionStore.restore(facebook, context);
asyncFacebook = new AsyncFacebookRunner(facebook);
}
public boolean isAuthorized() {
return facebook.isSessionValid();
}
public void authorize() {
authorize(null);
}
public void authorize(final AuthListener authListener) {
facebook.authorize(context, Constants.FACEBOOK_PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new FacebookAuthListener() {
@Override
public void onFacebookError(FacebookError e) {
if (authListener != null) authListener.onAuthFail(e.getMessage());
super.onFacebookError(e);
}
@Override
public void onError(DialogError e) {
if (authListener != null) authListener.onAuthFail(e.getMessage());
super.onError(e);
}
@Override
public void onComplete(Bundle values) {
FacebookSessionStore.save(facebook, context);
if (authListener != null) authListener.onAuthSucceed();
super.onComplete(values);
}
});
}
public void logout() {
asyncFacebook.logout(context, new FacebookLogoutListener() {
@Override
public void onComplete(final String response, final Object state) {
super.onComplete(response, state);
FacebookSessionStore.clear(context);
}
});
}
public void publishMessage(String message) {
publishMessage(message, null, null, null);
}
public void publishMessage(String message, String link, String linkName, String linkDescription) {
publishMessage(message, link, linkName, linkDescription, null);
}
public void publishMessage(String message, String link, String linkName, String linkDescription, String pictureUrl) {
publishMessage(message, link, linkName, linkDescription, pictureUrl, null);
}
public void publishMessage(String message, String link, String linkName, String linkDescription, String pictureUrl, Map<String, String> actions) {
Bundle params = new Bundle();
params.putString(RequestParameter.MESSAGE, message);
if (link != null) {
params.putString(RequestParameter.LINK, link);
}
if (linkName != null) {
params.putString(RequestParameter.NAME, linkName);
}
if (linkDescription != null) {
params.putString(RequestParameter.DESCRIPTION, linkDescription);
}
if (pictureUrl != null) {
params.putString(RequestParameter.PICTURE, pictureUrl);
}
if (actions != null) {
params.putString(RequestParameter.ACTIONS, buildActionsString(actions));
}
asyncFacebook.request("me/feed", params, "POST", new FacebookPostListener(), null);
}
private String buildActionsString(Map<String, String> actionsMap) {
JSONObject actionsObject = new JSONObject();
Set<Entry<String, String>> actionEntries = actionsMap.entrySet();
for (Entry<String, String> actionEntry : actionEntries) {
try {
actionsObject.put(RequestParameter.NAME, actionEntry.getKey());
actionsObject.put(RequestParameter.LINK, actionEntry.getValue());
} catch (JSONException e) {
Log.e(TAG, e.getMessage(), e);
}
}
return actionsObject.toString();
}
public void publishImage(byte[] imageData, String caption) {
Bundle params = new Bundle();
params.putString("method", "photos.upload");
params.putString(RequestParameter.CAPTION, caption);
params.putByteArray(RequestParameter.PICTURE, imageData);
asyncFacebook.request(null, params, "POST", new FacebookPostListener(), null);
}
protected static class RequestParameter {
public static final String MESSAGE = "message";
public static final String PICTURE = "picture";
public static final String CAPTION = "caption";
public static final String LINK = "link";
public static final String NAME = "name";
public static final String DESCRIPTION = "description";
public static final String ACTIONS = "actions";
}
}