package com.sromku.simple.fb.actions;
import android.os.Bundle;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.share.Sharer;
import com.facebook.share.model.ShareOpenGraphAction;
import com.facebook.share.model.ShareOpenGraphContent;
import com.facebook.share.model.ShareOpenGraphObject;
import com.facebook.share.widget.ShareDialog;
import com.sromku.simple.fb.SessionManager;
import com.sromku.simple.fb.entities.Story;
import com.sromku.simple.fb.listeners.OnPublishListener;
import org.json.JSONObject;
import java.util.Iterator;
public class PublishStoryDialogAction extends AbstractAction {
private OnPublishListener mOnPublishListener;
private Story mStory;
public PublishStoryDialogAction(SessionManager sessionManager) {
super(sessionManager);
}
public void setOnPublishListener(OnPublishListener onPublishListener) {
mOnPublishListener = onPublishListener;
}
public void setStory(Story story) {
mStory = story;
}
@Override
protected void executeImpl() {
/*
* Publishing open graph can be in 2 ways:
*
* 1. Publish actions on app-owned objects Means, you as developer of the app define Open
* Graph Object on your server with <meta> tags or you have
* published object to facebook server. This is predefined Object
* and user can't change it.
*
* 2. Publish actions on user-owned objects You didn't add anything to server,
* but you give the user the option to define Object Graph properties from the app and
* publish it.
*
*/
ShareDialog shareDialog = new ShareDialog(sessionManager.getActivity());
ShareOpenGraphContent.Builder builder = new ShareOpenGraphContent.Builder();
// build the content
String objectId = mStory.getStoryObject().getId();
String objectUrl = mStory.getStoryObject().getHostedUrl();
final boolean predefineObject;
if (objectId != null || objectUrl != null) {
predefineObject = true;
} else {
predefineObject = false;
}
String objectType = mStory.getObjectType();
String storyPath = mStory.getPath();
// set the option 1
if (predefineObject) {
// action
ShareOpenGraphAction.Builder actionBuilder = new ShareOpenGraphAction.Builder();
actionBuilder.putString(objectType, objectId != null ? objectId : objectUrl);
Iterator<String> actionProperties = mStory.getStoryAction().getParams().keySet().iterator();
while (actionProperties.hasNext()) {
String property = actionProperties.next();
actionBuilder.putString(property, String.valueOf(mStory.getStoryAction().getParams().get(property)));
}
actionBuilder.setActionType(storyPath);
builder.setAction(actionBuilder.build());
} else {
// object
ShareOpenGraphObject.Builder objectBuilder = new ShareOpenGraphObject.Builder();
// set the option 2
Bundle objectProperties = mStory.getStoryObject().getObjectProperties();
Iterator<String> iterator = objectProperties.keySet().iterator();
String OG = "og:";
while (iterator.hasNext()) {
String property = iterator.next();
objectBuilder.putString(OG + property, String.valueOf(objectProperties.get(property)));
}
// set type
objectBuilder.putString(OG + "type", objectType);
// set custom object properties
JSONObject data = mStory.getStoryObject().getData();
String OG_CUSTOM = configuration.getNamespace() + ":";
if (data != null) {
Iterator<String> keys = data.keys();
while (keys.hasNext()) {
String key = keys.next();
objectBuilder.putString(OG_CUSTOM + key, String.valueOf(data.opt(key)));
}
}
ShareOpenGraphObject object = objectBuilder.build();
// action
ShareOpenGraphAction.Builder actionBuilder = new ShareOpenGraphAction.Builder();
actionBuilder.putObject(objectType, object);
// set custom action properties
Iterator<String> actionProperties = mStory.getStoryAction().getParams().keySet().iterator();
while (actionProperties.hasNext()) {
String property = actionProperties.next();
actionBuilder.putString(property, String.valueOf(mStory.getStoryAction().getParams().get(property)));
}
actionBuilder.setActionType(storyPath);
builder.setAction(actionBuilder.build());
}
// build sharable content
builder.setPreviewPropertyName(objectType);
ShareOpenGraphContent content = builder.build();
if (shareDialog.canShow(content)) {
shareDialog.registerCallback(sessionManager.getCallbackManager(), new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
String postId = result.getPostId();
if (mOnPublishListener != null) {
mOnPublishListener.onComplete(postId);
}
}
@Override
public void onCancel() {
if (mOnPublishListener != null) {
mOnPublishListener.onFail("Canceled by user");
}
}
@Override
public void onError(FacebookException e) {
if (mOnPublishListener != null) {
mOnPublishListener.onFail(e.getMessage());
}
}
});
shareDialog.show(content);
} else {
mOnPublishListener.onFail("Open graph sharing dialog isn't supported");
}
}
}