Niedzielski has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/340688 )

Change subject: Hygiene: move Wikipedia Zero header checks from clients to 
response interceptor
......................................................................

Hygiene: move Wikipedia Zero header checks from clients to response interceptor

Additionally, consider all responses except cached.

In development flavors, disable event logging under settings to avoid
rapid on / off notifications.

Bug: T156917
Change-Id: I7341957e90b286044b34fb61095e7e329a1cd656
---
M app/src/main/java/org/wikipedia/WikipediaApp.java
M app/src/main/java/org/wikipedia/dataclient/mwapi/page/MwPageClient.java
M app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpConnectionFactory.java
A 
app/src/main/java/org/wikipedia/dataclient/okhttp/WikipediaZeroResponseInterceptor.java
M app/src/main/java/org/wikipedia/dataclient/restbase/page/RbPageClient.java
M app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
M app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
M app/src/main/java/org/wikipedia/zero/WikipediaZeroHandler.java
8 files changed, 48 insertions(+), 60 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/88/340688/1

diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.java 
b/app/src/main/java/org/wikipedia/WikipediaApp.java
index d43eca7..185768a 100644
--- a/app/src/main/java/org/wikipedia/WikipediaApp.java
+++ b/app/src/main/java/org/wikipedia/WikipediaApp.java
@@ -142,6 +142,8 @@
     public void onCreate() {
         super.onCreate();
 
+        zeroHandler = new WikipediaZeroHandler(this);
+
         // HockeyApp exception handling interferes with the test runner, so 
enable it only for
         // beta and stable releases
         if (!ReleaseUtil.isPreBetaRelease()) {
@@ -172,8 +174,6 @@
                 .newBuilder(this, OkHttpConnectionFactory.getClient())
                 .build();
         Fresco.initialize(this, config);
-
-        zeroHandler = new WikipediaZeroHandler(this);
 
         // TODO: remove this code after all logged in users also have a system 
account or August 2016.
         AccountUtil.createAccountForLoggedInUser();
@@ -232,8 +232,6 @@
                     wiki.path("api.php"), customHeaders);
             apis.put(cachedApiKey, api);
         }
-
-        api.setHeaderCheckListener(zeroHandler);
         return api;
     }
 
diff --git 
a/app/src/main/java/org/wikipedia/dataclient/mwapi/page/MwPageClient.java 
b/app/src/main/java/org/wikipedia/dataclient/mwapi/page/MwPageClient.java
index 3ef5132..56616a4 100644
--- a/app/src/main/java/org/wikipedia/dataclient/mwapi/page/MwPageClient.java
+++ b/app/src/main/java/org/wikipedia/dataclient/mwapi/page/MwPageClient.java
@@ -45,7 +45,6 @@
             @Override
             public void onResponse(Call<MwQueryPageSummary> call, 
Response<MwQueryPageSummary> response) {
                 if (response.isSuccessful()) {
-                    responseHeaderHandler.onHeaderCheck(response);
                     cb.success(response.body());
                 } else {
                     cb.failure(RetrofitException.httpError(response));
@@ -71,7 +70,6 @@
             @Override
             public void onResponse(Call<MwMobileViewPageLead> call, 
Response<MwMobileViewPageLead> response) {
                 if (response.isSuccessful()) {
-                    responseHeaderHandler.onHeaderCheck(response);
                     cb.success(response.body());
                 } else {
                     cb.failure(RetrofitException.httpError(response));
diff --git 
a/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpConnectionFactory.java
 
b/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpConnectionFactory.java
index d562396..e4b3a05 100644
--- 
a/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpConnectionFactory.java
+++ 
b/app/src/main/java/org/wikipedia/dataclient/okhttp/OkHttpConnectionFactory.java
@@ -57,6 +57,7 @@
                 .addInterceptor(new CommonHeaderRequestInterceptor())
                 .addInterceptor(new DefaultMaxStaleRequestInterceptor())
                 .addInterceptor(new CacheIfErrorInterceptor())
+                .addInterceptor(new 
WikipediaZeroResponseInterceptor(WikipediaApp.getInstance().getWikipediaZeroHandler()))
                 // this interceptor should appear last since it examines the 
final cache and network responses
                 .addInterceptor(new 
ResponseLoggingInterceptor().setLevel(Prefs.getRetrofitLogLevel()))
                 .build();
diff --git 
a/app/src/main/java/org/wikipedia/dataclient/okhttp/WikipediaZeroResponseInterceptor.java
 
b/app/src/main/java/org/wikipedia/dataclient/okhttp/WikipediaZeroResponseInterceptor.java
new file mode 100644
index 0000000..63862f2
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/dataclient/okhttp/WikipediaZeroResponseInterceptor.java
@@ -0,0 +1,27 @@
+package org.wikipedia.dataclient.okhttp;
+
+import android.support.annotation.NonNull;
+
+import org.wikipedia.zero.WikipediaZeroHandler;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Response;
+
+public class WikipediaZeroResponseInterceptor implements Interceptor {
+    @NonNull private final WikipediaZeroHandler cb;
+
+    public WikipediaZeroResponseInterceptor(@NonNull WikipediaZeroHandler cb) {
+        this.cb = cb;
+    }
+
+    @Override public Response intercept(Chain chain) throws IOException {
+        Response rsp = chain.proceed(chain.request());
+        boolean zeroConfigRequest = 
"zeroconfig".equals(chain.request().url().queryParameter("action"));
+        if (rsp.isSuccessful() && rsp.networkResponse() != null && 
!zeroConfigRequest) {
+            cb.onHeaderCheck(rsp.headers());
+        }
+        return rsp;
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/dataclient/restbase/page/RbPageClient.java 
b/app/src/main/java/org/wikipedia/dataclient/restbase/page/RbPageClient.java
index 255d8d9..0aeb56c 100644
--- a/app/src/main/java/org/wikipedia/dataclient/restbase/page/RbPageClient.java
+++ b/app/src/main/java/org/wikipedia/dataclient/restbase/page/RbPageClient.java
@@ -52,7 +52,6 @@
             @Override
             public void onResponse(Call<RbPageSummary> call, 
Response<RbPageSummary> response) {
                 if (response.isSuccessful()) {
-                    responseHeaderHandler.onHeaderCheck(response);
                     if (response.body() == null) {
                         cb.failure(new JsonParseException("Response missing 
required field(s)"));
                         return;
@@ -83,7 +82,6 @@
             @Override
             public void onResponse(Call<RbPageLead> call, Response<RbPageLead> 
response) {
                 if (response.isSuccessful()) {
-                    responseHeaderHandler.onHeaderCheck(response);
                     RbPageLead pageLead = response.body();
                     pageLead.setLeadImageThumbWidth(leadImageThumbWidth);
                     cb.success(pageLead);
@@ -148,7 +146,6 @@
                         cb.failure(new JsonParseException("Response missing 
required fields"));
                         return;
                     }
-                    responseHeaderHandler.onHeaderCheck(response);
                     cb.success(new RbDefinition(response.body()));
                 } else {
                     Throwable throwable = 
RetrofitException.httpError(response);
diff --git 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
index d04ca3d..18c9911 100644
--- 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
+++ 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
@@ -88,7 +88,6 @@
             public void onResponse(Call<MwQueryResponse<Pages>> call,
                                    Response<MwQueryResponse<Pages>> response) {
                 if (response.isSuccessful()) {
-                    responseHeaderHandler.onHeaderCheck(response);
                     MwQueryResponse<Pages> pages = response.body();
                     if (pages.success() && 
pages.query().results(entry.getTitle().getWikiSite()) != null) {
                         SearchResults results = 
SearchResults.filter(pages.query().results(entry.getTitle().getWikiSite()), 
entry.getTitle().getText(), false);
diff --git a/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java 
b/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
index a5b816c..f9197b3 100644
--- a/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
+++ b/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
@@ -5,7 +5,6 @@
 
 import com.google.gson.JsonParseException;
 
-import org.wikipedia.WikipediaApp;
 import org.wikipedia.dataclient.WikiSite;
 import org.wikipedia.dataclient.restbase.page.RbPageSummary;
 import org.wikipedia.dataclient.retrofit.RbCachedService;
@@ -39,7 +38,6 @@
                         cb.onError(call, new JsonParseException("Response 
missing required field(s)"));
                         return;
                     }
-                    
WikipediaApp.getInstance().getWikipediaZeroHandler().onHeaderCheck(response);
                     RbPageSummary item = response.body();
                     PageTitle title = new PageTitle(null, item.getTitle(), 
wiki);
                     cb.onSuccess(call, title);
diff --git a/app/src/main/java/org/wikipedia/zero/WikipediaZeroHandler.java 
b/app/src/main/java/org/wikipedia/zero/WikipediaZeroHandler.java
index bb5c5f3..64d6b88 100644
--- a/app/src/main/java/org/wikipedia/zero/WikipediaZeroHandler.java
+++ b/app/src/main/java/org/wikipedia/zero/WikipediaZeroHandler.java
@@ -19,8 +19,6 @@
 import android.support.v7.app.NotificationCompat;
 
 import org.apache.commons.lang3.StringUtils;
-import org.mediawiki.api.json.ApiResult;
-import org.mediawiki.api.json.OnHeaderCheckListener;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.analytics.WikipediaZeroUsageFunnel;
@@ -30,16 +28,13 @@
 import org.wikipedia.settings.Prefs;
 import org.wikipedia.util.log.L;
 
-import java.net.URL;
-
 import okhttp3.Headers;
 import retrofit2.Call;
-import retrofit2.Response;
 
 import static org.apache.commons.lang3.StringUtils.defaultString;
 import static org.wikipedia.util.UriUtil.visitInExternalBrowser;
 
-public class WikipediaZeroHandler implements OnHeaderCheckListener {
+public class WikipediaZeroHandler {
     private static final int NOTIFICATION_ID = 100;
     private static final int MESSAGE_ZERO_CS = 1;
 
@@ -131,57 +126,33 @@
         zeroHandler.getZeroFunnel().logExtLinkWarn();
     }
 
-    /** For MW API responses */
-    // Note: keep in sync with next method. This one will go away when we've 
retrofitted all
-    // API calls.
-    @Override
-    public void onHeaderCheck(@NonNull final ApiResult result, @NonNull final 
URL apiURL) {
+    public void onHeaderCheck(@NonNull Headers headers) {
         if (acquiringCarrierMessage) {
             return;
         }
-        new Handler(Looper.getMainLooper()).post(new Runnable() {
-            @Override
-            public void run() {
-                boolean hasZeroHeader = 
result.getHeaders().containsKey("X-Carrier");
-                if (hasZeroHeader) {
-                    String xCarrierFromHeader = 
result.getHeaders().get("X-Carrier").get(0);
-                    String xCarrierMetaFromHeader = "";
-                    if (result.getHeaders().containsKey("X-Carrier-Meta")) {
-                        xCarrierMetaFromHeader = 
result.getHeaders().get("X-Carrier-Meta").get(0);
-                    }
-                    if (eitherChanged(xCarrierFromHeader, 
xCarrierMetaFromHeader)) {
-                        identifyZeroCarrier(xCarrierFromHeader, 
xCarrierMetaFromHeader);
-                    }
-                } else if (zeroEnabled) {
-                    zeroOff();
-                }
-            }
-        });
-    }
 
-    /** For Retrofit responses */
-    public void onHeaderCheck(@NonNull final Response<?> response) {
-        if (acquiringCarrierMessage) {
+        final String xCarrierFromHeader = getHeader(headers, "X-Carrier");
+        final String xCarrierMetaFromHeader = 
StringUtils.defaultString(getHeader(headers,
+                "X-Carrier-Meta"));
+        // newHeader may be true but must still be compared against 
SharedPreferences
+        final boolean newHeader = xCarrierFromHeader != null
+                && eitherChanged(xCarrierFromHeader, xCarrierMetaFromHeader);
+        boolean transitioningOff = zeroEnabled && xCarrierFromHeader == null;
+
+        if (!newHeader && !transitioningOff) {
             return;
         }
+
         new Handler(Looper.getMainLooper()).post(new Runnable() {
-            @Override
-            public void run() {
+            @Override public void run() {
                 try {
-                    String xCarrierFromHeader = getHeader(response, 
"X-Carrier");
-                    String xCarrierMetaFromHeader = "";
-                    if (getHeader(response, "X-Carrier-Meta") != null) {
-                        xCarrierMetaFromHeader = getHeader(response, 
"X-Carrier-Meta");
-                    }
-                    if (xCarrierFromHeader != null) {
-                        if (eitherChanged(xCarrierFromHeader, 
xCarrierMetaFromHeader)) {
-                            identifyZeroCarrier(xCarrierFromHeader, 
StringUtils.defaultString(xCarrierMetaFromHeader));
-                        }
-                    } else if (zeroEnabled) {
+                    if (newHeader) {
+                        identifyZeroCarrier(xCarrierFromHeader, 
xCarrierMetaFromHeader);
+                    } else {
                         zeroOff();
                     }
                 } catch (Exception e) {
-                    throw new RuntimeException("interesting response", e);
+                    throw new RuntimeException(e);
                 }
             }
         });
@@ -261,8 +232,7 @@
     }
 
     @Nullable
-    private String getHeader(@NonNull Response<?> response, @NonNull String 
key) {
-        Headers headers = response.headers();
+    private String getHeader(@NonNull Headers headers, @NonNull String key) {
         for (String name: headers.names()) {
             if (key.equalsIgnoreCase(name)) {
                 return headers.get(name);

-- 
To view, visit https://gerrit.wikimedia.org/r/340688
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7341957e90b286044b34fb61095e7e329a1cd656
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org>
Gerrit-Reviewer: Sniedzielski <sniedziel...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to