From 5fc73f8f2fc508f56813a4eb8d8d33e40b8f6346 Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Tue, 6 Sep 2022 12:20:37 +0000 Subject: Clear default focus highlight when lost window focus or re-enter touch mode The default focus highlight will indicate the focused view in view system when user navigate the focus without touch. This CL will clear it if the window focus has lost or it re-entered the touch mode, so we won't see the wrong highlights in different windows while using multi-window mode. Bug: 244273901 Test: atest DefaultFocusHighlightTest Test: multi-window, use dpad to navigate focus Change-Id: Iad07c77b4ae16f3c88797eddd749e0aedebdd4fc --- core/java/android/view/View.java | 3 ++- core/java/android/view/ViewRootImpl.java | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 8fee4db458b3..cf087bcf7cfc 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -24490,8 +24490,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Set the current default focus highlight. * @param highlight the highlight drawable, or {@code null} if it's no longer needed. + * @hide */ - private void setDefaultFocusHighlight(Drawable highlight) { + void setDefaultFocusHighlight(Drawable highlight) { mDefaultFocusHighlight = highlight; mDefaultFocusHighlightSizeChanged = true; if (highlight != null) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 074cbe5a6947..89a1557db482 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3815,6 +3815,13 @@ public final class ViewRootImpl implements ViewParent, if (mAttachInfo.mTooltipHost != null) { mAttachInfo.mTooltipHost.hideTooltip(); } + if (!hasWindowFocus) { + // Clear focus highlight if its window lost focus. + final View focused = mView.findFocus(); + if (focused != null) { + focused.setDefaultFocusHighlight(null); + } + } } // Note: must be done after the focus change callbacks, @@ -5846,7 +5853,13 @@ public final class ViewRootImpl implements ViewParent, // be when the window is first being added, and mFocused isn't // set yet. final View focused = mView.findFocus(); - if (focused != null && !focused.isFocusableInTouchMode()) { + if (focused == null) { + return false; + } + + // Clear default focus highlight if it entered touch mode. + focused.setDefaultFocusHighlight(null); + if (!focused.isFocusableInTouchMode()) { final ViewGroup ancestorToTakeFocus = findAncestorToTakeFocusInTouchMode(focused); if (ancestorToTakeFocus != null) { // there is an ancestor that wants focus after its -- cgit v1.2.3-59-g8ed1b