summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Evan Rosky <erosky@google.com> 2017-08-10 20:32:03 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-08-10 20:32:03 +0000
commitc10cc1185b0024a12660f4de7fbb6ad78bd1cfb7 (patch)
tree16a08a317381ff14345413439aa183666782e01c
parentd767cec54192514ae2089939025e764a23800117 (diff)
parente329c38c4af8041ed243075c2e7c5a341d2e1042 (diff)
Merge "Disabled views won't receive focus"
-rw-r--r--core/java/android/view/View.java28
1 files changed, 23 insertions, 5 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index eea692aa952a..8d55b473acf7 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6856,8 +6856,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
- // Invisible and gone views are never focusable.
- if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) {
+ // Invisible, gone, or disabled views are never focusable.
+ if ((mViewFlags & VISIBILITY_MASK) != VISIBLE
+ || (mViewFlags & ENABLED_MASK) != ENABLED) {
return false;
}
@@ -10483,7 +10484,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (views == null) {
return;
}
- if (!isFocusable()) {
+ if (!isFocusable() || !isEnabled()) {
return;
}
if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE
@@ -10806,7 +10807,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private boolean requestFocusNoSearch(int direction, Rect previouslyFocusedRect) {
// need to be focusable
if ((mViewFlags & FOCUSABLE) != FOCUSABLE
- || (mViewFlags & VISIBILITY_MASK) != VISIBLE) {
+ || (mViewFlags & VISIBILITY_MASK) != VISIBLE
+ || (mViewFlags & ENABLED_MASK) != ENABLED) {
return false;
}
@@ -13284,12 +13286,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// about in case nothing has focus. even if this specific view
// isn't focusable, it may contain something that is, so let
// the root view try to give this focus if nothing else does.
- if ((mParent != null)) {
+ if ((mParent != null) && (mViewFlags & ENABLED_MASK) == ENABLED) {
mParent.focusableViewAvailable(this);
}
}
}
+ if ((changed & ENABLED_MASK) != 0) {
+ if ((mViewFlags & ENABLED_MASK) == ENABLED) {
+ // a view becoming enabled should notify the parent as long as the view is also
+ // visible and the parent wasn't already notified by becoming visible during this
+ // setFlags invocation.
+ if ((mViewFlags & VISIBILITY_MASK) == VISIBLE
+ && ((changed & VISIBILITY_MASK) == 0)) {
+ if ((mParent != null) && (mViewFlags & ENABLED_MASK) == ENABLED) {
+ mParent.focusableViewAvailable(this);
+ }
+ }
+ } else {
+ if (hasFocus()) clearFocus();
+ }
+ }
+
/* Check if the GONE bit has changed */
if ((changed & GONE) != 0) {
needGlobalAttributesUpdate(false);