package org.wikipedia.edit.preview;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.mwapi.MwException;
import org.wikipedia.dataclient.retrofit.MwCachedService;
import org.wikipedia.dataclient.retrofit.WikiCachedService;
import org.wikipedia.page.PageTitle;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
class EditPreviewClient {
@NonNull private final WikiCachedService<Service> cachedService = new MwCachedService<>(Service.class);
Call<EditPreview> request(@NonNull WikiSite wiki, @NonNull PageTitle title,
@NonNull String wikitext, @NonNull Callback cb) {
Service service = cachedService.service(wiki);
return request(service, title, wikitext, cb);
}
@VisibleForTesting Call<EditPreview> request(@NonNull Service service, @NonNull PageTitle title,
@NonNull String wikitext,
@NonNull final Callback cb) {
Call<EditPreview> call = service.previewEdit(title.getPrefixedText(), wikitext);
call.enqueue(new retrofit2.Callback<EditPreview>() {
@Override
public void onResponse(Call<EditPreview> call, Response<EditPreview> response) {
if (response.body().success() && response.body().hasPreviewResult()) {
cb.success(call, response.body().result());
} else if (response.body().hasError()) {
cb.failure(call, new MwException(response.body().getError()));
} else {
cb.failure(call, new IOException("An unknown error occurred."));
}
}
@Override
public void onFailure(Call<EditPreview> call, Throwable t) {
cb.failure(call, t);
}
});
return call;
}
public interface Callback {
void success(@NonNull Call<EditPreview> call, @NonNull String preview);
void failure(@NonNull Call<EditPreview> call, @NonNull Throwable caught);
}
@VisibleForTesting interface Service {
@FormUrlEncoded
@POST("w/api.php?action=parse&format=json&formatversion=2§ionpreview=true&pst=true"
+ "&mobileformat=true&prop=text")
Call<EditPreview> previewEdit(@NonNull @Field("title") String title,
@NonNull @Field("text") String text);
}
}