OSDN Git Service

Fix hotspot movement on focus change
authorAlan Viverette <alanv@google.com>
Mon, 14 Jul 2014 00:49:39 +0000 (17:49 -0700)
committerAlan Viverette <alanv@google.com>
Wed, 16 Jul 2014 00:06:14 +0000 (00:06 +0000)
BUG: 15726988
Change-Id: I97f88e5f7e404ecfcd5c254fddd18c8f6616064e

core/java/android/view/View.java
graphics/java/android/graphics/drawable/Drawable.java
graphics/java/android/graphics/drawable/DrawableContainer.java
graphics/java/android/graphics/drawable/InsetDrawable.java
graphics/java/android/graphics/drawable/LayerDrawable.java
graphics/java/android/graphics/drawable/RippleDrawable.java

index a09a061..fdbc619 100644 (file)
@@ -4852,8 +4852,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
      */
     private void manageFocusHotspot(boolean focused, View v) {
         final Rect r = new Rect();
-        if (!focused && v != null && mAttachInfo != null) {
-            v.getBoundsOnScreen(r);
+        if (v != null && mAttachInfo != null) {
+            v.getHotspotBounds(r);
             final int[] location = mAttachInfo.mTmpLocation;
             getLocationOnScreen(location);
             r.offset(-location[0], -location[1]);
@@ -4867,6 +4867,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     }
 
     /**
+     * Populates <code>outRect</code> with the hotspot bounds. By default,
+     * the hotspot bounds are identical to the screen bounds.
+     *
+     * @param outRect rect to populate with hotspot bounds
+     * @hide Only for internal use by views and widgets.
+     */
+    public void getHotspotBounds(Rect outRect) {
+        final Drawable background = getBackground();
+        if (background != null) {
+            background.getHotspotBounds(outRect);
+        } else {
+            getBoundsOnScreen(outRect);
+        }
+    }
+
+    /**
      * Request that a rectangle of this view be visible on the screen,
      * scrolling if necessary just enough.
      *
index e7a073c..89236ad 100644 (file)
@@ -516,6 +516,11 @@ public abstract class Drawable {
      */
     public void setHotspotBounds(int left, int top, int right, int bottom) {}
 
+    /** @hide For internal use only. Individual results may vary. */
+    public void getHotspotBounds(Rect outRect) {
+        outRect.set(getBounds());
+    }
+
     /**
      * Whether this drawable requests projection.
      *
index ed44cde..771322d 100644 (file)
@@ -52,6 +52,7 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
      */
     private static final boolean DEFAULT_DITHER = true;
     private DrawableContainerState mDrawableContainerState;
+    private Rect mHotspotBounds;
     private Drawable mCurrDrawable;
     private int mAlpha = 0xFF;
 
@@ -273,11 +274,27 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
 
     @Override
     public void setHotspotBounds(int left, int top, int right, int bottom) {
+        if (mHotspotBounds == null) {
+            mHotspotBounds = new Rect(left, top, bottom, right);
+        } else {
+            mHotspotBounds.set(left, top, bottom, right);
+        }
+
         if (mCurrDrawable != null) {
             mCurrDrawable.setHotspotBounds(left, top, right, bottom);
         }
     }
 
+    /** @hide */
+    @Override
+    public void getHotspotBounds(Rect outRect) {
+        if (mHotspotBounds != null) {
+            outRect.set(mHotspotBounds);
+        } else {
+            super.getHotspotBounds(outRect);
+        }
+    }
+
     @Override
     protected boolean onStateChange(int[] state) {
         if (mLastDrawable != null) {
@@ -430,6 +447,12 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
                 d.setBounds(getBounds());
                 d.setLayoutDirection(getLayoutDirection());
                 d.setAutoMirrored(mDrawableContainerState.mAutoMirrored);
+
+                final Rect hotspotBounds = mHotspotBounds;
+                if (hotspotBounds != null) {
+                    d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top,
+                            hotspotBounds.right, hotspotBounds.bottom);
+                }
             }
         } else {
             mCurrDrawable = null;
index d214a47..6db96b6 100644 (file)
@@ -232,6 +232,12 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
         mInsetState.mDrawable.setHotspotBounds(left, top, right, bottom);
     }
 
+    /** @hide */
+    @Override
+    public void getHotspotBounds(Rect outRect) {
+        mInsetState.mDrawable.getHotspotBounds(outRect);
+    }
+
     @Override
     public boolean setVisible(boolean visible, boolean restart) {
         mInsetState.mDrawable.setVisible(visible, restart);
index fa68bc5..8d83c74 100644 (file)
@@ -80,6 +80,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     private int[] mPaddingB;
 
     private final Rect mTmpRect = new Rect();
+    private Rect mHotspotBounds;
     private boolean mMutated;
 
     /**
@@ -630,6 +631,22 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
         for (int i = 0; i < N; i++) {
             array[i].mDrawable.setHotspotBounds(left, top, right, bottom);
         }
+
+        if (mHotspotBounds == null) {
+            mHotspotBounds = new Rect(left, top, right, bottom);
+        } else {
+            mHotspotBounds.set(left, top, right, bottom);
+        }
+    }
+
+    /** @hide */
+    @Override
+    public void getHotspotBounds(Rect outRect) {
+        if (mHotspotBounds != null) {
+            outRect.set(mHotspotBounds);
+        } else {
+            super.getHotspotBounds(outRect);
+        }
     }
 
     @Override
index 4f05313..f955f7c 100644 (file)
@@ -471,6 +471,12 @@ public class RippleDrawable extends LayerDrawable {
         onHotspotBoundsChanged();
     }
 
+    /** @hide */
+    @Override
+    public void getHotspotBounds(Rect outRect) {
+        outRect.set(mHotspotBounds);
+    }
+
     /**
      * Notifies all the animating ripples that the hotspot bounds have changed.
      */