Fix problems with moving Views around (invalidation, conflict with layout)
Change-Id: I38f8f8a4e8082854a53a2975da258b5d946ed525
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 745839d..7666591d 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5117,13 +5117,18 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int minTop = Math.min(mTop, top);
- location[0] = mLeft;
- location[1] = minTop;
- r.set(0, 0, mRight - mLeft, mBottom - minTop);
- p.invalidateChildInParent(location, r);
+ int minTop;
+ int yLoc;
+ if (top < mTop) {
+ minTop = top;
+ yLoc = top - mTop;
+ } else {
+ minTop = mTop;
+ yLoc = 0;
+ }
+ r.set(0, yLoc, mRight - mLeft, mBottom - minTop);
+ p.invalidateChild(this, r);
}
} else {
// Double-invalidation is necessary to capture view's old and new areas
@@ -5159,13 +5164,15 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int maxBottom = Math.max(mBottom, bottom);
- location[0] = mLeft;
- location[1] = mTop;
+ int maxBottom;
+ if (bottom < mBottom) {
+ maxBottom = mBottom;
+ } else {
+ maxBottom = bottom;
+ }
r.set(0, 0, mRight - mLeft, maxBottom - mTop);
- p.invalidateChildInParent(location, r);
+ p.invalidateChild(this, r);
}
} else {
// Double-invalidation is necessary to capture view's old and new areas
@@ -5201,13 +5208,18 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int minLeft = Math.min(mLeft, left);
- location[0] = minLeft;
- location[1] = mTop;
- r.set(0, 0, mRight - minLeft, mBottom - mTop);
- p.invalidateChildInParent(location, r);
+ int minLeft;
+ int xLoc;
+ if (left < mLeft) {
+ minLeft = left;
+ xLoc = left - mLeft;
+ } else {
+ minLeft = mLeft;
+ xLoc = 0;
+ }
+ r.set(xLoc, 0, mRight - minLeft, mBottom - mTop);
+ p.invalidateChild(this, r);
}
} else {
// Double-invalidation is necessary to capture view's old and new areas
@@ -5243,13 +5255,15 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int maxRight = Math.max(mRight, right);
- location[0] = mLeft;
- location[1] = mTop;
+ int maxRight;
+ if (right < mRight) {
+ maxRight = mRight;
+ } else {
+ maxRight = right;
+ }
r.set(0, 0, maxRight - mLeft, mBottom - mTop);
- p.invalidateChildInParent(location, r);
+ p.invalidateChild(this, r);
}
} else {
// Double-invalidation is necessary to capture view's old and new areas
@@ -5440,14 +5454,21 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int minTop = offset < 0 ? mTop + offset : mTop;
- int maxBottom = offset < 0 ? mBottom : mBottom + offset;
- location[0] = mLeft;
- location[1] = minTop;
- r.set(0, 0, mRight - mLeft, maxBottom - minTop);
- p.invalidateChildInParent(location, r);
+ int minTop;
+ int maxBottom;
+ int yLoc;
+ if (offset < 0) {
+ minTop = mTop + offset;
+ maxBottom = mBottom;
+ yLoc = offset;
+ } else {
+ minTop = mTop;
+ maxBottom = mBottom + offset;
+ yLoc = 0;
+ }
+ r.set(0, yLoc, mRight - mLeft, maxBottom - minTop);
+ p.invalidateChild(this, r);
}
} else {
invalidate();
@@ -5473,14 +5494,21 @@
if (hasIdentityMatrix()) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
- final int[] location = mAttachInfo.mInvalidateChildLocation;
final Rect r = mAttachInfo.mTmpInvalRect;
- int minLeft = offset < 0 ? mLeft + offset : mLeft;
- int maxRight = offset < 0 ? mRight : mRight + offset;
- location[0] = minLeft;
- location[1] = mTop;
+ int minLeft;
+ int maxRight;
+ int xLoc;
+ if (offset < 0) {
+ minLeft = mLeft + offset;
+ maxRight = mRight;
+ xLoc = offset;
+ } else {
+ minLeft = mLeft;
+ maxRight = mRight + offset;
+ xLoc = 0;
+ }
r.set(0, 0, maxRight - minLeft, mBottom - mTop);
- p.invalidateChildInParent(location, r);
+ p.invalidateChild(this, r);
}
} else {
invalidate();