diff options
| author | Siarhei Vishniakou <svv@google.com> | 2020-11-30 10:30:52 -1000 |
|---|---|---|
| committer | Siarhei Vishniakou <svv@google.com> | 2020-12-01 15:07:50 -1000 |
| commit | efed16630a8cf71287f04cde5dc59c4e0db1d987 (patch) | |
| tree | 7d9c798140281a901d8e6ab0607b594fe48e394b /core/java/android/view/ViewFrameInfo.java | |
| parent | 26ca287da728d88709f7523113637104fb31bf3e (diff) | |
Track per-window information in ViewFrameInfo
FrameInfo will now be per-window; that is, per-ViewRootImpl.
Some of the information should remain “global” (it remain in Choreographer),
while some information is going to become ViewRootImpl-specific.
Before the information gets passed to the native layer,
the ViewRootImpl-specific info will be stitched together
with the general Choreographer info.
This change is useful in order to correctly correlate frames with a specific
input event. In the unlikely scenario of a user touching two windows of the
same app simultaneously, this change will allow us to correctly measure the
latency of both frames produced by the windows.
Design doc: https://docs.google.com/document/d/1KMpMBlOxnl7zkWBCbXZZE6ZlaHEA4efYnN6WYK8n3FE/edit?resourcekey=0-eqooVNP0SskupljlTFvtOQ
Test: atest ViewFrameInfoTest
Bug: 169866723
Change-Id: Ib0bf9cd51cbcc0b9b70460c929c480eb490ec322
Diffstat (limited to 'core/java/android/view/ViewFrameInfo.java')
| -rw-r--r-- | core/java/android/view/ViewFrameInfo.java | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/core/java/android/view/ViewFrameInfo.java b/core/java/android/view/ViewFrameInfo.java new file mode 100644 index 000000000000..890d071f8090 --- /dev/null +++ b/core/java/android/view/ViewFrameInfo.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.graphics.FrameInfo; + +/** + * The timing information of events taking place in ViewRootImpl + * @hide + */ +public class ViewFrameInfo { + public long drawStart; + public long oldestInputEventTime; // the time of the oldest input event consumed for this frame + public long newestInputEventTime; // the time of the newest input event consumed for this frame + // Various flags set to provide extra metadata about the current frame. See flag definitions + // inside FrameInfo. + // @see android.graphics.FrameInfo.FLAG_WINDOW_LAYOUT_CHANGED + public long flags; + + /** + * Update the oldest event time. + * @param eventTime the time of the input event + */ + public void updateOldestInputEvent(long eventTime) { + if (oldestInputEventTime == 0 || eventTime < oldestInputEventTime) { + oldestInputEventTime = eventTime; + } + } + + /** + * Update the newest event time. + * @param eventTime the time of the input event + */ + public void updateNewestInputEvent(long eventTime) { + if (newestInputEventTime == 0 || eventTime > newestInputEventTime) { + newestInputEventTime = eventTime; + } + } + + /** + * Populate the missing fields using the data from ViewFrameInfo + * @param frameInfo : the structure FrameInfo object to populate + */ + public void populateFrameInfo(FrameInfo frameInfo) { + frameInfo.frameInfo[FrameInfo.FLAGS] |= flags; + frameInfo.frameInfo[FrameInfo.DRAW_START] = drawStart; + frameInfo.frameInfo[FrameInfo.OLDEST_INPUT_EVENT] = oldestInputEventTime; + frameInfo.frameInfo[FrameInfo.NEWEST_INPUT_EVENT] = newestInputEventTime; + } + + /** + * Reset this data. Should typically be invoked after calling "populateFrameInfo". + */ + public void reset() { + drawStart = 0; + oldestInputEventTime = 0; + newestInputEventTime = 0; + flags = 0; + } + + /** + * Record the current time, and store it in 'drawStart' + */ + public void markDrawStart() { + drawStart = System.nanoTime(); + } +} |
