From c86a84fd9e83b8592a72110a4cfb91f6337695f2 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Fri, 16 Apr 2021 12:53:38 -0400 Subject: [PATCH] Enforce mutual exclusivity in setScrollCaptureHint This change causes HINT_EXCLUDE to take precedence over HINT_INLUDE when both are present. Test: atest ViewGroupScrollCaptureTest Bug: 184370898 Change-Id: Ie4779067c3db82c65816dc4a5129badf74b3c9b4 --- core/java/android/view/View.java | 4 ++++ .../src/android/view/ViewGroupScrollCaptureTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index d6b5a2c299e94..de598dbd9f7d5 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -30143,6 +30143,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public void setScrollCaptureHint(@ScrollCaptureHint int hint) { mPrivateFlags4 &= ~PFLAG4_SCROLL_CAPTURE_HINT_MASK; + // Since include/exclude are mutually exclusive, exclude takes precedence. + if ((hint & SCROLL_CAPTURE_HINT_EXCLUDE) != 0) { + hint &= ~SCROLL_CAPTURE_HINT_INCLUDE; + } mPrivateFlags4 |= ((hint << PFLAG4_SCROLL_CAPTURE_HINT_SHIFT) & PFLAG4_SCROLL_CAPTURE_HINT_MASK); } diff --git a/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java index 2833ea3f9ac07..695eb0ced7569 100644 --- a/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java +++ b/core/tests/coretests/src/android/view/ViewGroupScrollCaptureTest.java @@ -92,6 +92,18 @@ public class ViewGroupScrollCaptureTest { viewGroup.getScrollCaptureHint()); } + /** Make sure the hint flags are saved and loaded correctly. */ + @Test + public void testSetScrollCaptureHint_mutuallyExclusiveFlags() throws Exception { + final Context context = getInstrumentation().getContext(); + final MockViewGroup viewGroup = new MockViewGroup(context); + + viewGroup.setScrollCaptureHint( + View.SCROLL_CAPTURE_HINT_INCLUDE | View.SCROLL_CAPTURE_HINT_EXCLUDE); + assertEquals("Mutually exclusive flags were not resolved correctly", + ViewGroup.SCROLL_CAPTURE_HINT_EXCLUDE, viewGroup.getScrollCaptureHint()); + } + /** * Ensure a ViewGroup with 'scrollCaptureHint=auto', but no ScrollCaptureCallback set dispatches * correctly. Verifies that the framework helper is called. Verifies a that non-null callback