Bug 1273689 - Move session measurement calls to CorePingDelegate. r=sebastian
MozReview-Commit-ID: EPLUd5Uq0Pc
--- 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);