BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/325519
Change subject: Add UI for abusefilter cases in description editing ...................................................................... Add UI for abusefilter cases in description editing This is a minimal UI for when abusefilters are triggered. Unlike for page edits, this only shows a validation error text below the edit text field. No special layout or icons here. Use uselang parameter to get localized abusefilter error messages. Bug: T150704 Change-Id: I90f847acffbe521e205fc25e7c54f78c09ca2632 --- M app/src/main/java/org/wikipedia/descriptions/DescriptionEditClient.java M app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.java M app/src/main/java/org/wikipedia/server/mwapi/MwServiceError.java M app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.java 4 files changed, 39 insertions(+), 18 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/19/325519/1 diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditClient.java b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditClient.java index 268e81b..52cb8e5 100644 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditClient.java +++ b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditClient.java @@ -23,13 +23,15 @@ class DescriptionEditClient { private static final String ANONYMOUS_TOKEN = "+\\"; private static final WikiSite WIKI_DATA_SITE = new WikiSite("www.wikidata.org", ""); + private static final String ABUSEFILTER_DISALLOWED = "abusefilter-disallowed"; + private static final String ABUSEFILTER_WARNING = "abusefilter-warning"; @NonNull private final MwCachedService<Service> cachedService = new MwCachedService<>(Service.class); public interface Callback { void success(@NonNull Call<DescriptionEdit> call); - void abusefilter(@NonNull Call<DescriptionEdit> call, boolean disallowed); + void abusefilter(@NonNull Call<DescriptionEdit> call, String info); void failure(@NonNull Call<DescriptionEdit> call, @NonNull Throwable caught); } @@ -56,7 +58,7 @@ final boolean loggedIn, @NonNull final Callback cb) { - Call<DescriptionEdit> call = service.edit(languageCode, languageCode + "wiki", + Call<DescriptionEdit> call = service.edit(languageCode, languageCode, languageCode + "wiki", pageTitle.getPrefixedText(), description, ANONYMOUS_TOKEN, null, /* TODO: loggedIn ? "user" : */ null); call.enqueue(new retrofit2.Callback<DescriptionEdit>() { @@ -91,10 +93,10 @@ private void handleError(@NonNull Call<DescriptionEdit> call, @NonNull DescriptionEdit body, @NonNull Callback cb) { MwServiceError error = body.getError(); - if (error != null && error.hasMessageName("abusefilter-disallowed")) { - cb.abusefilter(call, true); - } else if (error != null && error.hasMessageName("abusefilter-warning")) { - cb.abusefilter(call, false); + if (error != null && error.hasMessageName(ABUSEFILTER_DISALLOWED)) { + cb.abusefilter(call, error.getMessageHtml(ABUSEFILTER_DISALLOWED)); + } else if (error != null && error.hasMessageName(ABUSEFILTER_WARNING)) { + cb.abusefilter(call, error.getMessageHtml(ABUSEFILTER_WARNING)); } else { String info = body.info(); RuntimeException exception = new RuntimeException(info != null @@ -107,6 +109,7 @@ @FormUrlEncoded @POST("w/api.php?action=wbsetdescription&format=json") Call<DescriptionEdit> edit(@NonNull @Field("language") String language, + @NonNull @Field("uselang") String useLang, @NonNull @Field("site") String site, @NonNull @Field("title") String title, @NonNull @Field("value") String newDescription, diff --git a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.java b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.java index 74e9e9b..45147d6 100644 --- a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.java +++ b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditFragment.java @@ -125,12 +125,9 @@ } @Override public void abusefilter(@NonNull Call<DescriptionEdit> call, - boolean disallowed) { - if (disallowed) { - // TODO: go to ABUSE_FILTER_DISALLOWED fragment - } else { - // TODO: go to ABUSE_FILTER_WARNING fragment - } + String info) { + editView.setSaveState(false); + editView.setError(info); } @Override public void failure(@NonNull Call<DescriptionEdit> call, diff --git a/app/src/main/java/org/wikipedia/server/mwapi/MwServiceError.java b/app/src/main/java/org/wikipedia/server/mwapi/MwServiceError.java index 84d98ce..3f882f2 100644 --- a/app/src/main/java/org/wikipedia/server/mwapi/MwServiceError.java +++ b/app/src/main/java/org/wikipedia/server/mwapi/MwServiceError.java @@ -3,6 +3,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.google.gson.annotations.SerializedName; + import org.wikipedia.server.ServiceError; import java.util.Collections; @@ -42,6 +44,15 @@ return false; } + @Nullable public String getMessageHtml(@NonNull String messageName) { + for (Message msg : messages) { + if (messageName.equals(msg.name)) { + return msg.getHtmlValue(); + } + } + return null; + } + @Override public String toString() { return "MwServiceError{" + "code='" + code + '\'' @@ -52,5 +63,14 @@ private static final class Message { @SuppressWarnings("unused") private String name; + @SuppressWarnings("unused") private MessageHtml html; + + @NonNull private String getHtmlValue() { + return html != null ? html.value : ""; + } + } + + private static class MessageHtml { + @SuppressWarnings("unused") @SerializedName("*") private String value; } } diff --git a/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.java b/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.java index 70ee28f..74c841d 100644 --- a/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.java +++ b/app/src/test/java/org/wikipedia/descriptions/DescriptionEditClientTest.java @@ -41,7 +41,8 @@ Call<DescriptionEdit> call = request(cb); server().takeRequest(); - assertCallbackAbusefilter(call, cb, false); + assertCallbackAbusefilter(call, cb, + "<b>Warning:</b> This action has been automatically identified as harmful.\nUnconstructive edits will be quickly reverted,\nand egregious or repeated unconstructive editing will result in your account or IP address being blocked.\nIf you believe this action to be constructive, you may submit it again to confirm it.\nA brief description of the abuse rule which your action matched is: Possible vandalism by adding badwords or similar trolling words"); } @Test public void testRequestAbusefilterDisallowed() throws Throwable { @@ -51,7 +52,7 @@ Call<DescriptionEdit> call = request(cb); server().takeRequest(); - assertCallbackAbusefilter(call, cb, true); + assertCallbackAbusefilter(call, cb, "This action has been automatically identified as harmful, and therefore disallowed.\nIf you believe your action was constructive, please inform an administrator of what you were trying to do."); } @Test public void testRequestResponseFailure() throws Throwable { @@ -78,17 +79,17 @@ @NonNull Callback cb) { verify(cb).success(eq(call)); //noinspection unchecked - verify(cb, never()).abusefilter(any(Call.class), any(Boolean.class)); + verify(cb, never()).abusefilter(any(Call.class), any(String.class)); //noinspection unchecked verify(cb, never()).failure(any(Call.class), any(Throwable.class)); } private void assertCallbackAbusefilter(@NonNull Call<DescriptionEdit> call, @NonNull Callback cb, - boolean disallowed) { + String expectedMessage) { //noinspection unchecked verify(cb, never()).success(any(Call.class)); - verify(cb).abusefilter(eq(call), eq(disallowed)); + verify(cb).abusefilter(eq(call), eq(expectedMessage)); //noinspection unchecked verify(cb, never()).failure(any(Call.class), any(Throwable.class)); } @@ -99,7 +100,7 @@ //noinspection unchecked verify(cb, never()).success(any(Call.class)); //noinspection unchecked - verify(cb, never()).abusefilter(any(Call.class), any(Boolean.class)); + verify(cb, never()).abusefilter(any(Call.class), any(String.class)); verify(cb).failure(eq(call), isA(throwable)); } -- To view, visit https://gerrit.wikimedia.org/r/325519 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I90f847acffbe521e205fc25e7c54f78c09ca2632 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: BearND <bsitzm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits