OSDN Git Service

Prevent refocus after entering touch mode
authorAlan Viverette <alanv@google.com>
Tue, 13 Aug 2013 23:57:28 +0000 (16:57 -0700)
committerAlan Viverette <alanv@google.com>
Tue, 13 Aug 2013 23:57:28 +0000 (16:57 -0700)
BUG: 10210009
Change-Id: I9a5d7016728cc7d1fb1c759708b6df41c81865bb

core/java/android/view/View.java
core/java/android/view/ViewRootImpl.java

index 7a82892..d22a468 100644 (file)
@@ -4572,10 +4572,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
             System.out.println(this + " clearFocus()");
         }
 
+        clearFocusInternal(true, true);
+    }
+
+    /**
+     * Clears focus from the view, optionally propagating the change up through
+     * the parent hierarchy and requesting that the root view place new focus.
+     *
+     * @param propagate whether to propagate the change up through the parent
+     *            hierarchy
+     * @param refocus when propagate is true, specifies whether to request the
+     *            root view place new focus
+     */
+    void clearFocusInternal(boolean propagate, boolean refocus) {
         if ((mPrivateFlags & PFLAG_FOCUSED) != 0) {
             mPrivateFlags &= ~PFLAG_FOCUSED;
 
-            if (mParent != null) {
+            if (propagate && mParent != null) {
                 mParent.clearChildFocus(this);
             }
 
@@ -4583,7 +4596,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
 
             refreshDrawableState();
 
-            if (!rootViewRequestFocus()) {
+            if (propagate && (!refocus || !rootViewRequestFocus())) {
                 notifyGlobalFocusCleared(this);
             }
         }
@@ -4613,12 +4626,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
             System.out.println(this + " unFocus()");
         }
 
-        if ((mPrivateFlags & PFLAG_FOCUSED) != 0) {
-            mPrivateFlags &= ~PFLAG_FOCUSED;
-
-            onFocusChanged(false, 0, null);
-            refreshDrawableState();
-        }
+        clearFocusInternal(false, false);
     }
 
     /**
index 3977a33..e90705c 100644 (file)
@@ -3271,9 +3271,9 @@ public final class ViewRootImpl implements ViewParent,
                     // focus
                     return ancestorToTakeFocus.requestFocus();
                 } else {
-                    // nothing appropriate to have focus in touch mode, clear it
-                    // out
-                    focused.clearFocus();
+                    // There's nothing to focus. Clear and propagate through the
+                    // hierarchy, but don't attempt to place new focus.
+                    focused.clearFocusInternal(true, false);
                     return true;
                 }
             }