package com.sromku.simple.fb.actions; import com.facebook.AccessToken; import com.facebook.FacebookRequestError; import com.facebook.GraphRequest; import com.facebook.GraphRequestAsyncTask; import com.facebook.GraphResponse; import com.facebook.HttpMethod; import com.sromku.simple.fb.Permission; import com.sromku.simple.fb.SessionManager; import com.sromku.simple.fb.entities.Publishable; import com.sromku.simple.fb.listeners.OnLoginListener; import com.sromku.simple.fb.listeners.OnPublishListener; import com.sromku.simple.fb.utils.Errors; import com.sromku.simple.fb.utils.Logger; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class PublishAction extends AbstractAction { private OnPublishListener mOnPublishListener; private Publishable mPublishable; private String mTarget = "me"; public PublishAction(SessionManager sessionManager) { super(sessionManager); } public void setPublishable(Publishable publishable) { mPublishable = publishable; } public void setTarget(String target) { mTarget = target; } public void setOnPublishListener(OnPublishListener onPublishListener) { mOnPublishListener = onPublishListener; } @Override protected void executeImpl() { if (sessionManager.isLogin()) { if (!sessionManager.hasPendingRequest()) { // if we defined the publish permission /* * We need also add one more check of next case: - if we gave * extended permissions in runtime, but we don't have these * permissions in the configuration */ final String neededPermission = mPublishable.getPermission().getValue(); if (mOnPublishListener != null) { mOnPublishListener.onThinking(); } /* * Check if session to facebook has needed publish * permission. If not, we will ask user for this permission. */ if (!sessionManager.hasAccepted(neededPermission)) { sessionManager.getLoginCallback().loginListener = new OnLoginListener() { @Override public void onException(Throwable throwable) { returnFail(throwable != null ? String.valueOf(throwable.getMessage()) : "Got exception on asking for publish permissions"); } @Override public void onFail(String reason) { returnFail(reason); } @Override public void onLogin(String accessToken, List<Permission> acceptedPermissions, List<Permission> declinedPermissions) { if (sessionManager.hasAccepted(neededPermission)) { publishImpl(mPublishable, mOnPublishListener); } } @Override public void onCancel() { returnFail("User canceled the publish dialog"); } private void returnFail(String reason) { Logger.logError(PublishAction.class, reason, null); if (mOnPublishListener != null) { mOnPublishListener.onFail(reason); } } }; // build the needed permission for this action and request Permission permission = mPublishable.getPermission(); List<String> permissions = new ArrayList<String>(); permissions.add(permission.getValue()); sessionManager.requestPublishPermissions(permissions); } else { publishImpl(mPublishable, mOnPublishListener); } } else { return; } } else { if (mOnPublishListener != null) { String reason = Errors.getError(Errors.ErrorMsg.LOGIN); Logger.logError(PublishAction.class, reason, null); mOnPublishListener.onFail(reason); } } } private void publishImpl(Publishable publishable, final OnPublishListener onPublishListener) { AccessToken accessToken = sessionManager.getAccessToken(); GraphRequest request = new GraphRequest(accessToken, mTarget + "/" + publishable.getPath(), publishable.getBundle(), HttpMethod.POST, new GraphRequest.Callback() { @Override public void onCompleted(GraphResponse response) { FacebookRequestError error = response.getError(); if (error != null) { Logger.logError(GetAction.class, "Failed to publish", error.getException()); if (onPublishListener != null) { onPublishListener.onException(error.getException()); } } else { if (response.getRawResponse() == null) { Logger.logError(GetAction.class, "The response GraphObject has null value. Response=" + response.toString(), null); } else { if (onPublishListener != null) { JSONObject jsonObject = response.getJSONObject(); String id = jsonObject.optString("id"); onPublishListener.onComplete(id); } } } } }); request.setVersion(configuration.getGraphVersion()); GraphRequestAsyncTask task = new GraphRequestAsyncTask(request); task.execute(); } }