Mholloway has uploaded a new change for review. https://gerrit.wikimedia.org/r/318161
Change subject: Retrofit edit preview fetching ...................................................................... Retrofit edit preview fetching Change-Id: I653f2c4f68a10001209d7bac8e11226fb0c90ef1 --- D app/src/androidTest/java/org/wikipedia/editing/EditPreviewTaskTest.java A app/src/androidTest/java/org/wikipedia/editing/EditPreviewTest.java A app/src/main/java/org/wikipedia/editing/EditPreview.java A app/src/main/java/org/wikipedia/editing/EditPreviewClient.java M app/src/main/java/org/wikipedia/editing/EditPreviewFragment.java D app/src/main/java/org/wikipedia/editing/EditPreviewTask.java 6 files changed, 155 insertions(+), 125 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/61/318161/1 diff --git a/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTaskTest.java b/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTaskTest.java deleted file mode 100644 index fdbb9ab..0000000 --- a/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTaskTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.wikipedia.editing; - -import android.support.annotation.NonNull; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.wikipedia.WikipediaApp; -import org.wikipedia.dataclient.WikiSite; -import org.wikipedia.page.PageTitle; -import org.wikipedia.testlib.TestLatch; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; - -@SmallTest -@RunWith(AndroidJUnit4.class) -public class EditPreviewTaskTest { - @Test - public void testPreview() throws Throwable { - final PageTitle title = new PageTitle(null, "Test_page_for_app_testing/Section1", WikiSite.forLanguageCode("test")); - long randomTime = System.currentTimeMillis(); - final String wikiText = "== Section 2 ==\n\nEditing section INSERT RANDOM & HERE test at " + randomTime; - - String result = Subject.execute(wikiText, title); - assertThat(result, containsString(String.valueOf(randomTime))); - } - - private static class Subject extends EditPreviewTask { - public static String execute(String wikiText, PageTitle title) { - Subject subject = new Subject(wikiText, title); - subject.execute(); - return subject.await(); - } - - @NonNull private final TestLatch latch = new TestLatch(); - private String result; - - Subject(String wikiText, PageTitle title) { - super(WikipediaApp.getInstance(), wikiText, title); - } - - @Override - public void onFinish(String result) { - super.onFinish(result); - this.result = result; - latch.countDown(); - } - - public String await() { - latch.await(); - return result; - } - } -} diff --git a/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTest.java b/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTest.java new file mode 100644 index 0000000..8367a7b --- /dev/null +++ b/app/src/androidTest/java/org/wikipedia/editing/EditPreviewTest.java @@ -0,0 +1,36 @@ +package org.wikipedia.editing; + +import android.support.annotation.NonNull; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.wikipedia.dataclient.WikiSite; +import org.wikipedia.page.PageTitle; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; + +@RunWith(AndroidJUnit4.class) +public class EditPreviewTest { + @Test + public void testPreview() throws Throwable { + final WikiSite wiki = new WikiSite("test.wikipedia.org"); + final PageTitle title = new PageTitle(null, "Test_page_for_app_testing/Section1", wiki); + final long randomTime = System.currentTimeMillis(); + final String wikiText = "== Section 2 ==\n\nEditing section INSERT RANDOM & HERE test at " + randomTime; + + new EditPreviewClient().previewEdit(wiki, title, wikiText, + new EditPreviewClient.EditPreviewCallback() { + @Override + public void success(@NonNull String preview) { + assertThat(preview, containsString(String.valueOf(randomTime))); + } + + @Override + public void failure(@NonNull Throwable caught) { + throw new RuntimeException(caught); + } + }); + } +} diff --git a/app/src/main/java/org/wikipedia/editing/EditPreview.java b/app/src/main/java/org/wikipedia/editing/EditPreview.java new file mode 100644 index 0000000..8927693 --- /dev/null +++ b/app/src/main/java/org/wikipedia/editing/EditPreview.java @@ -0,0 +1,29 @@ +package org.wikipedia.editing; + +import android.support.annotation.NonNull; + +import com.google.gson.annotations.SerializedName; + +import org.wikipedia.json.annotations.Required; +import org.wikipedia.model.BaseModel; + +public class EditPreview extends BaseModel { + @SuppressWarnings("unused,NullableProblems") @Required @NonNull private Parse parse; + @NonNull protected Parse parse() { + return parse; + } + + static class Parse { + @SuppressWarnings("unused,NullableProblems") @Required @NonNull private Text text; + @NonNull Text text() { + return text; + } + } + + static class Text { + @SuppressWarnings("unused,NullableProblems") @SerializedName("*") @Required @NonNull private String result; + @NonNull String result() { + return result; + } + } +} diff --git a/app/src/main/java/org/wikipedia/editing/EditPreviewClient.java b/app/src/main/java/org/wikipedia/editing/EditPreviewClient.java new file mode 100644 index 0000000..2821b5a --- /dev/null +++ b/app/src/main/java/org/wikipedia/editing/EditPreviewClient.java @@ -0,0 +1,63 @@ +package org.wikipedia.editing; + +import android.support.annotation.NonNull; + +import org.wikipedia.dataclient.WikiSite; +import org.wikipedia.dataclient.retrofit.MwCachedService; +import org.wikipedia.dataclient.retrofit.RetrofitException; +import org.wikipedia.page.PageTitle; +import org.wikipedia.server.restbase.RbPageEndpointsCache; + +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public class EditPreviewClient { + @NonNull private final MwCachedService<Service> cachedService = new MwCachedService<>(Service.class); + @NonNull private final Retrofit retrofit = RbPageEndpointsCache.INSTANCE.getRetrofit(); + + Call<EditPreview> request(@NonNull final WikiSite wiki, @NonNull final PageTitle title, + @NonNull final String wikitext, @NonNull final Callback cb) { + Call<EditPreview> call = cachedService.service(wiki).previewEdit("parse", "json", true, + true, true, "text", title.getPrefixedText(), wikitext); + call.enqueue(new retrofit2.Callback<EditPreview>() { + @Override + public void onResponse(Call<EditPreview> call, Response<EditPreview> response) { + if (response.isSuccessful()) { + cb.success(response.body().parse().text().result(), call); + } else { + cb.failure(RetrofitException.httpError(response, retrofit), call); + } + } + + @Override + public void onFailure(Call<EditPreview> call, Throwable t) { + cb.failure(t, call); + } + }); + return call; + } + + public interface Callback { + void success(@NonNull String preview, Call<EditPreview> call); + void failure(@NonNull Throwable caught, Call<EditPreview> call); + } + + private interface Service { + @FormUrlEncoded + @POST("w/api.php") + @SuppressWarnings("checkstyle:parameternumber") + Call<EditPreview> previewEdit(@NonNull @Field("action") String action, + @NonNull @Field("format") String format, + @Field("sectionpreview") boolean sectionPreview, + @Field("pst") boolean pst, + @Field("mobileformat") boolean mobileformat, + @NonNull @Field("prop") String prop, + @NonNull @Field("title") String title, + @NonNull @Field("text") String text); + + } +} diff --git a/app/src/main/java/org/wikipedia/editing/EditPreviewFragment.java b/app/src/main/java/org/wikipedia/editing/EditPreviewFragment.java index 3095f29..a35570c 100644 --- a/app/src/main/java/org/wikipedia/editing/EditPreviewFragment.java +++ b/app/src/main/java/org/wikipedia/editing/EditPreviewFragment.java @@ -11,7 +11,6 @@ import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,11 +33,14 @@ import org.wikipedia.page.PageTitle; import org.wikipedia.util.L10nUtil; import org.wikipedia.util.UriUtil; +import org.wikipedia.util.log.L; import org.wikipedia.views.ObservableWebView; import java.util.ArrayList; import java.util.List; import java.util.Locale; + +import retrofit2.Call; import static org.wikipedia.util.DeviceUtil.hideSoftKeyboard; @@ -292,27 +294,24 @@ */ public void showPreview(final PageTitle title, final String wikiText) { hideSoftKeyboard(getActivity()); + progressDialog.show(); - new EditPreviewTask(WikipediaApp.getInstance(), wikiText, title) { + new EditPreviewClient().request(parentActivity.getPageTitle().getWikiSite(), title, wikiText, + new EditPreviewClient.Callback() { @Override - public void onBeforeExecute() { - progressDialog.show(); - } - - @Override - public void onFinish(String result) { + public void success(@NonNull String preview, @NonNull Call<EditPreview> call) { if (!progressDialog.isShowing()) { // no longer attached to activity! return; } - displayPreview(result); - previewHTML = result; + displayPreview(preview); + previewHTML = preview; parentActivity.supportInvalidateOptionsMenu(); progressDialog.dismiss(); } @Override - public void onCatch(Throwable caught) { + public void failure(@NonNull Throwable caught, @NonNull Call<EditPreview> call) { if (!progressDialog.isShowing()) { // no longer attached to activity! return; @@ -322,25 +321,27 @@ if (!(caught instanceof ApiException)) { throw new RuntimeException(caught); } - Log.d("Wikipedia", "Caught " + caught.toString()); + L.d("Caught " + caught.toString()); final AlertDialog retryDialog = new AlertDialog.Builder(getActivity()) .setMessage(R.string.error_network_error) - .setPositiveButton(R.string.dialog_message_edit_failed_retry, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - showPreview(title, wikiText); - dialog.dismiss(); - } - }) - .setNegativeButton(R.string.dialog_message_edit_failed_cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }).create(); + .setPositiveButton(R.string.dialog_message_edit_failed_retry, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + showPreview(title, wikiText); + dialog.dismiss(); + } + }) + .setNegativeButton(R.string.dialog_message_edit_failed_cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }).create(); retryDialog.show(); } - }.execute(); + }); } /** diff --git a/app/src/main/java/org/wikipedia/editing/EditPreviewTask.java b/app/src/main/java/org/wikipedia/editing/EditPreviewTask.java deleted file mode 100644 index 5e7bd82..0000000 --- a/app/src/main/java/org/wikipedia/editing/EditPreviewTask.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.wikipedia.editing; - -import android.support.annotation.NonNull; - -import org.mediawiki.api.json.Api; -import org.mediawiki.api.json.ApiException; -import org.mediawiki.api.json.ApiResult; -import org.mediawiki.api.json.RequestBuilder; -import org.wikipedia.WikipediaApp; -import org.wikipedia.dataclient.ApiTask; -import org.wikipedia.page.PageTitle; - -public class EditPreviewTask extends ApiTask<String> { - private final String wikiText; - @NonNull private final PageTitle title; - - public EditPreviewTask(@NonNull WikipediaApp app, String wikiText, @NonNull PageTitle title) { - super(app.getAPIForSite(title.getWikiSite())); - this.wikiText = wikiText; - this.title = title; - } - - @Override - public RequestBuilder buildRequest(Api api) { - return api.action("parse") - .param("sectionpreview", "true") - .param("pst", "true") - .param("mobileformat", "true") - .param("prop", "text") - .param("title", title.getPrefixedText()) - .param("text", wikiText); - } - - @Override - protected ApiResult makeRequest(RequestBuilder builder) throws ApiException { - return builder.post(); - } - - @Override - public String processResult(ApiResult result) throws Throwable { - return result.asObject().optJSONObject("parse").optJSONObject("text").optString("*"); - } -} -- To view, visit https://gerrit.wikimedia.org/r/318161 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I653f2c4f68a10001209d7bac8e11226fb0c90ef1 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Mholloway <mhollo...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits