package com.xda.one.api.retrofit; import com.xda.one.api.inteface.ThreadClient; import com.xda.one.api.misc.Consumer; import com.xda.one.api.misc.EventBus; import com.xda.one.api.misc.Result; import com.xda.one.api.model.interfaces.UnifiedThread; import com.xda.one.api.model.request.RequestThread; import com.xda.one.api.model.request.RequestThreadSubscription; import com.xda.one.api.model.response.container.ResponseUnifiedThreadContainer; import com.xda.one.constants.XDAConstants; import com.xda.one.event.thread.ThreadSubscriptionChangedEvent; import com.xda.one.event.thread.ThreadSubscriptionChangingFailedEvent; import com.xda.one.util.Utils; import android.content.Context; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; import retrofit.http.Body; import retrofit.http.DELETE; import retrofit.http.GET; import retrofit.http.Header; import retrofit.http.POST; import retrofit.http.Query; import static com.xda.one.api.retrofit.RetrofitClient.getAuthToken; public class RetrofitThreadClient implements ThreadClient { private static ThreadClient sThreadClient; private final ThreadAPI mThreadAPI; private final EventBus mBus; private RetrofitThreadClient(final Context context) { mThreadAPI = RetrofitClient.getRestBuilder(context, XDAConstants.ENDPOINT_URL) .build() .create(ThreadAPI.class); mBus = new EventBus(); } public static ThreadClient getClient(final Context context) { if (sThreadClient == null) { sThreadClient = new RetrofitThreadClient(context); } return sThreadClient; } @Override public EventBus getBus() { return mBus; } @Override public ResponseUnifiedThreadContainer getThreads(final int forumId, final int page) { try { return mThreadAPI.getThreads(getAuthToken(), String.valueOf(forumId), page); } catch (RetrofitError error) { Utils.handleRetrofitErrorQuietly(error); } return null; } @Override public ResponseUnifiedThreadContainer getParticipatedThreads(final int page) { try { return mThreadAPI.getParticipatedThreads(getAuthToken(), page); } catch (RetrofitError error) { Utils.handleRetrofitErrorQuietly(error); } return null; } @Override public ResponseUnifiedThreadContainer getSubscribedThreads(final int page) { try { return mThreadAPI.getSubscribedThreads(getAuthToken(), page); } catch (RetrofitError error) { Utils.handleRetrofitErrorQuietly(error); } return null; } @Override public void createThread(final int forumId, final String title, final String message, final Consumer<Result> runnable) { final RequestThread thread = new RequestThread(forumId, title, message); mThreadAPI.createThread(getAuthToken(), thread, new Callback<Response>() { @Override public void success(Response response, Response response2) { final Result result = Result.parseResultFromResponse(response); if (Result.isSuccess(result)) { runnable.run(result); } } @Override public void failure(RetrofitError error) { Utils.handleRetrofitErrorQuietly(error); } }); } @Override public void subscribeAsync(final UnifiedThread unifiedThread) { final RequestThreadSubscription subs = new RequestThreadSubscription( unifiedThread.getThreadId()); mThreadAPI.subscribe(getAuthToken(), subs, new SubscribeCallback(unifiedThread, true)); } @Override public void unsubscribeAsync(final UnifiedThread unifiedThread) { final RequestThreadSubscription subs = new RequestThreadSubscription( unifiedThread.getThreadId()); mThreadAPI.unsubscribe(getAuthToken(), subs.getThreadId(), new SubscribeCallback( unifiedThread, false)); } @Override public void toggleSubscribeAsync(final UnifiedThread unifiedThread) { if (unifiedThread.isSubscribed()) { unsubscribeAsync(unifiedThread); } else { subscribeAsync(unifiedThread); } } public static interface ThreadAPI { @GET("/threads") public ResponseUnifiedThreadContainer getThreads(@Header("Cookie") final String cookie, @Query("forumid") final String forumId, @Query("page") final int page); @GET("/threads/participated") public ResponseUnifiedThreadContainer getParticipatedThreads( @Header("Cookie") final String cookie, @Query("page") final int page); @GET("/threads/subscribed") public ResponseUnifiedThreadContainer getSubscribedThreads(@Header("Cookie") final String cookie, @Query("page") final int page); @POST("/threads/new") public void createThread(@Header("Cookie") final String cookie, @Body final RequestThread thread, final Callback<Response> response); @POST("/threads/subscribe") public void subscribe(@Header("Cookie") final String cookie, @Body final RequestThreadSubscription subscription, final Callback<Response> response); @DELETE("/threads/unsubscribe") public void unsubscribe(@Header("Cookie") final String cookie, @Query("threadid") final String threadid, final Callback<Response> response); } private class SubscribeCallback implements Callback<Response> { private final UnifiedThread mUnifiedThread; private final boolean mNewValue; public SubscribeCallback(final UnifiedThread unifiedThread, final boolean newValue) { mUnifiedThread = unifiedThread; mNewValue = newValue; } @Override public void success(final Response response, final Response response2) { final Result result = Result.parseResultFromResponse(response); if (Result.isSuccess(result)) { mBus.post(new ThreadSubscriptionChangedEvent(mUnifiedThread, mNewValue)); } else { mBus.post(new ThreadSubscriptionChangingFailedEvent(mUnifiedThread)); } } @Override public void failure(RetrofitError error) { Utils.handleRetrofitErrorQuietly(error); mBus.post(new ThreadSubscriptionChangingFailedEvent(mUnifiedThread)); } } }