From efed16630a8cf71287f04cde5dc59c4e0db1d987 Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Mon, 30 Nov 2020 10:30:52 -1000 Subject: Track per-window information in ViewFrameInfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../com/android/test/input/ViewFrameInfoTest.kt | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tests/Input/src/com/android/test/input/ViewFrameInfoTest.kt (limited to 'tests/Input/src') diff --git a/tests/Input/src/com/android/test/input/ViewFrameInfoTest.kt b/tests/Input/src/com/android/test/input/ViewFrameInfoTest.kt new file mode 100644 index 000000000000..f919a3eaf271 --- /dev/null +++ b/tests/Input/src/com/android/test/input/ViewFrameInfoTest.kt @@ -0,0 +1,78 @@ +/* + * 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 com.android.test.input + +import android.graphics.FrameInfo +import android.os.SystemClock +import android.view.ViewFrameInfo +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test + +class ViewFrameInfoTest { + companion object { + private const val TAG = "ViewFrameInfoTest" + } + private val mViewFrameInfo = ViewFrameInfo() + private var mTimeStarted: Long = 0 + + @Before + fun setUp() { + mViewFrameInfo.reset() + mViewFrameInfo.updateOldestInputEvent(10) + mViewFrameInfo.updateNewestInputEvent(20) + mViewFrameInfo.flags = mViewFrameInfo.flags or FrameInfo.FLAG_WINDOW_LAYOUT_CHANGED + mTimeStarted = SystemClock.uptimeNanos() + mViewFrameInfo.markDrawStart() + } + + @Test + fun testPopulateFields() { + assertThat(mViewFrameInfo.drawStart).isGreaterThan(mTimeStarted) + assertThat(mViewFrameInfo.oldestInputEventTime).isEqualTo(10) + assertThat(mViewFrameInfo.newestInputEventTime).isEqualTo(20) + assertThat(mViewFrameInfo.flags).isEqualTo(FrameInfo.FLAG_WINDOW_LAYOUT_CHANGED) + } + + @Test + fun testReset() { + mViewFrameInfo.reset() + // Ensure that the original object is reset correctly + assertThat(mViewFrameInfo.drawStart).isEqualTo(0) + assertThat(mViewFrameInfo.oldestInputEventTime).isEqualTo(0) + assertThat(mViewFrameInfo.newestInputEventTime).isEqualTo(0) + assertThat(mViewFrameInfo.flags).isEqualTo(0) + } + + @Test + fun testUpdateFrameInfoFromViewFrameInfo() { + val frameInfo = FrameInfo() + // By default, all values should be zero + assertThat(frameInfo.frameInfo[FrameInfo.OLDEST_INPUT_EVENT]).isEqualTo(0) + assertThat(frameInfo.frameInfo[FrameInfo.NEWEST_INPUT_EVENT]).isEqualTo(0) + assertThat(frameInfo.frameInfo[FrameInfo.FLAGS]).isEqualTo(0) + assertThat(frameInfo.frameInfo[FrameInfo.DRAW_START]).isEqualTo(0) + + // The values inside FrameInfo should match those from ViewFrameInfo after we update them + mViewFrameInfo.populateFrameInfo(frameInfo) + assertThat(frameInfo.frameInfo[FrameInfo.OLDEST_INPUT_EVENT]).isEqualTo(10) + assertThat(frameInfo.frameInfo[FrameInfo.NEWEST_INPUT_EVENT]).isEqualTo(20) + assertThat(frameInfo.frameInfo[FrameInfo.FLAGS]).isEqualTo( + FrameInfo.FLAG_WINDOW_LAYOUT_CHANGED) + assertThat(frameInfo.frameInfo[FrameInfo.DRAW_START]).isGreaterThan(mTimeStarted) + } +} \ No newline at end of file -- cgit v1.2.3-59-g8ed1b