From c46e2a86d447c38cc1f9a26b501066b490206bca Mon Sep 17 00:00:00 2001 From: ryanlwlin Date: Mon, 4 Jul 2022 19:25:22 +0800 Subject: [PATCH] Fix uncleared fields of windowinfo after recycling Bug: 237979750 Test: atest WindowInfoTest Change-Id: I0880cfdc04c777f9123f42c0e4d9fcf65cd11358 --- core/java/android/view/WindowInfo.java | 2 + .../src/android/view/WindowInfoTest.java | 50 +++++++++++++------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/core/java/android/view/WindowInfo.java b/core/java/android/view/WindowInfo.java index a5b8720c7dec5..11d63c84d142c 100644 --- a/core/java/android/view/WindowInfo.java +++ b/core/java/android/view/WindowInfo.java @@ -208,6 +208,8 @@ public class WindowInfo implements Parcelable { mTransformMatrix[i] = 0; } mMagnificationSpec.clear(); + title = null; + accessibilityIdOfAnchor = AccessibilityNodeInfo.UNDEFINED_NODE_ID; } public static final @android.annotation.NonNull Parcelable.Creator CREATOR = diff --git a/core/tests/coretests/src/android/view/WindowInfoTest.java b/core/tests/coretests/src/android/view/WindowInfoTest.java index afc2c002db08d..f9e3f43b562c0 100644 --- a/core/tests/coretests/src/android/view/WindowInfoTest.java +++ b/core/tests/coretests/src/android/view/WindowInfoTest.java @@ -30,6 +30,7 @@ import android.graphics.Matrix; import android.os.IBinder; import android.os.Parcel; import android.platform.test.annotations.Presubmit; +import android.text.TextUtils; import android.view.accessibility.AccessibilityNodeInfo; import androidx.test.filters.SmallTest; @@ -82,22 +83,7 @@ public class WindowInfoTest { public void testDefaultValues() { WindowInfo w = WindowInfo.obtain(); - assertEquals(0, w.type); - assertEquals(0, w.layer); - assertEquals(AccessibilityNodeInfo.UNDEFINED_NODE_ID, w.accessibilityIdOfAnchor); - assertEquals(Display.INVALID_DISPLAY, w.displayId); - assertEquals(ActivityTaskManager.INVALID_TASK_ID, w.taskId); - assertNull(w.title); - assertNull(w.token); - assertNull(w.childTokens); - assertNull(w.parentToken); - assertNull(w.activityToken); - assertFalse(w.focused); - assertFalse(w.inPictureInPicture); - assertFalse(w.hasFlagWatchOutsideTouch); - assertTrue(w.regionInScreen.isEmpty()); - assertEquals(w.mTransformMatrix.length, 9); - assertTrue(w.mMagnificationSpec.isNop()); + assertDefaultValue(w); } @SmallTest @@ -114,6 +100,37 @@ public class WindowInfoTest { } } + @SmallTest + @Test + public void testRecycle_fallbackToDefaultValues() { + WindowInfo w = WindowInfo.obtain(); + initTestWindowInfo(w); + w.recycle(); + + assertDefaultValue(w); + } + + private static void assertDefaultValue(WindowInfo windowinfo) { + assertEquals(0, windowinfo.type); + assertEquals(0, windowinfo.layer); + assertEquals(AccessibilityNodeInfo.UNDEFINED_NODE_ID, windowinfo.accessibilityIdOfAnchor); + assertEquals(Display.INVALID_DISPLAY, windowinfo.displayId); + assertEquals(ActivityTaskManager.INVALID_TASK_ID, windowinfo.taskId); + assertNull(windowinfo.title); + assertNull(windowinfo.token); + if (windowinfo.childTokens != null) { + assertTrue(windowinfo.childTokens.isEmpty()); + } + assertNull(windowinfo.parentToken); + assertNull(windowinfo.activityToken); + assertFalse(windowinfo.focused); + assertFalse(windowinfo.inPictureInPicture); + assertFalse(windowinfo.hasFlagWatchOutsideTouch); + assertTrue(windowinfo.regionInScreen.isEmpty()); + assertEquals(windowinfo.mTransformMatrix.length, 9); + assertTrue(windowinfo.mMagnificationSpec.isNop()); + } + private boolean areWindowsEqual(WindowInfo w1, WindowInfo w2) { boolean equality = w1.toString().contentEquals(w2.toString()); equality &= w1.token == w2.token; @@ -123,6 +140,7 @@ public class WindowInfoTest { equality &= w1.regionInScreen.equals(w2.regionInScreen); equality &= w1.mMagnificationSpec.equals(w2.mMagnificationSpec); equality &= Arrays.equals(w1.mTransformMatrix, w2.mTransformMatrix); + equality &= TextUtils.equals(w1.title, w2.title); return equality; }