Skip to content

Commit 663e59e

Browse files
committed
wip sessionmanager
1 parent df8b9e6 commit 663e59e

File tree

19 files changed

+166
-76
lines changed

19 files changed

+166
-76
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,29 +34,30 @@
3434
public class FirebasePerfEarly {
3535

3636
public FirebasePerfEarly(
37-
FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor) {
37+
FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor, SessionManager sessionManager) {
3838
Context context = app.getApplicationContext();
3939

4040
// Initialize ConfigResolver early for accessing device caching layer.
4141
ConfigResolver configResolver = ConfigResolver.getInstance();
4242
configResolver.setApplicationContext(context);
4343

4444
AppStateMonitor appStateMonitor = AppStateMonitor.getInstance();
45+
appStateMonitor.setSessionManager(sessionManager);
4546
appStateMonitor.registerActivityLifecycleCallbacks(context);
4647
appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer());
4748

4849
if (startupTime != null) {
4950
AppStartTrace appStartTrace = AppStartTrace.getInstance();
51+
appStartTrace.setSessionManager(sessionManager);
5052
appStartTrace.registerActivityLifecycleCallbacks(context);
5153
uiExecutor.execute(new AppStartTrace.StartFromBackgroundRunnable(appStartTrace));
5254
}
53-
5455
// TODO: Bring back Firebase Sessions dependency to watch for updates to sessions.
5556

5657
// In the case of cold start, we create a session and start collecting gauges as early as
5758
// possible.
5859
// There is code in SessionManager that prevents us from resetting the session twice in case
5960
// of app cold start.
60-
SessionManager.getInstance().initializeGaugeCollection();
61+
sessionManager.initializeGaugeCollection();
6162
}
6263
}

firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@
2626
import com.google.firebase.components.Qualified;
2727
import com.google.firebase.installations.FirebaseInstallationsApi;
2828
import com.google.firebase.perf.injection.components.DaggerFirebasePerformanceComponent;
29+
import com.google.firebase.perf.injection.components.DaggerSessionManagerComponent;
2930
import com.google.firebase.perf.injection.components.FirebasePerformanceComponent;
31+
import com.google.firebase.perf.injection.components.SessionManagerComponent;
3032
import com.google.firebase.perf.injection.modules.FirebasePerformanceModule;
33+
import com.google.firebase.perf.injection.modules.SessionManagerModule;
34+
import com.google.firebase.perf.session.SessionManager;
3135
import com.google.firebase.platforminfo.LibraryVersionComponent;
3236
import com.google.firebase.remoteconfig.RemoteConfigComponent;
3337
import java.util.Arrays;
@@ -59,21 +63,25 @@ public List<Component<?>> getComponents() {
5963
.add(Dependency.required(FirebaseInstallationsApi.class))
6064
.add(Dependency.requiredProvider(TransportFactory.class))
6165
.add(Dependency.required(FirebasePerfEarly.class))
66+
.add(Dependency.required(SessionManager.class))
6267
.factory(FirebasePerfRegistrar::providesFirebasePerformance)
6368
.build(),
6469
Component.builder(FirebasePerfEarly.class)
6570
.name(EARLY_LIBRARY_NAME)
6671
.add(Dependency.required(FirebaseApp.class))
6772
.add(Dependency.optionalProvider(StartupTime.class))
6873
.add(Dependency.required(uiExecutor))
74+
.add(Dependency.required(SessionManager.class))
6975
.eagerInDefaultApp()
7076
.factory(
7177
container ->
7278
new FirebasePerfEarly(
7379
container.get(FirebaseApp.class),
7480
container.getProvider(StartupTime.class).get(),
75-
container.get(uiExecutor)))
81+
container.get(uiExecutor),
82+
container.get(SessionManager.class)))
7683
.build(),
84+
Component.builder(SessionManager.class).factory(container -> new SessionManager()).build(),
7785
/**
7886
* Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link
7987
* com.google.firebase.perf.application.AppStateMonitor#onActivityResumed(Activity)}. we use
@@ -94,7 +102,8 @@ private static FirebasePerformance providesFirebasePerformance(ComponentContaine
94102
container.get(FirebaseApp.class),
95103
container.get(FirebaseInstallationsApi.class),
96104
container.getProvider(RemoteConfigComponent.class),
97-
container.getProvider(TransportFactory.class)))
105+
container.getProvider(TransportFactory.class),
106+
container.get(SessionManager.class)))
98107
.build();
99108

100109
return component.getFirebasePerformance();

firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public static FirebasePerformance getInstance() {
140140
private final Provider<RemoteConfigComponent> firebaseRemoteConfigProvider;
141141
private final FirebaseInstallationsApi firebaseInstallationsApi;
142142
private final Provider<TransportFactory> transportFactoryProvider;
143+
private final SessionManager sessionManager;
143144

144145
/**
145146
* Constructs the FirebasePerformance class and allows injecting dependencies.
@@ -168,6 +169,7 @@ public static FirebasePerformance getInstance() {
168169
this.firebaseRemoteConfigProvider = firebaseRemoteConfigProvider;
169170
this.firebaseInstallationsApi = firebaseInstallationsApi;
170171
this.transportFactoryProvider = transportFactoryProvider;
172+
this.sessionManager = sessionManager;
171173

172174
if (firebaseApp == null) {
173175
this.mPerformanceCollectionForceEnabledState = false;
@@ -177,7 +179,7 @@ public static FirebasePerformance getInstance() {
177179
}
178180

179181
TransportManager.getInstance()
180-
.initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider);
182+
.initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager);
181183

182184
Context appContext = firebaseApp.getApplicationContext();
183185
// TODO(b/110178816): Explore moving off of main thread.
@@ -187,7 +189,7 @@ public static FirebasePerformance getInstance() {
187189
this.configResolver.getRemoteConfigManager().setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider);
188190
this.configResolver.setMetadataBundle(mMetadataBundle);
189191
this.configResolver.setApplicationContext(appContext);
190-
sessionManager.setApplicationContext(appContext);
192+
this.sessionManager.setApplicationContext(appContext);
191193

192194
mPerformanceCollectionForceEnabledState = configResolver.getIsPerformanceCollectionEnabled();
193195
if (logger.isLogcatEnabled() && isPerformanceCollectionEnabled()) {
@@ -423,7 +425,7 @@ public Trace newTrace(@NonNull String traceName) {
423425
*/
424426
@NonNull
425427
public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String httpMethod) {
426-
return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer());
428+
return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager);
427429
}
428430

429431
/**
@@ -436,7 +438,7 @@ public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String
436438
*/
437439
@NonNull
438440
public HttpMetric newHttpMetric(@NonNull URL url, @NonNull @HttpMethod String httpMethod) {
439-
return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer());
441+
return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager);
440442
}
441443

442444
/**

firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks {
8080
private boolean isRegisteredForLifecycleCallbacks = false;
8181
private boolean isColdStart = true;
8282

83+
private SessionManager sessionManager;
84+
8385
public static AppStateMonitor getInstance() {
8486
if (instance == null) {
8587
synchronized (AppStateMonitor.class) {
@@ -159,7 +161,7 @@ private void startFrameMonitoring(Activity activity) {
159161
activityToRecorderMap.put(activity, recorder);
160162
if (activity instanceof FragmentActivity) {
161163
FragmentStateMonitor fragmentStateMonitor =
162-
new FragmentStateMonitor(clock, transportManager, this, recorder);
164+
new FragmentStateMonitor(clock, transportManager, this, recorder, sessionManager);
163165
activityToFragmentStateMonitorMap.put(activity, fragmentStateMonitor);
164166
FragmentActivity fragmentActivity = (FragmentActivity) activity;
165167
fragmentActivity
@@ -198,7 +200,7 @@ public synchronized void onActivityStarted(Activity activity) {
198200
// Starts recording frame metrics for this activity.
199201
activityToRecorderMap.get(activity).start();
200202
// Start the Trace
201-
Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this);
203+
Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this, sessionManager);
202204
screenTrace.start();
203205
activityToScreenTraceMap.put(activity, screenTrace);
204206
}
@@ -379,7 +381,7 @@ private void sendSessionLog(String name, Timer startTime, Timer endTime) {
379381
.setName(name)
380382
.setClientStartTimeUs(startTime.getMicros())
381383
.setDurationUs(startTime.getDurationMicros(endTime))
382-
.addPerfSessions(SessionManager.getInstance().perfSession().build());
384+
.addPerfSessions(sessionManager.perfSession().build());
383385
// Atomically get mTsnsCount and set it to zero.
384386
int tsnsCount = this.tsnsCount.getAndSet(0);
385387
synchronized (metricToCountMap) {
@@ -463,4 +465,12 @@ Timer getResumeTime() {
463465
public void setIsColdStart(boolean isColdStart) {
464466
this.isColdStart = isColdStart;
465467
}
468+
469+
public SessionManager getSessionManager() {
470+
return sessionManager;
471+
}
472+
473+
public void setSessionManager(SessionManager sessionManager) {
474+
this.sessionManager = sessionManager;
475+
}
466476
}

firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.firebase.perf.logging.AndroidLogger;
2222
import com.google.firebase.perf.metrics.FrameMetricsCalculator.PerfFrameMetrics;
2323
import com.google.firebase.perf.metrics.Trace;
24+
import com.google.firebase.perf.session.SessionManager;
2425
import com.google.firebase.perf.transport.TransportManager;
2526
import com.google.firebase.perf.util.Clock;
2627
import com.google.firebase.perf.util.Constants;
@@ -33,18 +34,21 @@ public class FragmentStateMonitor extends FragmentManager.FragmentLifecycleCallb
3334
private final WeakHashMap<Fragment, Trace> fragmentToTraceMap = new WeakHashMap<>();
3435
private final Clock clock;
3536
private final TransportManager transportManager;
37+
private final SessionManager sessionManager;
3638
private final AppStateMonitor appStateMonitor;
3739
private final FrameMetricsRecorder activityFramesRecorder;
3840

3941
public FragmentStateMonitor(
4042
Clock clock,
4143
TransportManager transportManager,
4244
AppStateMonitor appStateMonitor,
43-
FrameMetricsRecorder recorder) {
45+
FrameMetricsRecorder recorder,
46+
SessionManager sessionManager) {
4447
this.clock = clock;
4548
this.transportManager = transportManager;
4649
this.appStateMonitor = appStateMonitor;
4750
this.activityFramesRecorder = recorder;
51+
this.sessionManager = sessionManager;
4852
}
4953

5054
/**
@@ -63,7 +67,7 @@ public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f)
6367
// Start Fragment screen trace
6468
logger.debug("FragmentMonitor %s.onFragmentResumed", f.getClass().getSimpleName());
6569
Trace fragmentTrace =
66-
new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor);
70+
new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor, sessionManager);
6771
fragmentTrace.start();
6872

6973
fragmentTrace.putAttribute(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.google.firebase.perf.injection.components;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.google.firebase.perf.injection.modules.SessionManagerModule;
6+
import com.google.firebase.perf.session.SessionManager;
7+
8+
import javax.inject.Singleton;
9+
10+
import dagger.Component;
11+
12+
@Component(modules = {SessionManagerModule.class})
13+
@Singleton
14+
public interface SessionManagerComponent {
15+
@NonNull
16+
SessionManager getSessionManager();
17+
}

firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,19 @@ public class FirebasePerformanceModule {
3434
private final FirebaseInstallationsApi firebaseInstallations;
3535
private final Provider<RemoteConfigComponent> remoteConfigComponentProvider;
3636
private final Provider<TransportFactory> transportFactoryProvider;
37+
private final SessionManager sessionManager;
3738

3839
public FirebasePerformanceModule(
3940
@NonNull FirebaseApp firebaseApp,
4041
@NonNull FirebaseInstallationsApi firebaseInstallations,
4142
@NonNull Provider<RemoteConfigComponent> remoteConfigComponentProvider,
42-
@NonNull Provider<TransportFactory> transportFactoryProvider) {
43+
@NonNull Provider<TransportFactory> transportFactoryProvider,
44+
@NonNull SessionManager sessionManager) {
4345
this.firebaseApp = firebaseApp;
4446
this.firebaseInstallations = firebaseInstallations;
4547
this.remoteConfigComponentProvider = remoteConfigComponentProvider;
4648
this.transportFactoryProvider = transportFactoryProvider;
49+
this.sessionManager = sessionManager;
4750
}
4851

4952
@Provides
@@ -73,6 +76,6 @@ ConfigResolver providesConfigResolver() {
7376

7477
@Provides
7578
SessionManager providesSessionManager() {
76-
return SessionManager.getInstance();
79+
return sessionManager;
7780
}
7881
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.google.firebase.perf.injection.modules;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import com.google.firebase.perf.session.SessionManager;
6+
7+
import dagger.Module;
8+
import dagger.Provides;
9+
10+
@Module
11+
public class SessionManagerModule {
12+
private final SessionManager sessionManager;
13+
14+
public SessionManagerModule(@NonNull SessionManager sessionManager) {
15+
this.sessionManager = sessionManager;
16+
}
17+
18+
@Provides
19+
SessionManager providesSessionManager() {
20+
return sessionManager;
21+
}
22+
}

firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public class AppStartTrace implements ActivityLifecycleCallbacks, LifecycleObser
9292
private final ConfigResolver configResolver;
9393
private final TraceMetric.Builder experimentTtid;
9494
private Context appContext;
95+
private SessionManager sessionManager;
9596

9697
/**
9798
* The first time onCreate() of any activity is called, the activity is saved as launchActivity.
@@ -413,7 +414,7 @@ public synchronized void onActivityResumed(Activity activity) {
413414
appStartActivity = new WeakReference<Activity>(activity);
414415

415416
onResumeTime = clock.getTime();
416-
this.startSession = SessionManager.getInstance().perfSession();
417+
this.startSession = sessionManager.perfSession();
417418
AndroidLogger.getInstance()
418419
.debug(
419420
"onResume(): "
@@ -572,6 +573,10 @@ public static boolean isAnyAppProcessInForeground(Context appContext) {
572573
return false;
573574
}
574575

576+
public void setSessionManager(SessionManager sessionManager) {
577+
this.sessionManager = sessionManager;
578+
}
579+
575580
/**
576581
* We use StartFromBackgroundRunnable to detect if app is started from background or foreground.
577582
* If app is started from background, we do not generate AppStart trace. This runnable is posted

firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.firebase.perf.FirebasePerformanceAttributable;
2323
import com.google.firebase.perf.config.ConfigResolver;
2424
import com.google.firebase.perf.logging.AndroidLogger;
25+
import com.google.firebase.perf.session.SessionManager;
2526
import com.google.firebase.perf.transport.TransportManager;
2627
import com.google.firebase.perf.util.Constants;
2728
import com.google.firebase.perf.util.Timer;
@@ -52,12 +53,12 @@ public class HttpMetric implements FirebasePerformanceAttributable {
5253
* @hide
5354
*/
5455
public HttpMetric(
55-
String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) {
56+
String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) {
5657
customAttributesMap = new ConcurrentHashMap<>();
5758
this.timer = timer;
5859

5960
networkMetricBuilder =
60-
NetworkRequestMetricBuilder.builder(transportManager).setUrl(url).setHttpMethod(httpMethod);
61+
NetworkRequestMetricBuilder.builder(transportManager, sessionManager).setUrl(url).setHttpMethod(httpMethod);
6162
networkMetricBuilder.setManualNetworkRequestMetric();
6263

6364
if (!ConfigResolver.getInstance().isPerformanceMonitoringEnabled()) {
@@ -72,8 +73,8 @@ public HttpMetric(
7273
* @hide
7374
*/
7475
public HttpMetric(
75-
URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) {
76-
this(url.toString(), httpMethod, transportManager, timer);
76+
URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) {
77+
this(url.toString(), httpMethod, transportManager, timer, sessionManager);
7778
}
7879

7980
/**

0 commit comments

Comments
 (0)