1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.jank_tracker; 6 7 import android.view.Window; 8 9 import org.chromium.base.Log; 10 11 /** 12 * A simple holder class to enable easy starting and stopping of metric listening as well as 13 * periodic reporting. This is used by JankTrackerImpl to hold the listener reference and this class 14 * should be hooked up to some sort of listener to when to start/stop listening and periodic 15 * metrics. 16 */ 17 public class JankTrackerStateController { 18 private static final String TAG = "JankTracker"; 19 protected final FrameMetricsListener mFrameMetricsListener; 20 protected final JankReportingScheduler mReportingScheduler; 21 JankTrackerStateController( FrameMetricsListener listener, JankReportingScheduler scheduler)22 public JankTrackerStateController( 23 FrameMetricsListener listener, JankReportingScheduler scheduler) { 24 mFrameMetricsListener = listener; 25 mReportingScheduler = scheduler; 26 } 27 startPeriodicReporting()28 public void startPeriodicReporting() { 29 mReportingScheduler.startReportingPeriodicMetrics(); 30 } 31 stopPeriodicReporting()32 public void stopPeriodicReporting() { 33 mReportingScheduler.stopReportingPeriodicMetrics(); 34 } 35 startMetricCollection(Window window)36 public void startMetricCollection(Window window) { 37 mFrameMetricsListener.setIsListenerRecording(true); 38 if (window != null) { 39 window.addOnFrameMetricsAvailableListener( 40 mFrameMetricsListener, mReportingScheduler.getOrCreateHandler()); 41 } 42 } 43 stopMetricCollection(Window window)44 public void stopMetricCollection(Window window) { 45 mFrameMetricsListener.setIsListenerRecording(false); 46 if (window != null) { 47 try { 48 window.removeOnFrameMetricsAvailableListener(mFrameMetricsListener); 49 } catch (IllegalArgumentException e) { 50 // Adding the listener failed for whatever reason, so it could not be unregistered. 51 Log.e( 52 TAG, 53 "Could not remove listener %s from window %s", 54 mFrameMetricsListener, 55 window); 56 } 57 } 58 } 59 60 // Extra methods for subclasses that need to perform extra work on initialization/destruction. initialize()61 public void initialize() {} 62 destroy()63 public void destroy() {} 64 } 65