Niedzielski has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/223460

Change subject: Hygiene: consolidate default funnel implementation
......................................................................

Hygiene: consolidate default funnel implementation

- Add canonical app install ID and session token implementation to
  Funnel.
- Use WikipediaApp.getPrimarySite() in Funnel when site is null.

The Funnel class hierarchy is one of the app's biggest DRY offenders
with many subclasses literally copying and pasting down to the
comments. As we have a sprint dedicated to event logging, it's long
overdue for refactoring.

Static analysis performed:
- Verify "appInstallID" field with a value of
  WikipediaApp.getAppInstallID(). If field has a different name,
  override getAppInstallIDField(). If field has a different value,
  override getAppInstallID(). If field does not exist, override
  preprocessAppInstallID().
- Verify "sessionToken" field with a value of
  UUID.randomUUID().toString(). If field has a different name,
  override getSessionTokenField(). If field has a different value,
  override getSessionToken(). If field does not exist, override
  preprocessSessionToken().
- Verify super.preprocessData(JSONObject) is called by Funnel
  subclasses.
- Verify preprocessData(JSONObject, String, T) is called instead of
  handling JSONExceptions.
- If Site is passed in the constructor, verify the super is invoked
  with it.
- Verify all Funnel subclasses accounted for including TimedFunnel
  descendents.
- Android Studio code inspection.

Functional analysis performed:
- All tests pass.
- Verify event logging on deployment-eventlogging02.eqiad.wmflabs for
  each funnel except SessionFunnel which is unused.

Change-Id: I7ac531207a38b9be9b97a2d5eb380658c9ef4418
---
M wikipedia/src/main/java/org/wikipedia/analytics/AppearanceChangeFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/ConnectionIssueFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/CreateAccountFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/EditFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/Funnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/GalleryFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/LinkPreviewFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/LoginFunnel.java
M 
wikipedia/src/main/java/org/wikipedia/analytics/ProtectedEditAttemptFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/SavedPagesFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/SearchFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/SessionFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/TimedFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/ToCInteractionFunnel.java
M wikipedia/src/main/java/org/wikipedia/analytics/WidgetsFunnel.java
M wikipedia/src/main/java/org/wikipedia/editing/EditSectionActivity.java
M wikipedia/src/main/java/org/wikipedia/login/LoginActivity.java
M wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
20 files changed, 241 insertions(+), 360 deletions(-)


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

diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/AppearanceChangeFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/AppearanceChangeFunnel.java
index f595a31..b64f87e 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/analytics/AppearanceChangeFunnel.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/analytics/AppearanceChangeFunnel.java
@@ -1,6 +1,7 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
@@ -10,30 +11,8 @@
     private static final String SCHEMA_NAME = 
"MobileWikiAppAppearanceSettings";
     private static final int REV_ID = 10375462;
 
-    private final String appInstallID;
-    private final Site site;
-
     public AppearanceChangeFunnel(WikipediaApp app, Site site) {
-        super(app, SCHEMA_NAME, REV_ID);
-
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
-        this.site = site;
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
-    }
-
-    protected void log(Object... params) {
-        super.log(site, params);
+        super(app, SCHEMA_NAME, REV_ID, site);
     }
 
     public void logFontSizeChange(float currentFontSize, float newFontSize) {
@@ -51,4 +30,6 @@
                 "newValue", newTheme.getFunnelName()
         );
     }
+
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/ConnectionIssueFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/ConnectionIssueFunnel.java
index 272902a..94b5099 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/ConnectionIssueFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/ConnectionIssueFunnel.java
@@ -1,5 +1,8 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
+
+import org.json.JSONObject;
 import org.wikipedia.WikipediaApp;
 
 public class ConnectionIssueFunnel extends Funnel {
@@ -10,10 +13,6 @@
         super(app, SCHEMA_NAME, REVISION);
     }
 
-    protected void log(Object... params) {
-        super.log(getApp().getPrimarySite(), params);
-    }
-
     public void logConnectionIssue(String failedEndpoint, String 
applicationContext) {
         log(
                 "failedEndpoint", failedEndpoint,
@@ -21,4 +20,6 @@
         );
     }
 
+    @Override protected void preprocessAppInstallID(@NonNull JSONObject 
eventData) { }
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/CreateAccountFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/CreateAccountFunnel.java
index 0d47bee..bc01e43 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/CreateAccountFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/CreateAccountFunnel.java
@@ -1,39 +1,19 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.WikipediaApp;
-
-import java.util.UUID;
 
 public class CreateAccountFunnel extends Funnel {
     private static final String SCHEMA_NAME = "MobileWikiAppCreateAccount";
     private static final int REVISION = 9135391;
 
-    private final String createAccountSessionToken;
     private final String requestSource;
 
     public CreateAccountFunnel(WikipediaApp app, String requestSource) {
         super(app, SCHEMA_NAME, REVISION);
         this.requestSource = requestSource;
-        createAccountSessionToken = UUID.randomUUID().toString();
-    }
-
-    protected void log(Object... params) {
-        // Create Account always hits the primarySite anyway.
-        super.log(getApp().getPrimarySite(), params);
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("createAccountSessionToken", 
createAccountSessionToken);
-            eventData.put("source", requestSource);
-        } catch (JSONException e) {
-            // This isn't happening
-            throw new RuntimeException(e);
-        }
-        return eventData;
     }
 
     public void logStart(String loginSessionToken) {
@@ -67,4 +47,18 @@
                 "action", "success"
         );
     }
+
+    @Override
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, "source", requestSource);
+        return super.preprocessData(eventData);
+    }
+
+    @Override protected void preprocessAppInstallID(@NonNull JSONObject 
eventData) { }
+
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "createAccountSessionToken";
+    }
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/EditFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/EditFunnel.java
index 69ec592..221cd5b 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/EditFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/EditFunnel.java
@@ -1,53 +1,28 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
 import org.json.JSONObject;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 
-import java.util.UUID;
-
 public class EditFunnel extends Funnel {
     private static final String SCHEMA_NAME = "MobileWikiAppEdit";
     private static final int REV_ID = 9003125;
 
-    private final String editSessionToken;
     private final PageTitle title;
 
     public EditFunnel(WikipediaApp app, PageTitle title) {
-        super(app, SCHEMA_NAME, REV_ID);
-        editSessionToken = UUID.randomUUID().toString();
+        super(app, SCHEMA_NAME, REV_ID, title.getSite());
         this.title = title;
     }
 
+    @Nullable
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("editSessionToken", editSessionToken);
-            if (getApp().getUserInfoStorage().isLoggedIn()) {
-                if (getApp().getUserInfoStorage().getUser().getUserID() == 0) {
-                    // Means we are logged in, but before we started counting 
UserID.
-                    // Send -1 to record these
-                    eventData.put("userID", -1);
-                } else {
-                    eventData.put("userID", 
getApp().getUserInfoStorage().getUser().getUserID());
-                }
-            }
-            eventData.put("pageNS", title.getNamespace());
-        } catch (JSONException e) {
-            // This never happens either
-            throw new RuntimeException(e);
-        }
-        return eventData;
-    }
-
-    public String getEditSessionToken() {
-        return editSessionToken;
-    }
-
-    protected void log(Object... params) {
-        super.log(title.getSite(), params);
+    public String getSessionToken() {
+        return super.getSessionToken();
     }
 
     public void logStart() {
@@ -67,14 +42,12 @@
                 "action", "saved",
                 "revID", revID
         );
-
     }
 
     public void logLoginAttempt() {
         log(
                 "action", "loginAttempt"
         );
-
     }
 
     public void logLoginSuccess() {
@@ -87,14 +60,12 @@
         log(
                 "action", "loginFailure"
         );
-
     }
 
     public void logCaptchaShown() {
         log(
                 "action", "captchaShown"
         );
-
     }
 
     public void logCaptchaFailure() {
@@ -109,7 +80,6 @@
                 "abuseFilterName", code
         );
     }
-
 
     public void logAbuseFilterWarningIgnore(String code) {
         log(
@@ -129,12 +99,6 @@
         log(
                 "action", "abuseFilterError",
                 "abuseFilterName", code
-        );
-    }
-
-    public void logSaveAnonExplicit() {
-        log(
-                "action", "saveAnonExplicit"
         );
     }
 
@@ -183,4 +147,26 @@
         );
     }
 
+    @Override
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        if (getApp().getUserInfoStorage().isLoggedIn()) {
+            if (getApp().getUserInfoStorage().getUser().getUserID() == 0) {
+                // Means we are logged in, but before we started counting 
UserID.
+                // Send -1 to record these
+                preprocessData(eventData, "userID", -1);
+            } else {
+                preprocessData(eventData, "userID", 
getApp().getUserInfoStorage().getUser().getUserID());
+            }
+        }
+        preprocessData(eventData, "pageNS", title.getNamespace());
+        return super.preprocessData(eventData);
+    }
+
+    @Override protected void preprocessAppInstallID(@NonNull JSONObject 
eventData) { }
+
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "editSessionToken";
+    }
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/Funnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/Funnel.java
index d33cb56..7785e93 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/Funnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/Funnel.java
@@ -1,5 +1,7 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.Log;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -7,22 +9,36 @@
 import org.wikipedia.Utils;
 import org.wikipedia.WikipediaApp;
 
-public abstract class Funnel {
+import java.util.UUID;
+
+/** Schemas for this abstract funnel are expected to have appInstallID and 
sessionToken fields. When
+ * these fields are not present or differently named, preprocess* or get*Field 
should be overridden. */
+/*package*/ abstract class Funnel {
+    private static final int SAMPLE_LOG_ALL = 1;
+    private static final String DEFAULT_APP_INSTALL_ID_KEY = "appInstallID";
+    private static final String DEFAULT_SESSION_TOKEN_KEY = "sessionToken";
+
     private final String schemaName;
     private final int revision;
     private final WikipediaApp app;
+    @Nullable private final Site site;
 
-    private static final int SAMPLE_LOG_ALL = 1;
+    private final String sessionToken = UUID.randomUUID().toString();
 
     /**
      * The tag used for any analytics-related events sent to the Log.
      */
     public static final String ANALYTICS_TAG = "Analytics";
 
-    protected Funnel(WikipediaApp app, String schemaName, int revision) {
+    /*package*/ Funnel(WikipediaApp app, String schemaName, int revision) {
+        this(app, schemaName, revision, null);
+    }
+
+    /*package*/ Funnel(WikipediaApp app, String schemaName, int revision, 
@Nullable Site site) {
         this.app = app;
         this.schemaName = schemaName;
         this.revision = revision;
+        this.site = site;
     }
 
     protected WikipediaApp getApp() {
@@ -35,18 +51,47 @@
      * @param eventData Event Data so far collected
      * @return Event Data to be sent to server
      */
-    protected JSONObject preprocessData(JSONObject eventData) {
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessAppInstallID(eventData);
+        preprocessSessionToken(eventData);
         return eventData;
+    }
+
+    /** Invokes {@link JSONObject#put} on <code>data</code> and throws a 
{@link RuntimeException} on
+     * failure. */
+    protected <T> void preprocessData(@NonNull JSONObject eventData, String 
key, T val) {
+        try {
+            eventData.put(key, val);
+        } catch (JSONException e) {
+            throw new RuntimeException("key=" + key + " val=" + val, e);
+        }
+    }
+
+    /** Invoked by {@link #preprocessData(JSONObject)}. */
+    protected void preprocessAppInstallID(@NonNull JSONObject eventData) {
+        preprocessData(eventData, getAppInstallIDField(), getAppInstallID());
+    }
+
+    /** Invoked by {@link #preprocessData(JSONObject)}. */
+    protected void preprocessSessionToken(@NonNull JSONObject eventData) {
+        preprocessData(eventData, getSessionTokenField(), getSessionToken());
+    }
+
+    protected void log(Object... params) {
+        log(SAMPLE_LOG_ALL, params);
     }
 
     protected void log(Site site, Object... params) {
         log(site, SAMPLE_LOG_ALL, params);
     }
 
+    protected void log(int rate, Object... params) {
+        log(site, rate, params);
+    }
+
     /**
      * Logs an event.
      *
-     * @param site          The wiki in which this action was performed.
      * @param rate          The sampling rate.
      * @param params        Actual data for the event. Considered to be an 
array
      *                      of alternating key and value items (for easier
@@ -71,7 +116,7 @@
      *                      The subclass methods should take more explicit 
parameters
      *                      depending on what they are logging.
      */
-    protected void log(Site site, int rate, Object... params) {
+    protected void log(@Nullable Site site, int rate, Object... params) {
         if (!app.isEventLoggingEnabled()) {
             // Do not send events if the user opted out of EventLogging
             return;
@@ -85,25 +130,40 @@
 
                 //Build the string which is logged to debug EventLogging code
                 String logString = this.getClass().getSimpleName() + ": 
Sending event";
-                try {
-                    for (int i = 0; i < params.length; i += 2) {
-                        eventData.put(params[i].toString(), params[i + 1]);
-                        logString += ", event_" + params[i] + " = " + params[i 
+ 1];
-                    }
-                    Log.d(ANALYTICS_TAG, logString);
-                } catch (JSONException e) {
-                    // This does not happen
-                    throw new RuntimeException(e);
+                for (int i = 0; i < params.length; i += 2) {
+                    preprocessData(eventData, params[i].toString(), params[i + 
1]);
+                    logString += ", event_" + params[i] + " = " + params[i + 
1];
                 }
+                Log.d(ANALYTICS_TAG, logString);
 
                 new EventLoggingEvent(
                         schemaName,
                         revision,
-                        Utils.getDBNameForSite(site),
+                        Utils.getDBNameForSite(site == null ? 
getApp().getPrimarySite() : site),
                         app.getUserAgent(),
                         preprocessData(eventData)
                 ).log();
             }
         }
     }
+
+    /** @return The application installation identifier field used by {@link 
#preprocessAppInstallID}. */
+    @NonNull protected String getAppInstallIDField() {
+        return DEFAULT_APP_INSTALL_ID_KEY;
+    }
+
+    /** @return The session identifier field used by {@link 
#preprocessSessionToken}. */
+    @NonNull protected String getSessionTokenField() {
+        return DEFAULT_SESSION_TOKEN_KEY;
+    }
+
+    /** @return The application installation identifier used by {@link 
#preprocessAppInstallID}. */
+    @Nullable protected String getAppInstallID() {
+        return getApp().getAppInstallID();
+    }
+
+    /** @return The session identifier used by {@link 
#preprocessSessionToken}. */
+    @Nullable protected String getSessionToken() {
+        return sessionToken;
+    }
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/GalleryFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/GalleryFunnel.java
index 41c5380..23116b0 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/GalleryFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/GalleryFunnel.java
@@ -1,12 +1,11 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
-
-import java.util.UUID;
 
 public class GalleryFunnel extends TimedFunnel {
     private static final String SCHEMA_NAME = "MobileWikiAppMediaGallery";
@@ -14,35 +13,24 @@
     private static final int SOURCE_LEAD_IMAGE = 0;
     private static final int SOURCE_NON_LEAD_IMAGE = 1;
 
-    private final String gallerySessionToken;
-    private final String appInstallID;
-    private final Site site;
     private final int source;
 
     public GalleryFunnel(WikipediaApp app, Site site, boolean fromLeadImage) {
-        super(app, SCHEMA_NAME, REV_ID);
+        super(app, SCHEMA_NAME, REV_ID, site);
 
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-        gallerySessionToken = UUID.randomUUID().toString();
         this.source = fromLeadImage ? SOURCE_LEAD_IMAGE : 
SOURCE_NON_LEAD_IMAGE;
-        this.site = site;
     }
 
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-            eventData.put("gallerySessionToken", gallerySessionToken);
-            eventData.put("source", source);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, "source", source);
         return super.preprocessData(eventData);
     }
 
-    protected void log(Object... params) {
-        super.log(site, params);
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "gallerySessionToken";
     }
 
     private void logGalleryAction(String action, PageTitle currentPageTitle, 
String currentMediaTitle) {
@@ -76,5 +64,4 @@
     public void logGallerySave(PageTitle currentPageTitle, String 
currentMediaTitle) {
         logGalleryAction("save", currentPageTitle, currentMediaTitle);
     }
-
 }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/LinkPreviewFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/LinkPreviewFunnel.java
index b2a254a..73407c9 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/LinkPreviewFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/LinkPreviewFunnel.java
@@ -1,47 +1,41 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.WikipediaApp;
 
-import java.util.UUID;
-
 public class LinkPreviewFunnel extends TimedFunnel {
     private static final String SCHEMA_NAME = "MobileWikiAppLinkPreview";
     private static final int REV_ID = 12143205;
-    public static final int DEFAULT_SAMPLE_RATE = 100;
+    private static final int DEFAULT_SAMPLE_RATE = 100;
 
-    private final String previewSessionToken;
     private final PageTitle title;
     private final int version;
-    private final String appInstallID;
 
     public LinkPreviewFunnel(WikipediaApp app, PageTitle title) {
         super(app, SCHEMA_NAME, REV_ID);
-        appInstallID = app.getAppInstallID();
-        previewSessionToken = UUID.randomUUID().toString();
         this.title = title;
         version = app.getLinkPreviewVersion();
     }
 
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("previewSessionToken", previewSessionToken);
-            eventData.put("appInstallID", appInstallID);
-            eventData.put("version", version);
-        } catch (JSONException e) {
-            // This never happens.
-            throw new RuntimeException(e);
-        }
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, "version", version);
         return super.preprocessData(eventData);
+    }
+
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "previewSessionToken";
     }
 
     protected void log(Object... params) {
         // get our sampling rate from remote config
-        int sampleRate = 
WikipediaApp.getInstance().getRemoteConfig().getConfig()
-                .optInt("linkPreviewLogSampleRate", 
WikipediaApp.getInstance().isProdRelease() ? DEFAULT_SAMPLE_RATE : 1);
+        int sampleRate = getApp().getRemoteConfig().getConfig()
+                .optInt("linkPreviewLogSampleRate", getApp().isProdRelease() ? 
DEFAULT_SAMPLE_RATE : 1);
         super.log(title.getSite(), sampleRate, params);
     }
 
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/LoginFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/LoginFunnel.java
index d2ec308..e55a18b 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/LoginFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/LoginFunnel.java
@@ -1,10 +1,10 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
 import org.json.JSONObject;
 import org.wikipedia.WikipediaApp;
-
-import java.util.UUID;
 
 /**
  * Schema: https://meta.wikimedia.org/wiki/Schema:MobileWikiAppLogin
@@ -17,31 +17,14 @@
     public static final String SOURCE_EDIT = "edit";
     public static final String SOURCE_BLOCKED = "blocked";
 
-    private final String loginSessionToken;
-
     public LoginFunnel(WikipediaApp app) {
         super(app, SCHEMA_NAME, REVISION);
-        loginSessionToken = UUID.randomUUID().toString();
     }
 
-    public String getLoginSessionToken() {
-        return loginSessionToken;
-    }
-
-    protected void log(Object... params) {
-        // Login always hits the primarySite anyway.
-        super.log(getApp().getPrimarySite(), params);
-    }
-
+    @Nullable
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("loginSessionToken", loginSessionToken);
-        } catch (JSONException e) {
-            // This isn't happening
-            throw new RuntimeException(e);
-        }
-        return eventData;
+    public String getSessionToken() {
+        return super.getSessionToken();
     }
 
     public void logStart(String source) {
@@ -86,4 +69,12 @@
                 "action", "success"
         );
     }
+
+    @Override protected void preprocessAppInstallID(@NonNull JSONObject 
eventData) { }
+
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "loginSessionToken";
+    }
 }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/ProtectedEditAttemptFunnel.java
 
b/wikipedia/src/main/java/org/wikipedia/analytics/ProtectedEditAttemptFunnel.java
index c8c277b..addaf1e 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/analytics/ProtectedEditAttemptFunnel.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/analytics/ProtectedEditAttemptFunnel.java
@@ -1,5 +1,8 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
+
+import org.json.JSONObject;
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
 
@@ -7,16 +10,12 @@
     private static final String SCHEMA_NAME = 
"MobileWikiAppProtectedEditAttempt";
     private static final int REV_ID = 8682497;
 
-    private final Site site;
-
     public ProtectedEditAttemptFunnel(WikipediaApp app, Site site) {
-        super(app, SCHEMA_NAME, REV_ID);
-        this.site = site;
+        super(app, SCHEMA_NAME, REV_ID, site);
     }
 
-    protected void log(Object... params) {
-        super.log(site, params);
-    }
+    @Override protected void preprocessAppInstallID(@NonNull JSONObject 
eventData) { }
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 
     public void log(String protectionStatus) {
         log(
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/SavedPagesFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/SavedPagesFunnel.java
index df54b0a..dfa6f56 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/SavedPagesFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/SavedPagesFunnel.java
@@ -1,6 +1,7 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
@@ -9,30 +10,8 @@
     private static final String SCHEMA_NAME = "MobileWikiAppSavedPages";
     private static final int REV_ID = 10375480;
 
-    private final String appInstallID;
-    private final Site site;
-
     public SavedPagesFunnel(WikipediaApp app, Site site) {
-        super(app, SCHEMA_NAME, REV_ID);
-
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
-        this.site = site;
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
-    }
-
-    protected void log(Object... params) {
-        super.log(site, params);
+        super(app, SCHEMA_NAME, REV_ID, site);
     }
 
     public void logSaveNew() {
@@ -76,4 +55,6 @@
                 "action", "editafterrefresh"
         );
     }
+
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/SearchFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/SearchFunnel.java
index 3cc3234..a35768c 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/SearchFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/SearchFunnel.java
@@ -1,41 +1,23 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
+
 import org.wikipedia.WikipediaApp;
-import org.json.JSONException;
-import org.json.JSONObject;
-import java.util.UUID;
 
 public class SearchFunnel extends Funnel {
     private static final String SCHEMA_NAME = "MobileWikiAppSearch";
     private static final int REVISION = 10641988;
     private static final int DEFAULT_SAMPLE_RATE = 100;
 
-    private final String searchSessionToken;
-    private final String appInstallID;
-
     public SearchFunnel(WikipediaApp app) {
         super(app, SCHEMA_NAME, REVISION);
-        appInstallID = app.getAppInstallID();
-        searchSessionToken = UUID.randomUUID().toString();
     }
 
     protected void log(Object... params) {
         // get our sampling rate from remote config
-        int sampleRate = 
WikipediaApp.getInstance().getRemoteConfig().getConfig()
-                                                   
.optInt("searchLogSampleRate", DEFAULT_SAMPLE_RATE);
-        super.log(getApp().getPrimarySite(), sampleRate, params);
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-            eventData.put("searchSessionToken", searchSessionToken);
-        } catch (JSONException e) {
-            // This isn't happening
-            throw new RuntimeException(e);
-        }
-        return eventData;
+        int sampleRate = getApp().getRemoteConfig().getConfig()
+                                 .optInt("searchLogSampleRate", 
DEFAULT_SAMPLE_RATE);
+        super.log(sampleRate, params);
     }
 
     public void searchStart() {
@@ -53,12 +35,6 @@
     public void searchClick() {
         log(
                 "action", "click"
-        );
-    }
-
-    public void searchAutoSwitch() {
-        log(
-                "action", "autoswitch"
         );
     }
 
@@ -84,4 +60,10 @@
                 "timeToDisplayResults", delayMillis
         );
     }
+
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "searchSessionToken";
+    }
 }
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/SessionFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/SessionFunnel.java
index b43602a..70e0f5c 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/SessionFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/SessionFunnel.java
@@ -2,10 +2,10 @@
 
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.history.HistoryEntry;
-import org.json.JSONException;
 import org.json.JSONObject;
 import android.content.SharedPreferences;
 import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
 import android.text.format.DateUtils;
 import java.util.Date;
 
@@ -13,7 +13,6 @@
     private static final String SCHEMA_NAME = "MobileWikiAppSessions";
     private static final int REVISION = 10375481;
     private static final int DEFAULT_SAMPLE_RATE = 0;
-    private WikipediaApp app;
 
     /**
      * Definition of a "session timeout", as agreed upon by the Apps and 
Analytics teams.
@@ -31,8 +30,7 @@
     private static final String SESSION_PAGES_SAVED_PREF_NAME = 
"SESSION_PAGES_SAVED_PREF";
     private static final String SESSION_PAGES_BACK_PREF_NAME = 
"SESSION_PAGES_BACK_PREF";
 
-    private final String appInstallID;
-    private Date lastEventTime;
+    private final Date lastEventTime;
     private int pagesFromSearch;
     private int pagesFromRandom;
     private int pagesFromLanglink;
@@ -44,7 +42,6 @@
 
     public SessionFunnel(WikipediaApp app) {
         super(app, SCHEMA_NAME, REVISION);
-        this.app = app;
 
         SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(app);
 
@@ -58,9 +55,6 @@
         pagesFromSaved = prefs.getInt(SESSION_PAGES_SAVED_PREF_NAME, 0);
         pagesFromBack = prefs.getInt(SESSION_PAGES_BACK_PREF_NAME, 0);
 
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
         touchSession();
     }
 
@@ -69,7 +63,7 @@
      * so that we don't have to save its state every time a single parameter 
is modified.
      */
     public void persistSession() {
-        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(app);
+        SharedPreferences prefs = 
PreferenceManager.getDefaultSharedPreferences(getApp());
         prefs.edit().putLong(SESSION_TIMESTAMP_PREF_NAME, 
lastEventTime.getTime())
              .putInt(SESSION_PAGES_SEARCH_PREF_NAME, pagesFromSearch)
              .putInt(SESSION_PAGES_RANDOM_PREF_NAME, pagesFromRandom)
@@ -81,22 +75,14 @@
              .putInt(SESSION_PAGES_BACK_PREF_NAME, pagesFromBack).apply();
     }
 
+    @Override
     protected void log(Object... params) {
         // get our sampling rate from remote config
-        int sampleRate = 
WikipediaApp.getInstance().getRemoteConfig().getConfig().optInt("eventLogSampleRate",
 DEFAULT_SAMPLE_RATE);
-        super.log(app.getPrimarySite(), sampleRate, params);
+        int sampleRate = 
getApp().getRemoteConfig().getConfig().optInt("eventLogSampleRate", 
DEFAULT_SAMPLE_RATE);
+        super.log(sampleRate, params);
     }
 
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-        } catch (JSONException e) {
-            // This isn't happening
-            throw new RuntimeException(e);
-        }
-        return eventData;
-    }
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 
     /**
      * Update the timestamp for the current session. If the last-updated time 
is older than the defined
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
index 3673d69..db305cf 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/ShareAFactFunnel.java
@@ -1,13 +1,11 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.page.PageTitle;
-import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.settings.Prefs;
-
-import java.util.UUID;
 
 // https://meta.wikimedia.org/wiki/Schema:MobileWikiAppShareAFact
 public class ShareAFactFunnel extends Funnel {
@@ -20,41 +18,28 @@
      */
     private static final int MAX_LENGTH = 99;
 
-    private final String appInstallID;
-    private final String sessionToken;
-    private final Site site;
     private final String pageTitle;
     private final int pageId;
     private final long revisionId;
 
     public ShareAFactFunnel(WikipediaApp app, PageTitle pageTitle, int pageId, 
long revisionId) {
-        super(app, SCHEMA_NAME, REV_ID);
-        this.site = pageTitle.getSite();
+        super(app, SCHEMA_NAME, REV_ID, pageTitle.getSite());
         this.pageTitle = pageTitle.getDisplayText();
         this.pageId = pageId;
         this.revisionId = revisionId;
-
-        // Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
-        sessionToken = UUID.randomUUID().toString();
     }
 
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-            eventData.put("shareSessionToken", sessionToken);
-            eventData.put("tutorialFeatureEnabled", 
Prefs.isFeatureSelectTextAndShareTutorialEnabled());
-            eventData.put("tutorialShown", calculateTutorialsShown());
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, "tutorialFeatureEnabled", 
Prefs.isFeatureSelectTextAndShareTutorialEnabled());
+        preprocessData(eventData, "tutorialShown", calculateTutorialsShown());
+        return super.preprocessData(eventData);
     }
 
-    protected void log(Object... params) {
-        super.log(site, params);
+    @NonNull
+    @Override
+    protected String getSessionTokenField() {
+        return "shareSessionToken";
     }
 
     private void logAction(String action, String text, ShareMode shareMode) {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
index 14cbc56..6a2801d 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/SuggestedPagesFunnel.java
@@ -1,11 +1,10 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
 import android.text.TextUtils;
 
-import org.json.JSONException;
 import org.json.JSONObject;
 import org.wikipedia.page.PageTitle;
-import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
 
 import java.util.List;
@@ -16,34 +15,23 @@
     private static final int READ_MORE_SOURCE_FULL_TEXT = 0;
     private static final int READ_MORE_SOURCE_MORELIKE = 1;
 
-    private final String appInstallID;
     private boolean moreLikeSearchEnabled;
 
     public SuggestedPagesFunnel(WikipediaApp app, boolean 
moreLikeSearchEnabled) {
         super(app, SCHEMA_NAME, REV_ID);
 
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
         this.moreLikeSearchEnabled = moreLikeSearchEnabled;
     }
 
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-            eventData.put("readMoreSource", moreLikeSearchEnabled
-                    ? READ_MORE_SOURCE_MORELIKE
-                    : READ_MORE_SOURCE_FULL_TEXT);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, "readMoreSource", moreLikeSearchEnabled
+                ? READ_MORE_SOURCE_MORELIKE
+                : READ_MORE_SOURCE_FULL_TEXT);
+        return super.preprocessData(eventData);
     }
 
-    protected void log(Site site, Object... params) {
-        super.log(site, params);
-    }
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 
     public void logSuggestionsShown(PageTitle currentPageTitle, 
List<PageTitle> suggestedTitles) {
         log(
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/TimedFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/TimedFunnel.java
index 6ed67f8..c9d13eb 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/TimedFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/TimedFunnel.java
@@ -1,7 +1,9 @@
 package org.wikipedia.analytics;
 
+import android.support.annotation.NonNull;
+
+import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
-import org.json.JSONException;
 import org.json.JSONObject;
 import java.util.concurrent.TimeUnit;
 
@@ -9,17 +11,18 @@
     private final long startTime;
 
     public TimedFunnel(WikipediaApp app, String schemaName, int revision) {
-        super(app, schemaName, revision);
+        this(app, schemaName, revision, null);
+    }
+
+    public TimedFunnel(WikipediaApp app, String schemaName, int revision, Site 
site) {
+        super(app, schemaName, revision, site);
         startTime = System.currentTimeMillis();
     }
 
     @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            return super.preprocessData(eventData).put(getDurationFieldName(), 
getDurationSeconds());
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
+    protected JSONObject preprocessData(@NonNull JSONObject eventData) {
+        preprocessData(eventData, getDurationFieldName(), 
getDurationSeconds());
+        return super.preprocessData(eventData);
     }
 
     /** Override me for deviant implementations. */
diff --git 
a/wikipedia/src/main/java/org/wikipedia/analytics/ToCInteractionFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/ToCInteractionFunnel.java
index 9d0f7c3..af70a7c 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/ToCInteractionFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/ToCInteractionFunnel.java
@@ -1,6 +1,7 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
@@ -10,36 +11,19 @@
     private static final int REV_ID = 11014396;
     private static final int DEFAULT_SAMPLE_RATE = 100;
 
-    private final String appInstallID;
-    private final Site site;
-
     public ToCInteractionFunnel(WikipediaApp app, Site site) {
-        super(app, SCHEMA_NAME, REV_ID);
-
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
-        this.site = site;
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
+        super(app, SCHEMA_NAME, REV_ID, site);
     }
 
     protected void log(Object... params) {
         //get our sampling rate from remote config
-        int sampleRate = 
WikipediaApp.getInstance().getRemoteConfig().getConfig()
-                                                   .optInt("tocLogSampleRate", 
DEFAULT_SAMPLE_RATE);
-        super.log(site, sampleRate, params);
-
+        int sampleRate = getApp().getRemoteConfig().getConfig()
+                                 .optInt("tocLogSampleRate", 
DEFAULT_SAMPLE_RATE);
+        super.log(sampleRate, params);
     }
 
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
+
     public void logOpen() {
         log(
                 "action", "open"
diff --git a/wikipedia/src/main/java/org/wikipedia/analytics/WidgetsFunnel.java 
b/wikipedia/src/main/java/org/wikipedia/analytics/WidgetsFunnel.java
index e23f5ca..d6e9df5 100644
--- a/wikipedia/src/main/java/org/wikipedia/analytics/WidgetsFunnel.java
+++ b/wikipedia/src/main/java/org/wikipedia/analytics/WidgetsFunnel.java
@@ -1,38 +1,16 @@
 package org.wikipedia.analytics;
 
-import org.json.JSONException;
+import android.support.annotation.NonNull;
+
 import org.json.JSONObject;
-import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
 
 public class WidgetsFunnel extends Funnel {
     private static final String SCHEMA_NAME = "MobileWikiAppWidgets";
     private static final int REV_ID = 11312870;
 
-    private final String appInstallID;
-    private final Site site;
-
-    public WidgetsFunnel(WikipediaApp app, Site site) {
+    public WidgetsFunnel(WikipediaApp app) {
         super(app, SCHEMA_NAME, REV_ID);
-
-        //Retrieve this app installation's unique ID, used to record unique 
users of features
-        appInstallID = app.getAppInstallID();
-
-        this.site = site;
-    }
-
-    @Override
-    protected JSONObject preprocessData(JSONObject eventData) {
-        try {
-            eventData.put("appInstallID", appInstallID);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-        return eventData;
-    }
-
-    protected void log(Object... params) {
-        super.log(site, params);
     }
 
     public void logSearchWidgetTap() {
@@ -47,4 +25,5 @@
         );
     }
 
+    @Override protected void preprocessSessionToken(@NonNull JSONObject 
eventData) { }
 }
\ No newline at end of file
diff --git 
a/wikipedia/src/main/java/org/wikipedia/editing/EditSectionActivity.java 
b/wikipedia/src/main/java/org/wikipedia/editing/EditSectionActivity.java
index ebede4d..863f698 100644
--- a/wikipedia/src/main/java/org/wikipedia/editing/EditSectionActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/editing/EditSectionActivity.java
@@ -218,7 +218,7 @@
                     funnel.logLoginAttempt();
                     Intent loginIntent = new Intent(EditSectionActivity.this, 
LoginActivity.class);
                     loginIntent.putExtra(LoginActivity.LOGIN_REQUEST_SOURCE, 
LoginFunnel.SOURCE_EDIT);
-                    loginIntent.putExtra(LoginActivity.EDIT_SESSION_TOKEN, 
funnel.getEditSessionToken());
+                    loginIntent.putExtra(LoginActivity.EDIT_SESSION_TOKEN, 
funnel.getSessionToken());
                     startActivityForResult(loginIntent, 
LoginActivity.REQUEST_LOGIN);
                 } else {
                     Utils.handleExternalLink(EditSectionActivity.this, 
Uri.parse(url));
diff --git a/wikipedia/src/main/java/org/wikipedia/login/LoginActivity.java 
b/wikipedia/src/main/java/org/wikipedia/login/LoginActivity.java
index 9f4dc65..c8b5737 100644
--- a/wikipedia/src/main/java/org/wikipedia/login/LoginActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/login/LoginActivity.java
@@ -122,7 +122,7 @@
     private void startCreateAccountActivity() {
         funnel.logCreateAccountAttempt();
         Intent intent = new Intent(this, CreateAccountActivity.class);
-        intent.putExtra(CreateAccountActivity.LOGIN_SESSION_TOKEN, 
funnel.getLoginSessionToken());
+        intent.putExtra(CreateAccountActivity.LOGIN_SESSION_TOKEN, 
funnel.getSessionToken());
         intent.putExtra(CreateAccountActivity.LOGIN_REQUEST_SOURCE, 
loginSource);
         startActivityForResult(intent, 
CreateAccountActivity.ACTION_CREATE_ACCOUNT);
     }
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
index 5d58405..25e9515 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
@@ -410,14 +410,14 @@
         } else if (intent.hasExtra(EXTRA_SEARCH_FROM_WIDGET)) {
             // Log that the user tapped on the search widget
             // Instantiate the funnel anonymously to save on memory overhead
-            new WidgetsFunnel(app, app.getPrimarySite()).logSearchWidgetTap();
+            new WidgetsFunnel(app).logSearchWidgetTap();
             openSearch();
         } else if (intent.hasExtra(EXTRA_FEATURED_ARTICLE_FROM_WIDGET)) {
             displayMainPage();
 
             // Log that the user tapped on the featured article widget
             // Instantiate the funnel anonymously to save on memory overhead
-            new WidgetsFunnel(app, 
app.getPrimarySite()).logFeaturedArticleWidgetTap();
+            new WidgetsFunnel(app).logFeaturedArticleWidgetTap();
         } else {
             // Unrecognized Intent was handled, or the user opened the app by 
tapping on the icon.
             // Let us load the main page!

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

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

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

Reply via email to