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
This commit is contained in:
Arthur Hung
2022-09-06 12:20:37 +00:00
parent 826ce0df09
commit 5fc73f8f2f
2 changed files with 16 additions and 2 deletions

View File

@@ -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) {

View File

@@ -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