Fix hotspot movement on focus change

BUG: 15726988
Change-Id: I97f88e5f7e404ecfcd5c254fddd18c8f6616064e
This commit is contained in:
Alan Viverette
2014-07-13 17:49:39 -07:00
parent 67eb5bbd53
commit 7068c39526
6 changed files with 75 additions and 2 deletions

View 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]);
@@ -4866,6 +4866,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
drawableHotspotChanged(x, y);
}
/**
* 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.

View 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.
*

View 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;

View 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);

View 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

View 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.
*/