1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 package org.mozilla.fenix.perf
7 import android.content.Context
8 import android.os.Bundle
9 import android.view.View
10 import androidx.fragment.app.Fragment
11 import androidx.fragment.app.FragmentManager
12 import mozilla.components.concept.engine.Engine
15 * Adds a profiler marker for each fragment lifecycle callbacks. The callbacks are called by the
16 * super method (e.g. [Fragment.onCreate] so the markers occur sometime during the execution of
17 * our implementation (e.g. [org.mozilla.fenix.home.HomeFragment.onCreate]) rather than at the
18 * beginning or end of that method.
20 @Suppress("TooManyFunctions") // it's the interface so we don't have a choice
21 class MarkersFragmentLifecycleCallbacks(
22 private val engine: Engine
23 ) : FragmentManager.FragmentLifecycleCallbacks() {
25 private fun shouldSkip(): Boolean {
26 return engine.profiler?.isProfilerActive() != true
29 override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) {
34 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onAttach (via callbacks)")
37 override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
42 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onPause (via callbacks)")
45 override fun onFragmentStopped(fm: FragmentManager, f: Fragment) {
50 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onStop (via callbacks)")
53 override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
58 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onDestroy (via callbacks)")
61 override fun onFragmentDetached(fm: FragmentManager, f: Fragment) {
66 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onDetach (via callbacks)")
69 override fun onFragmentCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
74 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onCreate (via callbacks)")
77 override fun onFragmentViewCreated(fm: FragmentManager, f: Fragment, v: View, savedInstanceState: Bundle?) {
82 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onViewCreated (via callbacks)")
85 override fun onFragmentStarted(fm: FragmentManager, f: Fragment) {
90 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onStart (via callbacks)")
93 override fun onFragmentResumed(fm: FragmentManager, f: Fragment) {
98 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onResume (via callbacks)")
101 override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
106 engine.profiler?.addMarker(MARKER_NAME, "${f::class.simpleName}.onViewDestroyed (via callbacks)")
110 const val MARKER_NAME = "Fragment Lifecycle"
112 fun register(supportFragmentManager: FragmentManager, engine: Engine) {
113 val callbacks = MarkersFragmentLifecycleCallbacks(engine)
115 // We do recursive because the NavHostFragment adds additional fragments as subfragments.
116 supportFragmentManager.registerFragmentLifecycleCallbacks(callbacks, true)