From df8b9e694891eca2c2305f85500f67531638e7ee Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Sun, 23 Nov 2025 14:11:04 -0600 Subject: [PATCH 1/2] Potential refactor --- .../google/firebase/perf/FirebasePerformance.java | 4 +--- .../google/firebase/perf/config/ConfigResolver.java | 13 +++++++++++-- .../firebase/perf/config/RemoteConfigManager.java | 8 +------- .../modules/FirebasePerformanceModule.java | 5 ----- .../firebase/perf/FirebasePerformanceTest.java | 9 +++++---- .../perf/config/RemoteConfigManagerTest.java | 4 ++-- 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java index 40468566225..a23bb2621cb 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java @@ -151,7 +151,6 @@ public static FirebasePerformance getInstance() { * @param firebaseRemoteConfigProvider The {@link Provider} for FirebaseRemoteConfig instance. * @param firebaseInstallationsApi The FirebaseInstallationsApi instance. * @param transportFactoryProvider The {@link Provider} for the the {@link TransportFactory}. - * @param remoteConfigManager The RemoteConfigManager instance. * @param configResolver The ConfigResolver instance. * @param sessionManager The SessionManager instance. */ @@ -162,7 +161,6 @@ public static FirebasePerformance getInstance() { Provider firebaseRemoteConfigProvider, FirebaseInstallationsApi firebaseInstallationsApi, Provider transportFactoryProvider, - RemoteConfigManager remoteConfigManager, ConfigResolver configResolver, SessionManager sessionManager) { @@ -185,8 +183,8 @@ public static FirebasePerformance getInstance() { // TODO(b/110178816): Explore moving off of main thread. mMetadataBundle = extractMetadata(appContext); - remoteConfigManager.setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver = configResolver; + this.configResolver.getRemoteConfigManager().setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver.setMetadataBundle(mMetadataBundle); this.configResolver.setApplicationContext(appContext); sessionManager.setApplicationContext(appContext); diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java index 5ac3ecfc282..c4c3418d05c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java @@ -58,7 +58,7 @@ public class ConfigResolver { private static volatile ConfigResolver instance; // Configuration Storage objects. - private final RemoteConfigManager remoteConfigManager; + private RemoteConfigManager remoteConfigManager; private ImmutableBundle metadataBundle; private DeviceCacheManager deviceCacheManager; @@ -75,7 +75,7 @@ public ConfigResolver( @Nullable ImmutableBundle metadataBundle, @Nullable DeviceCacheManager deviceCacheManager) { this.remoteConfigManager = - remoteConfigManager == null ? RemoteConfigManager.getInstance() : remoteConfigManager; + remoteConfigManager != null ? remoteConfigManager : new RemoteConfigManager(); this.metadataBundle = metadataBundle == null ? new ImmutableBundle() : metadataBundle; this.deviceCacheManager = deviceCacheManager == null ? DeviceCacheManager.getInstance() : deviceCacheManager; @@ -98,6 +98,11 @@ public void setDeviceCacheManager(DeviceCacheManager deviceCacheManager) { this.deviceCacheManager = deviceCacheManager; } + @VisibleForTesting + public void setRemoteConfigManager(RemoteConfigManager remoteConfigManager) { + this.remoteConfigManager = remoteConfigManager; + } + public void setContentProviderContext(Context context) { setApplicationContext(context.getApplicationContext()); } @@ -916,4 +921,8 @@ private boolean isGaugeCaptureFrequencyMsValid(long frequencyMilliseconds) { private boolean isSessionsMaxDurationMinutesValid(long maxDurationMin) { return maxDurationMin > 0; } + + public RemoteConfigManager getRemoteConfigManager() { + return remoteConfigManager; + } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java index 66b8ff8f804..db9738f905b 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java @@ -47,7 +47,6 @@ public class RemoteConfigManager { private static final AndroidLogger logger = AndroidLogger.getInstance(); - private static final RemoteConfigManager instance = new RemoteConfigManager(); private static final String FIREPERF_FRC_NAMESPACE_NAME = "fireperf"; private static final long TIME_AFTER_WHICH_A_FETCH_IS_CONSIDERED_STALE_MS = TimeUnit.HOURS.toMillis(12); @@ -67,7 +66,7 @@ public class RemoteConfigManager { // TODO(b/258263016): Migrate to go/firebase-android-executors @SuppressLint("ThreadPoolCreation") - private RemoteConfigManager() { + public RemoteConfigManager() { this( DeviceCacheManager.getInstance(), new ThreadPoolExecutor( @@ -96,11 +95,6 @@ private RemoteConfigManager() { this.remoteConfigFetchDelayInMs = remoteConfigFetchDelayInMs; } - /** Gets the singleton instance. */ - public static RemoteConfigManager getInstance() { - return instance; - } - /** * Sets the {@link Provider} for {@link RemoteConfigComponent} from which we can extract the * {@link FirebaseRemoteConfig} instance whenever it gets available. diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java index 799a6cdccd9..aad6c067def 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java @@ -66,11 +66,6 @@ Provider providesTransportFactoryProvider() { return transportFactoryProvider; } - @Provides - RemoteConfigManager providesRemoteConfigManager() { - return RemoteConfigManager.getInstance(); - } - @Provides ConfigResolver providesConfigResolver() { return ConfigResolver.getInstance(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java index cd41c5a3adf..deda4f79be2 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java @@ -63,7 +63,7 @@ public class FirebasePerformanceTest { "firebase_performance_collection_deactivated"; private static final String FIREPERF_ENABLED_KEY = "firebase_performance_collection_enabled"; - @Nullable private RemoteConfigManager spyRemoteConfigManager = null; + @Nullable private RemoteConfigManager spyRemoteConfigManager = spy(new RemoteConfigManager()); @Nullable private ConfigResolver spyConfigResolver = null; @Nullable private SessionManager spySessionManager = null; @@ -100,9 +100,10 @@ public void setUp() throws NameNotFoundException { sharedPreferences.edit().clear().commit(); DeviceCacheManager.clearInstance(); - spyRemoteConfigManager = spy(RemoteConfigManager.getInstance()); ConfigResolver.clearInstance(); - spyConfigResolver = spy(ConfigResolver.getInstance()); + ConfigResolver configResolver = ConfigResolver.getInstance(); + configResolver.setRemoteConfigManager(spyRemoteConfigManager); + spyConfigResolver = spy(configResolver); spySessionManager = spy(SessionManager.getInstance()); fakeDirectExecutorService = new FakeDirectExecutorService(); @@ -470,6 +471,7 @@ public void firebasePerformanceInitialization_providesRcProvider_remoteConfigMan () -> FirebaseApp.getInstance().get(TransportFactory.class)); verify(spyRemoteConfigManager).setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); + assertThat(spyRemoteConfigManager.isFirebaseRemoteConfigAvailable()).isTrue(); } @Test @@ -577,7 +579,6 @@ private FirebasePerformance initializeFirebasePerformancePreferences( firebaseRemoteConfigProvider, mock(FirebaseInstallationsApi.class), transportFactoryProvider, - spyRemoteConfigManager, spyConfigResolver, spySessionManager); } diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java index 3e1a9623adc..6f413b69c5a 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java @@ -76,8 +76,8 @@ public void setUp() { @Test public void getInstance_verifiesSingleton() { - RemoteConfigManager instanceOne = RemoteConfigManager.getInstance(); - RemoteConfigManager instanceTwo = RemoteConfigManager.getInstance(); + RemoteConfigManager instanceOne = ConfigResolver.getInstance().getRemoteConfigManager(); + RemoteConfigManager instanceTwo = ConfigResolver.getInstance().getRemoteConfigManager(); assertThat(instanceOne).isSameInstanceAs(instanceTwo); } From 663e59e4afecca69f1255cefb4a9f542e36f25e2 Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Mon, 8 Dec 2025 16:14:27 -0600 Subject: [PATCH 2/2] wip sessionmanager --- .../firebase/perf/FirebasePerfEarly.java | 7 ++-- .../firebase/perf/FirebasePerfRegistrar.java | 13 ++++++-- .../firebase/perf/FirebasePerformance.java | 10 +++--- .../perf/application/AppStateMonitor.java | 16 ++++++++-- .../application/FragmentStateMonitor.java | 8 +++-- .../components/SessionManagerComponent.java | 17 ++++++++++ .../modules/FirebasePerformanceModule.java | 7 ++-- .../modules/SessionManagerModule.java | 22 +++++++++++++ .../firebase/perf/metrics/AppStartTrace.java | 7 +++- .../firebase/perf/metrics/HttpMetric.java | 9 +++--- .../metrics/NetworkRequestMetricBuilder.java | 22 +++++++------ .../google/firebase/perf/metrics/Trace.java | 22 ++++++++----- .../perf/network/FirebasePerfHttpClient.java | 16 +++++----- .../network/FirebasePerfOkHttpClient.java | 7 ++-- .../network/FirebasePerfUrlConnection.java | 32 +++++++++++-------- .../InstrumentOkHttpEnqueueCallback.java | 6 ++-- .../firebase/perf/session/SessionManager.java | 10 +----- .../perf/transport/TransportManager.java | 10 ++++-- .../firebase/testing/sessions/MainActivity.kt | 1 + 19 files changed, 166 insertions(+), 76 deletions(-) create mode 100644 firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java create mode 100644 firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java index 5b89deaad82..613c991ec7f 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java @@ -34,7 +34,7 @@ public class FirebasePerfEarly { public FirebasePerfEarly( - FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor) { + FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor, SessionManager sessionManager) { Context context = app.getApplicationContext(); // Initialize ConfigResolver early for accessing device caching layer. @@ -42,21 +42,22 @@ public FirebasePerfEarly( configResolver.setApplicationContext(context); AppStateMonitor appStateMonitor = AppStateMonitor.getInstance(); + appStateMonitor.setSessionManager(sessionManager); appStateMonitor.registerActivityLifecycleCallbacks(context); appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer()); if (startupTime != null) { AppStartTrace appStartTrace = AppStartTrace.getInstance(); + appStartTrace.setSessionManager(sessionManager); appStartTrace.registerActivityLifecycleCallbacks(context); uiExecutor.execute(new AppStartTrace.StartFromBackgroundRunnable(appStartTrace)); } - // TODO: Bring back Firebase Sessions dependency to watch for updates to sessions. // In the case of cold start, we create a session and start collecting gauges as early as // possible. // There is code in SessionManager that prevents us from resetting the session twice in case // of app cold start. - SessionManager.getInstance().initializeGaugeCollection(); + sessionManager.initializeGaugeCollection(); } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java index c01f035af1f..ed0b7a1b68c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java @@ -26,8 +26,12 @@ import com.google.firebase.components.Qualified; import com.google.firebase.installations.FirebaseInstallationsApi; import com.google.firebase.perf.injection.components.DaggerFirebasePerformanceComponent; +import com.google.firebase.perf.injection.components.DaggerSessionManagerComponent; import com.google.firebase.perf.injection.components.FirebasePerformanceComponent; +import com.google.firebase.perf.injection.components.SessionManagerComponent; import com.google.firebase.perf.injection.modules.FirebasePerformanceModule; +import com.google.firebase.perf.injection.modules.SessionManagerModule; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.platforminfo.LibraryVersionComponent; import com.google.firebase.remoteconfig.RemoteConfigComponent; import java.util.Arrays; @@ -59,6 +63,7 @@ public List> getComponents() { .add(Dependency.required(FirebaseInstallationsApi.class)) .add(Dependency.requiredProvider(TransportFactory.class)) .add(Dependency.required(FirebasePerfEarly.class)) + .add(Dependency.required(SessionManager.class)) .factory(FirebasePerfRegistrar::providesFirebasePerformance) .build(), Component.builder(FirebasePerfEarly.class) @@ -66,14 +71,17 @@ public List> getComponents() { .add(Dependency.required(FirebaseApp.class)) .add(Dependency.optionalProvider(StartupTime.class)) .add(Dependency.required(uiExecutor)) + .add(Dependency.required(SessionManager.class)) .eagerInDefaultApp() .factory( container -> new FirebasePerfEarly( container.get(FirebaseApp.class), container.getProvider(StartupTime.class).get(), - container.get(uiExecutor))) + container.get(uiExecutor), + container.get(SessionManager.class))) .build(), + Component.builder(SessionManager.class).factory(container -> new SessionManager()).build(), /** * Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link * com.google.firebase.perf.application.AppStateMonitor#onActivityResumed(Activity)}. we use @@ -94,7 +102,8 @@ private static FirebasePerformance providesFirebasePerformance(ComponentContaine container.get(FirebaseApp.class), container.get(FirebaseInstallationsApi.class), container.getProvider(RemoteConfigComponent.class), - container.getProvider(TransportFactory.class))) + container.getProvider(TransportFactory.class), + container.get(SessionManager.class))) .build(); return component.getFirebasePerformance(); diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java index a23bb2621cb..f752f6a6767 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java @@ -140,6 +140,7 @@ public static FirebasePerformance getInstance() { private final Provider firebaseRemoteConfigProvider; private final FirebaseInstallationsApi firebaseInstallationsApi; private final Provider transportFactoryProvider; + private final SessionManager sessionManager; /** * Constructs the FirebasePerformance class and allows injecting dependencies. @@ -168,6 +169,7 @@ public static FirebasePerformance getInstance() { this.firebaseRemoteConfigProvider = firebaseRemoteConfigProvider; this.firebaseInstallationsApi = firebaseInstallationsApi; this.transportFactoryProvider = transportFactoryProvider; + this.sessionManager = sessionManager; if (firebaseApp == null) { this.mPerformanceCollectionForceEnabledState = false; @@ -177,7 +179,7 @@ public static FirebasePerformance getInstance() { } TransportManager.getInstance() - .initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider); + .initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager); Context appContext = firebaseApp.getApplicationContext(); // TODO(b/110178816): Explore moving off of main thread. @@ -187,7 +189,7 @@ public static FirebasePerformance getInstance() { this.configResolver.getRemoteConfigManager().setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver.setMetadataBundle(mMetadataBundle); this.configResolver.setApplicationContext(appContext); - sessionManager.setApplicationContext(appContext); + this.sessionManager.setApplicationContext(appContext); mPerformanceCollectionForceEnabledState = configResolver.getIsPerformanceCollectionEnabled(); if (logger.isLogcatEnabled() && isPerformanceCollectionEnabled()) { @@ -423,7 +425,7 @@ public Trace newTrace(@NonNull String traceName) { */ @NonNull public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String httpMethod) { - return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer()); + return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager); } /** @@ -436,7 +438,7 @@ public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String */ @NonNull public HttpMetric newHttpMetric(@NonNull URL url, @NonNull @HttpMethod String httpMethod) { - return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer()); + return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager); } /** diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java index b014d82bb83..4f9941fd83c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java @@ -80,6 +80,8 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks { private boolean isRegisteredForLifecycleCallbacks = false; private boolean isColdStart = true; + private SessionManager sessionManager; + public static AppStateMonitor getInstance() { if (instance == null) { synchronized (AppStateMonitor.class) { @@ -159,7 +161,7 @@ private void startFrameMonitoring(Activity activity) { activityToRecorderMap.put(activity, recorder); if (activity instanceof FragmentActivity) { FragmentStateMonitor fragmentStateMonitor = - new FragmentStateMonitor(clock, transportManager, this, recorder); + new FragmentStateMonitor(clock, transportManager, this, recorder, sessionManager); activityToFragmentStateMonitorMap.put(activity, fragmentStateMonitor); FragmentActivity fragmentActivity = (FragmentActivity) activity; fragmentActivity @@ -198,7 +200,7 @@ public synchronized void onActivityStarted(Activity activity) { // Starts recording frame metrics for this activity. activityToRecorderMap.get(activity).start(); // Start the Trace - Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this); + Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this, sessionManager); screenTrace.start(); activityToScreenTraceMap.put(activity, screenTrace); } @@ -379,7 +381,7 @@ private void sendSessionLog(String name, Timer startTime, Timer endTime) { .setName(name) .setClientStartTimeUs(startTime.getMicros()) .setDurationUs(startTime.getDurationMicros(endTime)) - .addPerfSessions(SessionManager.getInstance().perfSession().build()); + .addPerfSessions(sessionManager.perfSession().build()); // Atomically get mTsnsCount and set it to zero. int tsnsCount = this.tsnsCount.getAndSet(0); synchronized (metricToCountMap) { @@ -463,4 +465,12 @@ Timer getResumeTime() { public void setIsColdStart(boolean isColdStart) { this.isColdStart = isColdStart; } + + public SessionManager getSessionManager() { + return sessionManager; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java index fba6cb0907a..1e1f08ceb44 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java @@ -21,6 +21,7 @@ import com.google.firebase.perf.logging.AndroidLogger; import com.google.firebase.perf.metrics.FrameMetricsCalculator.PerfFrameMetrics; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -33,6 +34,7 @@ public class FragmentStateMonitor extends FragmentManager.FragmentLifecycleCallb private final WeakHashMap fragmentToTraceMap = new WeakHashMap<>(); private final Clock clock; private final TransportManager transportManager; + private final SessionManager sessionManager; private final AppStateMonitor appStateMonitor; private final FrameMetricsRecorder activityFramesRecorder; @@ -40,11 +42,13 @@ public FragmentStateMonitor( Clock clock, TransportManager transportManager, AppStateMonitor appStateMonitor, - FrameMetricsRecorder recorder) { + FrameMetricsRecorder recorder, + SessionManager sessionManager) { this.clock = clock; this.transportManager = transportManager; this.appStateMonitor = appStateMonitor; this.activityFramesRecorder = recorder; + this.sessionManager = sessionManager; } /** @@ -63,7 +67,7 @@ public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) // Start Fragment screen trace logger.debug("FragmentMonitor %s.onFragmentResumed", f.getClass().getSimpleName()); Trace fragmentTrace = - new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor); + new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor, sessionManager); fragmentTrace.start(); fragmentTrace.putAttribute( diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java new file mode 100644 index 00000000000..cb567970bca --- /dev/null +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java @@ -0,0 +1,17 @@ +package com.google.firebase.perf.injection.components; + +import androidx.annotation.NonNull; + +import com.google.firebase.perf.injection.modules.SessionManagerModule; +import com.google.firebase.perf.session.SessionManager; + +import javax.inject.Singleton; + +import dagger.Component; + +@Component(modules = {SessionManagerModule.class}) +@Singleton +public interface SessionManagerComponent { + @NonNull + SessionManager getSessionManager(); +} diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java index aad6c067def..a8cd8881d70 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java @@ -34,16 +34,19 @@ public class FirebasePerformanceModule { private final FirebaseInstallationsApi firebaseInstallations; private final Provider remoteConfigComponentProvider; private final Provider transportFactoryProvider; + private final SessionManager sessionManager; public FirebasePerformanceModule( @NonNull FirebaseApp firebaseApp, @NonNull FirebaseInstallationsApi firebaseInstallations, @NonNull Provider remoteConfigComponentProvider, - @NonNull Provider transportFactoryProvider) { + @NonNull Provider transportFactoryProvider, + @NonNull SessionManager sessionManager) { this.firebaseApp = firebaseApp; this.firebaseInstallations = firebaseInstallations; this.remoteConfigComponentProvider = remoteConfigComponentProvider; this.transportFactoryProvider = transportFactoryProvider; + this.sessionManager = sessionManager; } @Provides @@ -73,6 +76,6 @@ ConfigResolver providesConfigResolver() { @Provides SessionManager providesSessionManager() { - return SessionManager.getInstance(); + return sessionManager; } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java new file mode 100644 index 00000000000..d2d46ec0ee9 --- /dev/null +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java @@ -0,0 +1,22 @@ +package com.google.firebase.perf.injection.modules; + +import androidx.annotation.NonNull; + +import com.google.firebase.perf.session.SessionManager; + +import dagger.Module; +import dagger.Provides; + +@Module +public class SessionManagerModule { + private final SessionManager sessionManager; + + public SessionManagerModule(@NonNull SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + @Provides + SessionManager providesSessionManager() { + return sessionManager; + } +} diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java index 813c8988383..f91c12fc62c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java @@ -92,6 +92,7 @@ public class AppStartTrace implements ActivityLifecycleCallbacks, LifecycleObser private final ConfigResolver configResolver; private final TraceMetric.Builder experimentTtid; private Context appContext; + private SessionManager sessionManager; /** * 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) { appStartActivity = new WeakReference(activity); onResumeTime = clock.getTime(); - this.startSession = SessionManager.getInstance().perfSession(); + this.startSession = sessionManager.perfSession(); AndroidLogger.getInstance() .debug( "onResume(): " @@ -572,6 +573,10 @@ public static boolean isAnyAppProcessInForeground(Context appContext) { return false; } + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + /** * We use StartFromBackgroundRunnable to detect if app is started from background or foreground. * If app is started from background, we do not generate AppStart trace. This runnable is posted diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java index 04177ba30ee..a390bf71902 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java @@ -22,6 +22,7 @@ import com.google.firebase.perf.FirebasePerformanceAttributable; import com.google.firebase.perf.config.ConfigResolver; import com.google.firebase.perf.logging.AndroidLogger; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.Timer; @@ -52,12 +53,12 @@ public class HttpMetric implements FirebasePerformanceAttributable { * @hide */ public HttpMetric( - String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) { + String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) { customAttributesMap = new ConcurrentHashMap<>(); this.timer = timer; networkMetricBuilder = - NetworkRequestMetricBuilder.builder(transportManager).setUrl(url).setHttpMethod(httpMethod); + NetworkRequestMetricBuilder.builder(transportManager, sessionManager).setUrl(url).setHttpMethod(httpMethod); networkMetricBuilder.setManualNetworkRequestMetric(); if (!ConfigResolver.getInstance().isPerformanceMonitoringEnabled()) { @@ -72,8 +73,8 @@ public HttpMetric( * @hide */ public HttpMetric( - URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) { - this(url.toString(), httpMethod, transportManager, timer); + URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) { + this(url.toString(), httpMethod, transportManager, timer, sessionManager); } /** diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java index 1e04744d1b2..f1d8e9a7494 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java @@ -56,6 +56,7 @@ public final class NetworkRequestMetricBuilder extends AppStateUpdateHandler // TODO(b/177317027): Consider using a Set to avoid adding same PerfSession object private final List sessions; private final GaugeManager gaugeManager; + private final SessionManager sessionManager; private final TransportManager transportManager; private final NetworkRequestMetric.Builder builder = NetworkRequestMetric.newBuilder(); @@ -80,16 +81,16 @@ public void updateSession(PerfSession session) { } /** Creates and returns a {@link NetworkRequestMetricBuilder} object. */ - public static NetworkRequestMetricBuilder builder(TransportManager transportManager) { - return new NetworkRequestMetricBuilder(transportManager); + public static NetworkRequestMetricBuilder builder(TransportManager transportManager, SessionManager sessionManager) { + return new NetworkRequestMetricBuilder(transportManager, sessionManager); } /** * SDK facing constructor which calls constructor with AppStateMonitor and GaugeManager to * initialize them. */ - private NetworkRequestMetricBuilder(TransportManager transportManager) { - this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance()); + private NetworkRequestMetricBuilder(TransportManager transportManager, SessionManager sessionManager) { + this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance(), sessionManager); } /** @@ -99,11 +100,13 @@ private NetworkRequestMetricBuilder(TransportManager transportManager) { public NetworkRequestMetricBuilder( TransportManager transportManager, AppStateMonitor appStateMonitor, - GaugeManager gaugeManager) { + GaugeManager gaugeManager, + SessionManager sessionManager) { super(appStateMonitor); this.transportManager = transportManager; this.gaugeManager = gaugeManager; + this.sessionManager = sessionManager; sessions = Collections.synchronizedList(new ArrayList<>()); registerForAppState(); @@ -227,9 +230,8 @@ public NetworkRequestMetricBuilder setCustomAttributes(Map attri * @see PerfSession#isGaugeAndEventCollectionEnabled() */ public NetworkRequestMetricBuilder setRequestStartTimeMicros(long time) { - SessionManager sessionManager = SessionManager.getInstance(); PerfSession perfSession = sessionManager.perfSession(); - SessionManager.getInstance().registerForSessionUpdates(weakReference); + sessionManager.registerForSessionUpdates(weakReference); builder.setClientStartTimeUs(time); updateSession(perfSession); @@ -270,8 +272,8 @@ public long getTimeToResponseInitiatedMicros() { public NetworkRequestMetricBuilder setTimeToResponseCompletedMicros(long time) { builder.setTimeToResponseCompletedUs(time); - if (SessionManager.getInstance().perfSession().isGaugeAndEventCollectionEnabled()) { - gaugeManager.collectGaugeMetricOnce(SessionManager.getInstance().perfSession().getTimer()); + if (sessionManager.perfSession().isGaugeAndEventCollectionEnabled()) { + gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer()); } return this; @@ -309,7 +311,7 @@ public NetworkRequestMetricBuilder setNetworkClientErrorReason() { /** Builds the current {@link NetworkRequestMetric}. */ public NetworkRequestMetric build() { - SessionManager.getInstance().unregisterForSessionUpdates(weakReference); + sessionManager.unregisterForSessionUpdates(weakReference); unregisterForAppState(); com.google.firebase.perf.v1.PerfSession[] perfSessions = diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java index 91e5f44b4a0..5cc7aa86630 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java @@ -24,6 +24,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; + +import com.google.firebase.perf.FirebasePerformance; import com.google.firebase.perf.FirebasePerformanceAttributable; import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.application.AppStateUpdateHandler; @@ -57,6 +59,7 @@ public class Trace extends AppStateUpdateHandler private final Trace parent; private final GaugeManager gaugeManager; + private final SessionManager sessionManager; private final String name; private final Map counterNameToCounterMap; @@ -138,6 +141,7 @@ private Trace( transportManager = parent.transportManager; sessions = Collections.synchronizedList(new ArrayList<>()); gaugeManager = this.parent.gaugeManager; + sessionManager = this.parent.sessionManager; } /** @@ -150,7 +154,8 @@ public Trace( @NonNull String name, @NonNull TransportManager transportManager, @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor) { + @NonNull AppStateMonitor appStateMonitor + ) { this(name, transportManager, clock, appStateMonitor, GaugeManager.getInstance()); } @@ -176,6 +181,7 @@ public Trace( this.transportManager = transportManager; sessions = Collections.synchronizedList(new ArrayList<>()); this.gaugeManager = gaugeManager; + this.sessionManager = transportManager.getSessionManager(); } private Trace(@NonNull Parcel in, boolean isDataOnly) { @@ -201,6 +207,7 @@ private Trace(@NonNull Parcel in, boolean isDataOnly) { clock = new Clock(); gaugeManager = GaugeManager.getInstance(); } + sessionManager = TransportManager.getInstance().getSessionManager(); } /** Starts this trace. */ @@ -227,9 +234,8 @@ public void start() { registerForAppState(); - SessionManager sessionManager = SessionManager.getInstance(); PerfSession perfSession = sessionManager.perfSession(); - SessionManager.getInstance().registerForSessionUpdates(sessionAwareObject); + sessionManager.registerForSessionUpdates(sessionAwareObject); updateSession(perfSession); @@ -250,7 +256,7 @@ public void stop() { return; } - SessionManager.getInstance().unregisterForSessionUpdates(sessionAwareObject); + sessionManager.unregisterForSessionUpdates(sessionAwareObject); unregisterForAppState(); endTime = clock.getTime(); @@ -259,9 +265,8 @@ public void stop() { if (!name.isEmpty()) { transportManager.log(new TraceMetricBuilder(this).build(), getAppState()); - if (SessionManager.getInstance().perfSession().isGaugeAndEventCollectionEnabled()) { - gaugeManager.collectGaugeMetricOnce( - SessionManager.getInstance().perfSession().getTimer()); + if (sessionManager.perfSession().isGaugeAndEventCollectionEnabled()) { + gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer()); } } else { logger.error("Trace name is empty, no log is sent to server"); @@ -432,7 +437,8 @@ static synchronized Trace getTrace( @NonNull String traceName, @NonNull TransportManager transportManager, @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor) { + @NonNull AppStateMonitor appStateMonitor, + @NonNull SessionManager sessionManager) { Trace trace = traceNameToTraceMap.get(traceName); if (trace == null) { trace = diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java index 58027613b76..40c75e7df16 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java @@ -176,7 +176,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -224,7 +224,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -272,7 +272,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -309,7 +309,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -347,7 +347,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -399,7 +399,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -450,7 +450,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -492,7 +492,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java index 6f53b7aa1bd..f5f5b5cc5f5 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java @@ -16,6 +16,7 @@ import androidx.annotation.Keep; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import java.io.IOException; @@ -37,7 +38,7 @@ private FirebasePerfOkHttpClient() {} public static Response execute(final Call call) throws IOException { final Response response; NetworkRequestMetricBuilder builder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /*, sessionManager = */ null); Timer timer = new Timer(); long startTimeMicros = timer.getMicros(); try { @@ -65,12 +66,12 @@ public static Response execute(final Call call) throws IOException { } @Keep - public static void enqueue(final Call call, final Callback callback) { + public static void enqueue(final Call call, final Callback callback, final SessionManager sessionManager) { Timer timer = new Timer(); long startTime = timer.getMicros(); call.enqueue( new InstrumentOkHttpEnqueueCallback( - callback, TransportManager.getInstance(), timer, startTime)); + callback, TransportManager.getInstance(), timer, startTime, sessionManager)); } static void sendNetworkMetric( diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java index 07f58bdee1b..535a82b3efe 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java @@ -16,6 +16,7 @@ import androidx.annotation.Keep; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.util.URLWrapper; @@ -32,7 +33,11 @@ */ public class FirebasePerfUrlConnection { - private FirebasePerfUrlConnection() {} + private final SessionManager sessionManager; + + private FirebasePerfUrlConnection(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } // Bytecode instrumented functions /** @@ -44,7 +49,7 @@ private FirebasePerfUrlConnection() {} */ @Keep public static InputStream openStream(final URL url) throws IOException { - return openStream(new URLWrapper(url), TransportManager.getInstance(), new Timer()); + return openStream(new URLWrapper(url), TransportManager.getInstance(), new Timer(), /* sessionManager = */ null); } // Functions to collect information for the Network Request Metric @@ -56,14 +61,14 @@ public static InputStream openStream(final URL url) throws IOException { * @throws IOException if there is a problem with opening the connection or using the connection * to open a stream */ - static InputStream openStream(URLWrapper wrapper, TransportManager transportManager, Timer timer) + static InputStream openStream(URLWrapper wrapper, TransportManager transportManager, Timer timer, SessionManager sessionManager) throws IOException { if (!TransportManager.getInstance().isInitialized()) { return wrapper.openConnection().getInputStream(); } timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -92,7 +97,7 @@ static InputStream openStream(URLWrapper wrapper, TransportManager transportMana */ @Keep public static Object getContent(final URL url) throws IOException { - return getContent(new URLWrapper(url), TransportManager.getInstance(), new Timer()); + return getContent(new URLWrapper(url), TransportManager.getInstance(), new Timer(), /* sessionManager = */ null); } /** @@ -103,9 +108,9 @@ public static Object getContent(final URL url) throws IOException { * to get the content */ @Keep - public static Object getContent(final URL url, @SuppressWarnings("rawtypes") final Class[] types) + public static Object getContent(final URL url, @SuppressWarnings("rawtypes") final Class[] types, final SessionManager sessionManager) throws IOException { - return getContent(new URLWrapper(url), types, TransportManager.getInstance(), new Timer()); + return getContent(new URLWrapper(url), types, TransportManager.getInstance(), new Timer(), sessionManager); } /** @@ -115,11 +120,11 @@ public static Object getContent(final URL url, @SuppressWarnings("rawtypes") fin * @throws IOException if there is a problem with opening the connection or using the connection * to get the content */ - static Object getContent(final URLWrapper wrapper, TransportManager transportManager, Timer timer) + static Object getContent(final URLWrapper wrapper, TransportManager transportManager, Timer timer, SessionManager sessionManager) throws IOException { timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -150,11 +155,12 @@ static Object getContent( final URLWrapper wrapper, @SuppressWarnings("rawtypes") final Class[] types, TransportManager transportManager, - Timer timer) + Timer timer, + SessionManager sessionManager) throws IOException { timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -186,12 +192,12 @@ public static Object instrument(Object connection) throws IOException { return new InstrHttpsURLConnection( (HttpsURLConnection) connection, new Timer(), - NetworkRequestMetricBuilder.builder(TransportManager.getInstance())); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /* sessionManager = */ null)); } else if (connection instanceof HttpURLConnection) { return new InstrHttpURLConnection( (HttpURLConnection) connection, new Timer(), - NetworkRequestMetricBuilder.builder(TransportManager.getInstance())); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /* sessionManager = */ null)); } return connection; } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java index 1a94758c011..b40b3d146a6 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java @@ -15,6 +15,7 @@ package com.google.firebase.perf.network; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import java.io.IOException; @@ -37,9 +38,10 @@ public InstrumentOkHttpEnqueueCallback( final Callback callback, final TransportManager transportManager, Timer timer, - long startTime) { + long startTime, + final SessionManager sessionManager) { this.callback = callback; - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); startTimeMicros = startTime; this.timer = timer; } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java index 79d034b9b0b..7e81ec8f0e7 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java @@ -37,9 +37,6 @@ @Keep // Needed because of b/117526359. public class SessionManager extends AppStateUpdateHandler { - @SuppressLint("StaticFieldLeak") - private static final SessionManager instance = new SessionManager(); - private final GaugeManager gaugeManager; private final AppStateMonitor appStateMonitor; private final Set> clients = new HashSet<>(); @@ -47,17 +44,12 @@ public class SessionManager extends AppStateUpdateHandler { private PerfSession perfSession; private Future syncInitFuture; - /** Returns the singleton instance of SessionManager. */ - public static SessionManager getInstance() { - return instance; - } - /** Returns the currently active PerfSession. */ public final PerfSession perfSession() { return perfSession; } - private SessionManager() { + public SessionManager() { // Generate a new sessionID for every cold start. this( GaugeManager.getInstance(), diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java index 9600b099a6d..d9f74edd436 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java @@ -114,6 +114,7 @@ public class TransportManager implements AppStateCallback { @Nullable private FirebasePerformance firebasePerformance; private FirebaseInstallationsApi firebaseInstallationsApi; private Provider flgTransportFactoryProvider; + private SessionManager sessionManager; private FlgTransport flgTransport; private ExecutorService executorService; private Context appContext; @@ -197,12 +198,14 @@ void initializeForTest( public void initialize( @NonNull FirebaseApp firebaseApp, @NonNull FirebaseInstallationsApi firebaseInstallationsApi, - @NonNull Provider flgTransportFactoryProvider) { + @NonNull Provider flgTransportFactoryProvider, + @NonNull SessionManager sessionManager) { this.firebaseApp = firebaseApp; projectId = firebaseApp.getOptions().getProjectId(); this.firebaseInstallationsApi = firebaseInstallationsApi; this.flgTransportFactoryProvider = flgTransportFactoryProvider; + this.sessionManager = sessionManager; // Run initialization in background thread this.executorService.execute(this::syncInit); @@ -382,7 +385,7 @@ private void syncLog(PerfMetric.Builder perfMetricBuilder, ApplicationProcessSta dispatchLog(perfMetric); // Check if the session is expired. If so, stop gauge collection. - SessionManager.getInstance().stopGaugeCollectionIfSessionRunningTooLong(); + sessionManager.stopGaugeCollectionIfSessionRunningTooLong(); } } @@ -662,6 +665,9 @@ private String getConsoleUrl(TraceMetric traceMetric) { } } + public SessionManager getSessionManager() { + return sessionManager; + } // endregion // region Visible for Testing diff --git a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt index ac41d11d73e..80a8c5e6602 100644 --- a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt +++ b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt @@ -17,6 +17,7 @@ package com.google.firebase.testing.sessions import android.os.Bundle +import com.google.firebase.perf.config.ConfigResolver import com.google.firebase.testing.sessions.databinding.ActivityMainBinding class MainActivity : BaseActivity() {