1910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales/* 2910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * Copyright (C) 2016 The Android Open Source Project 3910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * 4910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * Licensed under the Apache License, Version 2.0 (the "License"); 5910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * you may not use this file except in compliance with the License. 6910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * You may obtain a copy of the License at 7910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * 8910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * http://www.apache.org/licenses/LICENSE-2.0 9910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * 10910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * Unless required by applicable law or agreed to in writing, software 11910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * distributed under the License is distributed on an "AS IS" BASIS, 12910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * See the License for the specific language governing permissions and 14910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * limitations under the License. 15910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales */ 16910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 17910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralespackage android.view; 18910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 19910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport android.annotation.NonNull; 20910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport android.util.Log; 21910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport android.os.Looper; 22910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport android.os.MessageQueue; 23910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 24910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport com.android.internal.util.VirtualRefBasePtr; 25910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 26910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport java.lang.NullPointerException; 27910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport java.lang.ref.WeakReference; 28910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralesimport java.lang.SuppressWarnings; 29910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 30910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales/** 31910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * Provides streaming access to frame stats information from the rendering 32910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * subsystem to apps. 33910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * 34910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * @hide 35910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales */ 36910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Moralespublic class FrameMetricsObserver { 37910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales private MessageQueue mMessageQueue; 38910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 39910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales private WeakReference<Window> mWindow; 40910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 41910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales private FrameMetrics mFrameMetrics; 42910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 43d908c6294dc23b71575f74d4b49d2aacd982a427Andres Morales /* package */ Window.OnFrameMetricsAvailableListener mListener; 44910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales /* package */ VirtualRefBasePtr mNative; 45910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 46910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales /** 47910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * Creates a FrameMetricsObserver 48910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * 49910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales * @param looper the looper to use when invoking callbacks 50910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales */ 51910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales FrameMetricsObserver(@NonNull Window window, @NonNull Looper looper, 52d908c6294dc23b71575f74d4b49d2aacd982a427Andres Morales @NonNull Window.OnFrameMetricsAvailableListener listener) { 53910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales if (looper == null) { 54910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales throw new NullPointerException("looper cannot be null"); 55910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales } 56910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 57910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales mMessageQueue = looper.getQueue(); 58910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales if (mMessageQueue == null) { 59910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales throw new IllegalStateException("invalid looper, null message queue\n"); 60910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales } 61910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 62910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales mFrameMetrics = new FrameMetrics(); 63910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales mWindow = new WeakReference<>(window); 64910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales mListener = listener; 65910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales } 66910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales 67910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales // Called by native on the provided Handler 68910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales @SuppressWarnings("unused") 69910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales private void notifyDataAvailable(int dropCount) { 70910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales final Window window = mWindow.get(); 71910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales if (window != null) { 72d908c6294dc23b71575f74d4b49d2aacd982a427Andres Morales mListener.onFrameMetricsAvailable(window, mFrameMetrics, dropCount); 73910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales } 74910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales } 75910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales} 76