diff options
| author | Evan Rosky <erosky@google.com> | 2017-09-08 14:27:24 -0700 |
|---|---|---|
| committer | Evan Rosky <erosky@google.com> | 2018-01-12 12:58:42 -0800 |
| commit | bdc66cb5a0ef513f4306edf9156cc978b08e06e4 (patch) | |
| tree | f42f5e1c06f4d84a3aa27a150b30a7e1c22f2ef5 /core/java/android/view/ViewRootImpl.java | |
| parent | 8e18b62187d02dd2041af837e74cbaf3d50a33fd (diff) | |
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
<requestFocus /> 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
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 |
1 files changed, 4 insertions, 7 deletions
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; } |
