package com.sromku.simple.fb.actions; import android.os.Bundle; 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.SessionManager; import com.sromku.simple.fb.listeners.OnActionListener; import com.sromku.simple.fb.utils.Errors; import com.sromku.simple.fb.utils.Errors.ErrorMsg; import com.sromku.simple.fb.utils.Logger; import com.sromku.simple.fb.utils.Utils; import org.json.JSONException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GetAction<T> extends AbstractAction { private String mTarget = "me"; // default private String mEdge = null; private OnActionListener<T> mOnActionListener = null; private Cursor<T> mCursor = null; private GraphRequest.Callback mCallback = new GraphRequest.Callback() { @Override public void onCompleted(GraphResponse response) { final OnActionListener<T> actionListener = getActionListener(); FacebookRequestError error = response.getError(); if (error != null) { Logger.logError(GetAction.class, "Failed to get what you have requested", error.getException()); if (actionListener != null) { actionListener.onException(error.getException()); } } else { if (response.getRawResponse() == null) { Logger.logError(GetAction.class, "The response GraphObject has null value. Response=" + response.toString(), null); } else { if (actionListener != null) { T result = null; try { updateCursor(response); result = processResponse(response); } catch (Exception e) { actionListener.onException(e); return; } actionListener.onComplete(result); } } } } }; public GetAction(SessionManager sessionManager) { super(sessionManager); } public void setEdge(String edge) { mEdge = edge; } public void setTarget(String target) { if (target != null) { mTarget = target; } } public void setActionListener(OnActionListener<T> actionListener) { mOnActionListener = actionListener; } @Override protected void executeImpl() { OnActionListener<T> actionListener = getActionListener(); if (sessionManager.isLogin()) { AccessToken accessToken = sessionManager.getAccessToken(); Bundle bundle = updateAppSecretProof(getBundle()); GraphRequest request = new GraphRequest(accessToken, getGraphPath(), bundle, HttpMethod.GET); request.setVersion(configuration.getGraphVersion()); runRequest(request); } else { String reason = Errors.getError(ErrorMsg.LOGIN); Logger.logError(getClass(), reason, null); if (actionListener != null) { actionListener.onFail(reason); } } } /** * Update the params to contain 'appsecret_proof' if it was asked in * SimpleFacebookConfiguration. * * @param bundle * @return Updated bundle * // @see https://developers.facebook.com/docs/graph-api/securing-requests */ private Bundle updateAppSecretProof(Bundle bundle) { if (configuration.useAppsecretProof()) { if (bundle == null) { bundle = new Bundle(); } bundle.putString("appsecret_proof", Utils.encode(configuration.getAppSecret(), sessionManager.getAccessToken().getToken())); } return bundle; } protected String getTarget() { return mTarget; } protected String getGraphPath() { if (mEdge != null) { return mTarget + "/" + mEdge; } return mTarget; } protected Bundle getBundle() { return null; } protected OnActionListener<T> getActionListener() { return mOnActionListener; } /** * It is better to override this method and implement your faster * conversion. */ protected T processResponse(GraphResponse response) { Type type = mOnActionListener.getGenericType(); if (type instanceof ParameterizedType) { Object arrayJson; try { arrayJson = response.getJSONObject().get("data"); } catch (JSONException e) { return null; } T data = Utils.convert(String.valueOf(arrayJson), type); return data; } return Utils.convert(response, type); } void runRequest(GraphRequest request) { OnActionListener<T> actionListener = getActionListener(); request.setCallback(mCallback); GraphRequestAsyncTask task = new GraphRequestAsyncTask(request); task.execute(); if (actionListener != null) { actionListener.onThinking(); } } /** * set next and prev pages requests * * @param response */ private void updateCursor(GraphResponse response) { if (mOnActionListener == null) { return; } if (mCursor == null) { mCursor = new Cursor<T>(GetAction.this); } GraphRequest requestNextPage = response.getRequestForPagedResults(GraphResponse.PagingDirection.NEXT); if (requestNextPage != null) { requestNextPage.setCallback(mCallback); } mCursor.setNextPage(requestNextPage); GraphRequest requestPrevPage = response.getRequestForPagedResults(GraphResponse.PagingDirection.PREVIOUS); if (requestPrevPage != null) { requestPrevPage.setCallback(mCallback); } mCursor.setPrevPage(requestPrevPage); mOnActionListener.setCursor(mCursor); } }