Bug 1273689 - Move session measurement calls to CorePingDelegate. r=sebastian draft
authorMichael Comella <michael.l.comella@gmail.com>
Tue, 31 May 2016 14:16:04 -0700
changeset 373607 ad7f650414c15ac44b64acb371a04f3cfea3d0e2
parent 373606 8824624c524392c0178535c47bf9657ba9cf9168
child 373608 f8b71109e5673c083b1f7d9d184f901998a40174
push id19788
push usermichael.l.comella@gmail.com
push dateTue, 31 May 2016 22:41:35 +0000
reviewerssebastian
bugs1273689
milestone49.0a1
Bug 1273689 - Move session measurement calls to CorePingDelegate. r=sebastian MozReview-Commit-ID: EPLUd5Uq0Pc
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
mobile/android/base/java/org/mozilla/gecko/telemetry/TelemetryCorePingUploadDelegate.java
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -73,17 +73,16 @@ import org.mozilla.gecko.tabqueue.TabQue
 import org.mozilla.gecko.tabqueue.TabQueuePrompt;
 import org.mozilla.gecko.tabs.TabHistoryController;
 import org.mozilla.gecko.tabs.TabHistoryController.OnShowTabHistory;
 import org.mozilla.gecko.tabs.TabHistoryFragment;
 import org.mozilla.gecko.tabs.TabHistoryPage;
 import org.mozilla.gecko.tabs.TabsPanel;
 import org.mozilla.gecko.telemetry.TelemetryCorePingUploadDelegate;
 import org.mozilla.gecko.telemetry.measurements.SearchCountMeasurements;
-import org.mozilla.gecko.telemetry.measurements.SessionMeasurements;
 import org.mozilla.gecko.toolbar.AutocompleteHandler;
 import org.mozilla.gecko.toolbar.BrowserToolbar;
 import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState;
 import org.mozilla.gecko.toolbar.ToolbarProgressView;
 import org.mozilla.gecko.trackingprotection.TrackingProtectionPrompt;
 import org.mozilla.gecko.updater.UpdateServiceHelper;
 import org.mozilla.gecko.util.ActivityUtils;
 import org.mozilla.gecko.util.Clipboard;
@@ -308,18 +307,16 @@ public class BrowserApp extends GeckoApp
             (BrowserAppDelegate) new ReaderViewBookmarkPromotion(),
             (BrowserAppDelegate) new ContentNotificationsDelegate(),
             new TelemetryCorePingUploadDelegate()
     ));
 
     @NonNull
     private SearchEngineManager mSearchEngineManager; // Contains reference to Context - DO NOT LEAK!
 
-    private final SessionMeasurements mSessionMeasurements = new SessionMeasurements();
-
     private boolean mHasResumed;
 
     @Override
     public View onCreateView(final String name, final Context context, final AttributeSet attrs) {
         final View view;
         if (BrowserToolbar.class.getName().equals(name)) {
             view = BrowserToolbar.create(context, attrs);
         } else if (TabsPanel.TabsLayout.class.getName().equals(name)) {
@@ -976,17 +973,16 @@ public class BrowserApp extends GeckoApp
     public void onResume() {
         super.onResume();
         if (mIsAbortingAppLaunch) {
             return;
         }
 
         // Needed for Adjust to get accurate session measurements
         AdjustConstants.getAdjustHelper().onResume();
-        mSessionMeasurements.recordSessionStart();
 
         if (!mHasResumed) {
             EventDispatcher.getInstance().unregisterGeckoThreadListener((GeckoEventListener) this,
                     "Prompt:ShowTop");
             mHasResumed = true;
         }
 
         processTabQueue();
@@ -1001,20 +997,16 @@ public class BrowserApp extends GeckoApp
         super.onPause();
         if (mIsAbortingAppLaunch) {
             return;
         }
 
         // Needed for Adjust to get accurate session measurements
         AdjustConstants.getAdjustHelper().onPause();
 
-        // onStart/onStop is ideal over onResume/onPause. However, onStop is not guaranteed to be called and
-        // dealing with that possibility adds a lot of complexity that we don't want to handle at this point.
-        mSessionMeasurements.recordSessionEnd(this);
-
         if (mHasResumed) {
             // Register for Prompt:ShowTop so we can foreground this activity even if it's hidden.
             EventDispatcher.getInstance().registerGeckoThreadListener((GeckoEventListener) this,
                 "Prompt:ShowTop");
             mHasResumed = false;
         }
 
         for (BrowserAppDelegate delegate : delegates) {
@@ -3894,20 +3886,16 @@ public class BrowserApp extends GeckoApp
 
     @Override
     public int getLayout() { return R.layout.gecko_app; }
 
     public SearchEngineManager getSearchEngineManager() {
         return mSearchEngineManager;
     }
 
-    public SessionMeasurements getSessionMeasurementDelegate() {
-        return mSessionMeasurements;
-    }
-
     // For use from tests only.
     @RobocopTarget
     public ReadingListHelper getReadingListHelper() {
         return mReadingListHelper;
     }
 
     /**
      * Launch UI that lets the user update Firefox.
--- a/mobile/android/base/java/org/mozilla/gecko/telemetry/TelemetryCorePingUploadDelegate.java
+++ b/mobile/android/base/java/org/mozilla/gecko/telemetry/TelemetryCorePingUploadDelegate.java
@@ -29,31 +29,44 @@ import java.lang.ref.WeakReference;
 /**
  * An activity-lifecycle delegate for uploading the core ping.
  */
 public class TelemetryCorePingUploadDelegate extends BrowserAppDelegate {
     private static final String LOGTAG = StringUtils.safeSubstring(
             "Gecko" + TelemetryCorePingUploadDelegate.class.getSimpleName(), 0, 23);
 
     private TelemetryDispatcher telemetryDispatcher; // lazy
+    private final SessionMeasurements sessionMeasurements = new SessionMeasurements();
 
     @Override
     public void onStart(final BrowserApp browserApp) {
         // We don't upload in onCreate because that's only called when the Activity needs to be instantiated
         // and it's possible the system will never free the Activity from memory.
         //
         // We don't upload in onResume/onPause because that will be called each time the Activity is obscured,
         // including by our own Activities/dialogs, and there is no reason to upload each time we're unobscured.
         //
         // We're left with onStart/onStop and we upload in onStart because onStop is not guaranteed to be called
         // and we want to upload the first run ASAP (e.g. to get install data before the app may crash).
         final SearchEngineManager searchEngineManager = browserApp.getSearchEngineManager();
         searchEngineManager.getEngine(new UploadTelemetryCorePingCallback(browserApp));
     }
 
+    @Override
+    public void onResume(BrowserApp browserApp) {
+        sessionMeasurements.recordSessionStart();
+    }
+
+    @Override
+    public void onPause(BrowserApp browserApp) {
+        // onStart/onStop is ideal over onResume/onPause. However, onStop is not guaranteed to be called and
+        // dealing with that possibility adds a lot of complexity that we don't want to handle at this point.
+        sessionMeasurements.recordSessionEnd(browserApp);
+    }
+
     @WorkerThread // via constructor
     private TelemetryDispatcher getTelemetryDispatcher(final BrowserApp browserApp) {
         if (telemetryDispatcher == null) {
             final String profilePath = browserApp.getProfile().getDir().getAbsolutePath();
             telemetryDispatcher = new TelemetryDispatcher(profilePath);
         }
         return telemetryDispatcher;
     }
@@ -102,17 +115,17 @@ public class TelemetryCorePingUploadDele
                     } catch (final IOException e) {
                         Log.w(LOGTAG, "Unable to get client ID to generate core ping: " + e);
                         return;
                     }
 
                     // Each profile can have different telemetry data so we intentionally grab the shared prefs for the profile.
                     final SharedPreferences sharedPrefs = getSharedPreferences(activity);
                     final SessionMeasurements.SessionMeasurementsContainer sessionMeasurementsContainer =
-                            activity.getSessionMeasurementDelegate().getAndResetSessionMeasurements(activity);
+                            sessionMeasurements.getAndResetSessionMeasurements(activity);
                     final TelemetryCorePingBuilder pingBuilder = new TelemetryCorePingBuilder(activity)
                             .setClientID(clientID)
                             .setDefaultSearchEngine(TelemetryCorePingBuilder.getEngineIdentifier(engine))
                             .setProfileCreationDate(TelemetryCorePingBuilder.getProfileCreationDate(activity, profile))
                             .setSequenceNumber(TelemetryCorePingBuilder.getAndIncrementSequenceNumber(sharedPrefs))
                             .setSessionCount(sessionMeasurementsContainer.sessionCount)
                             .setSessionDuration(sessionMeasurementsContainer.elapsedSeconds);
                     maybeSetOptionalMeasurements(sharedPrefs, pingBuilder);