Files
rr3-apk/decompiled-community/sources/com/google/firebase/perf/application/FragmentStateMonitor.java
Daniel Elliott c080f0d97f Add Discord community version (64-bit only)
- Added realracing3-community.apk (71.57 MB)
- Removed 32-bit support (armeabi-v7a)
- Only includes arm64-v8a libraries
- Decompiled source code included
- Added README-community.md with analysis
2026-02-18 15:48:36 -08:00

75 lines
3.7 KiB
Java

package com.google.firebase.perf.application;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.google.firebase.perf.logging.AndroidLogger;
import com.google.firebase.perf.metrics.FrameMetricsCalculator;
import com.google.firebase.perf.metrics.Trace;
import com.google.firebase.perf.transport.TransportManager;
import com.google.firebase.perf.util.Clock;
import com.google.firebase.perf.util.Optional;
import com.google.firebase.perf.util.ScreenTraceUtil;
import java.util.WeakHashMap;
/* loaded from: classes3.dex */
public class FragmentStateMonitor extends FragmentManager.FragmentLifecycleCallbacks {
private static final AndroidLogger logger = AndroidLogger.getInstance();
private final FrameMetricsRecorder activityFramesRecorder;
private final AppStateMonitor appStateMonitor;
private final Clock clock;
private final WeakHashMap<Fragment, Trace> fragmentToTraceMap = new WeakHashMap<>();
private final TransportManager transportManager;
@VisibleForTesting
public WeakHashMap<Fragment, Trace> getFragmentToTraceMap() {
return this.fragmentToTraceMap;
}
public FragmentStateMonitor(Clock clock, TransportManager transportManager, AppStateMonitor appStateMonitor, FrameMetricsRecorder frameMetricsRecorder) {
this.clock = clock;
this.transportManager = transportManager;
this.appStateMonitor = appStateMonitor;
this.activityFramesRecorder = frameMetricsRecorder;
}
public String getFragmentScreenTraceName(Fragment fragment) {
return "_st_" + fragment.getClass().getSimpleName();
}
@Override // androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
public void onFragmentResumed(@NonNull FragmentManager fragmentManager, @NonNull Fragment fragment) {
super.onFragmentResumed(fragmentManager, fragment);
logger.debug("FragmentMonitor %s.onFragmentResumed", fragment.getClass().getSimpleName());
Trace trace = new Trace(getFragmentScreenTraceName(fragment), this.transportManager, this.clock, this.appStateMonitor);
trace.start();
trace.putAttribute("Parent_fragment", fragment.getParentFragment() == null ? "No parent" : fragment.getParentFragment().getClass().getSimpleName());
if (fragment.getActivity() != null) {
trace.putAttribute("Hosting_activity", fragment.getActivity().getClass().getSimpleName());
}
this.fragmentToTraceMap.put(fragment, trace);
this.activityFramesRecorder.startFragment(fragment);
}
@Override // androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
public void onFragmentPaused(@NonNull FragmentManager fragmentManager, @NonNull Fragment fragment) {
super.onFragmentPaused(fragmentManager, fragment);
AndroidLogger androidLogger = logger;
androidLogger.debug("FragmentMonitor %s.onFragmentPaused ", fragment.getClass().getSimpleName());
if (!this.fragmentToTraceMap.containsKey(fragment)) {
androidLogger.warn("FragmentMonitor: missed a fragment trace from %s", fragment.getClass().getSimpleName());
return;
}
Trace trace = this.fragmentToTraceMap.get(fragment);
this.fragmentToTraceMap.remove(fragment);
Optional stopFragment = this.activityFramesRecorder.stopFragment(fragment);
if (!stopFragment.isAvailable()) {
androidLogger.warn("onFragmentPaused: recorder failed to trace %s", fragment.getClass().getSimpleName());
} else {
ScreenTraceUtil.addFrameCounters(trace, (FrameMetricsCalculator.PerfFrameMetrics) stopFragment.get());
trace.stop();
}
}
}