From bdc66cb5a0ef513f4306edf9156cc978b08e06e4 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Fri, 8 Sep 2017 14:27:24 -0700 Subject: Enable new initial-focus behavior for P This means that, by default, nothing gets initial focus in touch-mode. In order to have something focused in touch mode at activity start, an app must explicitly provide a tag. Since this tag uses the "default" focus mechanism, it can be placed in a parent and focus will go to whatever view is the default focusable in that hierarchy. This takes effect for targetApi >= P Bug: 34520588 Test: Added CTS tests in View_InitialFocusTest Change-Id: I74839bb86079558eaa5c96de52220a7d2c47d901 --- core/java/android/view/ViewRootImpl.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'core/java/android/view/ViewRootImpl.java') diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index f81a4c33271a..4d6c2ac3c844 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -530,7 +530,7 @@ public final class ViewRootImpl implements ViewParent, mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); if (!sCompatibilityDone) { - sAlwaysAssignFocus = true; + sAlwaysAssignFocus = mTargetSdkVersion < Build.VERSION_CODES.P; sCompatibilityDone = true; } @@ -2337,7 +2337,7 @@ public final class ViewRootImpl implements ViewParent, } if (mFirst) { - if (sAlwaysAssignFocus) { + if (sAlwaysAssignFocus || !isInTouchMode()) { // handle first focus request if (DEBUG_INPUT_RESIZE) { Log.v(mTag, "First: mView.hasFocus()=" + mView.hasFocus()); @@ -3608,7 +3608,7 @@ public final class ViewRootImpl implements ViewParent, checkThread(); if (mView != null) { if (!mView.hasFocus()) { - if (sAlwaysAssignFocus) { + if (sAlwaysAssignFocus || !isInTouchMode()) { v.requestFocus(); } } else { @@ -4211,10 +4211,7 @@ public final class ViewRootImpl implements ViewParent, // find the best view to give focus to in this brave new non-touch-mode // world - final View focused = focusSearch(null, View.FOCUS_DOWN); - if (focused != null) { - return focused.requestFocus(View.FOCUS_DOWN); - } + return mView.restoreDefaultFocus(); } return false; } -- cgit v1.2.3