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

Reply via email to