Skip to content
Andrew Chen edited this page Jun 15, 2015 · 18 revisions

@RetroFacebook

ref. https://developers.facebook.com/docs/graph-api/reference/v2.3/post

Facebook Android SDK v3

/* make the API call */
new Request(
    session,
    "/{post-id}",
    null,
    HttpMethod.GET,
    new Request.Callback() {
        public void onCompleted(Response response) {
            /* handle the result */
        }
    }
).executeAsync();

Facebook Android SDK v4

GraphRequest.executeBatchAsync(
    new GraphRequestBatch(
        new GraphRequest.newGraphPathRequest(
            accessToken,
            "/{post-id}",
            new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {
                    /* handle the result */
                }
            }
        )
    )
);

ref.

import retrofacebook.v4.RetroFacebook;

@RetroFacebook
abstract class Facebook {

    @RetroFacebook.GET("/{postId}")
    Observable<Post> getPost(@RetroFacebook.Path String postId);

    public static Facebook create() {
        return new RetroFacebook_Facebook();
    }
}
public class RetroFacebook_Facebook extends Facebook {

    @Override
    public Observable<Post> getPost(String postId) {
        return Observable.create(new OnSubscribeGraphResponse(
                new GraphRequest.newGraphPathRequest(
                    AccessToken.getCurrentAccessToken(),
                    "/" + postId, /* GraphRequest.Callback */ null // setCallback
                )
            )
        ).map(response -> LoganSquare.parse(response.getJSONObject().toString(), AutoFacebook_Post.class));
    }

    public class OnSubscribeGraphResponse implements Observable.OnSubscribe<GraphResponse> {
        public GraphRequest request;

        public OnSubscribeGraphResponse(GraphRequest request) {
            this.request = request;
        }

        @Override
        public void call(final Subscriber<? super GraphResponse> sub) {
            if (request != null) {
                request.setCallback(new GraphRequest.Callback() {
                    @Override
                    public void onCompleted(GraphResponse response) {
                        try {
                            FacebookRequestError requestError = response.getError();
                            FacebookException exception = (requestError == null) ? null : requestError.getException();

                            /* move into Observable.map()
                            if (response.getJSONObject() == null && exception == null) {
                                exception = new FacebookException("GraphObjectPagingLoader received neither a result nor an error.");
                            }
                            */

                            if (exception != null) {
                                sub.onError(exception);
                            } else {
                                sub.onNext(response);
                                request = response.getRequestForPagedResults(GraphResponse.PagingDirection.NEXT);

                                if (request != null) {
                                    call(sub);
                                } else {
                                    sub.onCompleted();
                                }
                            }
                        } catch (Throwable e) {
                            sub.onError(e);
                        }
                    }
                });

                GraphRequest.executeBatchAsync(new GraphRequestBatch(request));
            } else {
                sub.onCompleted();
            }
        }
    }
}

@AutoJson

@AutoJson to logansquare.@JsonObject.

@AutoJson.Field to logansquare.@JsonField.

@AutoJson
abstract class Post {
    @Nullable
    public abstract String id();

    @Nullable
    @AutoJson.Field(name = "is_hidden")
    public abstract Boolean isHidden();

    @AutoJson.Builder
    public abstract static class Builder {
        public abstract Builder id(String id);
        public abstract Builder isHidden(Boolean isHidden);

        public abstract Post build();
    }

    public static Builder builder() {
        return new AutoJson_Post.Builder();
    }
}

LoganSquare:

@JsonObject
public class AutoFacebook_Post {
    @JsonField
    String id;
    @JsonField(name = "is_hidden")
    Boolean isHidden;
// ...
}

Appendix: API: me

Facebook Android SDK v4:

GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                   JSONObject object,
                   GraphResponse response) {
                // Application code
            }
        });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

PostTypeConverter:

public static class PostConverter implements TypeConverter<Post> {
    @Override
    public Post parse(JsonParser jsonParser) throws IOException {
        return AutoJson_Post$$JsonObjectMapper._parse(jsonParser);
    }

    @Override
    public void serialize(Post object, String fieldName, boolean writeFieldNameForObject, JsonGenerator jsonGenerator) throws IOException {
        return AutoJson_Person$$JsonObjectMapper._serialize(object, fieldName, writeFieldNameForObject, jsonGenerator);
    }
}

Test environment

  • Robolectric
  • mockito
  • truth, assertj
Clone this wiki locally