package org.wikipedia.random; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import com.google.gson.JsonParseException; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.dataclient.restbase.page.RbPageSummary; import org.wikipedia.dataclient.retrofit.RbCachedService; import org.wikipedia.dataclient.retrofit.WikiCachedService; import org.wikipedia.page.PageTitle; import org.wikipedia.util.log.L; import retrofit2.Call; import retrofit2.Response; import retrofit2.http.GET; import retrofit2.http.Headers; import static org.wikipedia.Constants.ACCEPT_HEADER_SUMMARY; public class RandomSummaryClient { @NonNull private final WikiCachedService<Service> cachedService = new RbCachedService<>(Service.class); public Call<RbPageSummary> request(@NonNull WikiSite wiki, @NonNull Callback cb) { return request(cachedService.service(wiki), wiki, cb); } @VisibleForTesting Call<RbPageSummary> request(@NonNull Service service, @NonNull final WikiSite wiki, @NonNull final Callback cb) { Call<RbPageSummary> call = service.get(); call.enqueue(new retrofit2.Callback<RbPageSummary>() { @Override public void onResponse(@NonNull Call<RbPageSummary> call, @NonNull Response<RbPageSummary> response) { if (response.body() == null) { cb.onError(call, new JsonParseException("Response missing required field(s)")); return; } RbPageSummary item = response.body(); PageTitle title = new PageTitle(null, item.getTitle(), wiki); cb.onSuccess(call, title); } @Override public void onFailure(@NonNull Call<RbPageSummary> call, @NonNull Throwable t) { L.w("Failed to get random page title/summary", t); cb.onError(call, t); } }); return call; } @VisibleForTesting interface Service { @Headers(ACCEPT_HEADER_SUMMARY) @GET("page/random/summary") @NonNull Call<RbPageSummary> get(); } public interface Callback { void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull PageTitle title); void onError(@NonNull Call<RbPageSummary> call, @NonNull Throwable t); } }