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