Bug 1253319 - getAndZero search counts in core ping builder. r=sebastian draft
authorMichael Comella <michael.l.comella@gmail.com>
Wed, 11 May 2016 15:47:07 -0700
changeset 366599 d3101e276bbab199cbf2d596d2236725715411f4
parent 366598 af868d10c848823f8d8730bce64f9aaeff1c8d47
child 520811 5d823cd7d13c13b367136109fbfde1e06dc83f96
push id18025
push usermichael.l.comella@gmail.com
push dateFri, 13 May 2016 00:07:27 +0000
reviewerssebastian
bugs1253319
milestone49.0a1
Bug 1253319 - getAndZero search counts in core ping builder. r=sebastian MozReview-Commit-ID: DlVnnKMyxDP
mobile/android/base/java/org/mozilla/gecko/telemetry/UploadTelemetryCorePingCallback.java
mobile/android/base/java/org/mozilla/gecko/telemetry/pingbuilders/TelemetryCorePingBuilder.java
--- a/mobile/android/base/java/org/mozilla/gecko/telemetry/UploadTelemetryCorePingCallback.java
+++ b/mobile/android/base/java/org/mozilla/gecko/telemetry/UploadTelemetryCorePingCallback.java
@@ -10,16 +10,18 @@ import android.content.SharedPreferences
 import android.support.annotation.Nullable;
 import android.support.annotation.WorkerThread;
 import android.util.Log;
 import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.GeckoProfile;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.distribution.DistributionStoreCallback;
 import org.mozilla.gecko.search.SearchEngineManager;
+import org.mozilla.gecko.sync.ExtendedJSONObject;
+import org.mozilla.gecko.telemetry.measurements.SearchCountMeasurements;
 import org.mozilla.gecko.telemetry.pingbuilders.TelemetryCorePingBuilder;
 import org.mozilla.gecko.util.StringUtils;
 import org.mozilla.gecko.util.ThreadUtils;
 
 import java.io.IOException;
 import java.lang.ref.WeakReference;
 
 /**
@@ -72,18 +74,27 @@ public class UploadTelemetryCorePingCall
 
                 // Each profile can have different telemetry data so we intentionally grab the shared prefs for the profile.
                 final SharedPreferences sharedPrefs = GeckoSharedPrefs.forProfileName(activity, profile.getName());
                 final TelemetryCorePingBuilder pingBuilder = new TelemetryCorePingBuilder(activity)
                         .setClientID(clientID)
                         .setDefaultSearchEngine(TelemetryCorePingBuilder.getEngineIdentifier(engine))
                         .setProfileCreationDate(TelemetryCorePingBuilder.getProfileCreationDate(activity, profile))
                         .setSequenceNumber(TelemetryCorePingBuilder.getAndIncrementSequenceNumber(sharedPrefs));
-                final String distributionId = sharedPrefs.getString(DistributionStoreCallback.PREF_DISTRIBUTION_ID, null);
-                if (distributionId != null) {
-                    pingBuilder.setOptDistributionID(distributionId);
-                }
+                maybeSetOptionalMeasurements(sharedPrefs, pingBuilder);
 
                 activity.getTelemetryDispatcher().queuePingForUpload(activity, pingBuilder);
             }
         });
     }
+
+    private static void maybeSetOptionalMeasurements(final SharedPreferences sharedPrefs, final TelemetryCorePingBuilder pingBuilder) {
+        final String distributionId = sharedPrefs.getString(DistributionStoreCallback.PREF_DISTRIBUTION_ID, null);
+        if (distributionId != null) {
+            pingBuilder.setOptDistributionID(distributionId);
+        }
+
+        final ExtendedJSONObject searchCounts = SearchCountMeasurements.getAndZeroSearch(sharedPrefs);
+        if (searchCounts.size() > 0) {
+            pingBuilder.setOptSearchCounts(searchCounts);
+        }
+    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/telemetry/pingbuilders/TelemetryCorePingBuilder.java
+++ b/mobile/android/base/java/org/mozilla/gecko/telemetry/pingbuilders/TelemetryCorePingBuilder.java
@@ -13,16 +13,17 @@ import android.support.annotation.NonNul
 import android.support.annotation.Nullable;
 import android.support.annotation.WorkerThread;
 import android.text.TextUtils;
 
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.GeckoProfile;
 import org.mozilla.gecko.Locales;
 import org.mozilla.gecko.search.SearchEngine;
+import org.mozilla.gecko.sync.ExtendedJSONObject;
 import org.mozilla.gecko.telemetry.TelemetryConstants;
 import org.mozilla.gecko.telemetry.TelemetryPing;
 import org.mozilla.gecko.util.DateUtil;
 import org.mozilla.gecko.util.Experiments;
 import org.mozilla.gecko.util.StringUtils;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -48,16 +49,17 @@ public class TelemetryCorePingBuilder ex
     private static final String DEVICE = "device";
     private static final String DISTRIBUTION_ID = "distributionId";
     private static final String EXPERIMENTS = "experiments";
     private static final String LOCALE = "locale";
     private static final String OS_ATTR = "os";
     private static final String OS_VERSION = "osversion";
     private static final String PING_CREATION_DATE = "created";
     private static final String PROFILE_CREATION_DATE = "profileDate";
+    private static final String SEARCH_COUNTS = "searches";
     private static final String SEQ = "seq";
     private static final String TIMEZONE_OFFSET = "tz";
     private static final String VERSION_ATTR = "v";
 
     public TelemetryCorePingBuilder(final Context context) {
         initPayloadConstants(context);
     }
 
@@ -129,16 +131,30 @@ public class TelemetryCorePingBuilder ex
         if (distributionID == null) {
             throw new IllegalArgumentException("Expected non-null distribution ID");
         }
         payload.put(DISTRIBUTION_ID, distributionID);
         return this;
     }
 
     /**
+     * @param searchCounts non-empty JSON with {"engine.where": <int-count>}
+     */
+    public TelemetryCorePingBuilder setOptSearchCounts(@NonNull final ExtendedJSONObject searchCounts) {
+        if (searchCounts == null) {
+            throw new IllegalStateException("Expected non-null search counts");
+        } else if (searchCounts.size() == 0) {
+            throw new IllegalStateException("Expected non-empty search counts");
+        }
+
+        payload.put(SEARCH_COUNTS, searchCounts);
+        return this;
+    }
+
+    /**
      * @param date The profile creation date in days to the unix epoch (not millis!), or null if there is an error.
      */
     public TelemetryCorePingBuilder setProfileCreationDate(@Nullable final Long date) {
         if (date != null && date < 0) {
             throw new IllegalArgumentException("Expect positive date value. Received: " + date);
         }
         payload.put(PROFILE_CREATION_DATE, date);
         return this;