|
20 | 20 | import android.content.Context;
|
21 | 21 | import android.os.Bundle;
|
22 | 22 | import androidx.annotation.NonNull;
|
23 |
| -import androidx.core.app.FrameMetricsAggregator; |
24 | 23 | import androidx.fragment.app.FragmentActivity;
|
25 | 24 | import com.google.android.gms.common.util.VisibleForTesting;
|
26 | 25 | import com.google.firebase.perf.config.ConfigResolver;
|
@@ -57,7 +56,10 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks {
|
57 | 56 | private final boolean hasFrameMetricsAggregator;
|
58 | 57 |
|
59 | 58 | private final WeakHashMap<Activity, Boolean> activityToResumedMap = new WeakHashMap<>();
|
60 |
| - private final WeakHashMap<Activity, FrameMetricsRecorder> activityToRecorderMap = new WeakHashMap<>(); |
| 59 | + private final WeakHashMap<Activity, FrameMetricsRecorder> activityToRecorderMap = |
| 60 | + new WeakHashMap<>(); |
| 61 | + private final WeakHashMap<Activity, FragmentStateMonitor> activityToFragmentStateMonitorMap = |
| 62 | + new WeakHashMap<>(); |
61 | 63 | private final WeakHashMap<Activity, Trace> activityToScreenTraceMap = new WeakHashMap<>();
|
62 | 64 | private final Map<String, Long> metricToCountMap = new HashMap<>();
|
63 | 65 | private final Set<WeakReference<AppStateCallback>> appStateSubscribers = new HashSet<>();
|
@@ -90,11 +92,7 @@ public static AppStateMonitor getInstance() {
|
90 | 92 | }
|
91 | 93 |
|
92 | 94 | AppStateMonitor(TransportManager transportManager, Clock clock) {
|
93 |
| - this( |
94 |
| - transportManager, |
95 |
| - clock, |
96 |
| - ConfigResolver.getInstance(), |
97 |
| - hasFrameMetricsAggregatorClass()); |
| 95 | + this(transportManager, clock, ConfigResolver.getInstance(), hasFrameMetricsAggregatorClass()); |
98 | 96 | }
|
99 | 97 |
|
100 | 98 | AppStateMonitor(
|
@@ -153,19 +151,29 @@ public void incrementTsnsCount(int value) {
|
153 | 151 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
154 | 152 | if (isScreenTraceSupported() && configResolver.isPerformanceMonitoringEnabled()) {
|
155 | 153 | FrameMetricsRecorder recorder = new FrameMetricsRecorder(activity);
|
| 154 | + activityToRecorderMap.put(activity, recorder); |
156 | 155 | if (activity instanceof FragmentActivity) {
|
| 156 | + FragmentStateMonitor fragmentStateMonitor = |
| 157 | + new FragmentStateMonitor(clock, transportManager, this, recorder); |
| 158 | + activityToFragmentStateMonitorMap.put(activity, fragmentStateMonitor); |
157 | 159 | FragmentActivity fragmentActivity = (FragmentActivity) activity;
|
158 | 160 | fragmentActivity
|
159 | 161 | .getSupportFragmentManager()
|
160 |
| - .registerFragmentLifecycleCallbacks( |
161 |
| - new FragmentStateMonitor(clock, transportManager, this, recorder), |
162 |
| - true); |
| 162 | + .registerFragmentLifecycleCallbacks(fragmentStateMonitor, true); |
163 | 163 | }
|
164 | 164 | }
|
165 | 165 | }
|
166 | 166 |
|
167 | 167 | @Override
|
168 |
| - public void onActivityDestroyed(Activity activity) {} |
| 168 | + public void onActivityDestroyed(Activity activity) { |
| 169 | + activityToRecorderMap.remove(activity); |
| 170 | + if (activityToFragmentStateMonitorMap.containsKey(activity)) { |
| 171 | + FragmentActivity fragmentActivity = (FragmentActivity) activity; |
| 172 | + fragmentActivity |
| 173 | + .getSupportFragmentManager() |
| 174 | + .unregisterFragmentLifecycleCallbacks(activityToFragmentStateMonitorMap.remove(activity)); |
| 175 | + } |
| 176 | + } |
169 | 177 |
|
170 | 178 | @Override
|
171 | 179 | public synchronized void onActivityStarted(Activity activity) {
|
@@ -326,18 +334,16 @@ public void onActivityPaused(Activity activity) {}
|
326 | 334 | * @param activity activity object.
|
327 | 335 | */
|
328 | 336 | private void sendScreenTrace(Activity activity) {
|
329 |
| - if (!activityToScreenTraceMap.containsKey(activity)) { |
330 |
| - return; |
331 |
| - } |
332 | 337 | Trace screenTrace = activityToScreenTraceMap.get(activity);
|
333 | 338 | if (screenTrace == null) {
|
334 | 339 | return;
|
335 | 340 | }
|
336 | 341 | activityToScreenTraceMap.remove(activity);
|
337 | 342 |
|
338 |
| - Optional<FrameMetricsCalculator.PerfFrameMetrics> perfFrameMetrics = activityToRecorderMap.get(activity).stop(); |
| 343 | + Optional<FrameMetricsCalculator.PerfFrameMetrics> perfFrameMetrics = |
| 344 | + activityToRecorderMap.get(activity).stop(); |
339 | 345 | if (!perfFrameMetrics.isAvailable()) {
|
340 |
| - logger.warn("Failed to record frame data for %s", activity.getClass().getSimpleName()); |
| 346 | + logger.warn("Failed to record frame data for %s.", activity.getClass().getSimpleName()); |
341 | 347 | return;
|
342 | 348 | }
|
343 | 349 | ScreenTraceUtil.addFrameCounters(screenTrace, perfFrameMetrics.get());
|
|
0 commit comments