summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chet Haase <chet@google.com> 2011-01-27 01:10:35 -0800
committer Chet Haase <chet@google.com> 2011-01-27 01:25:18 -0800
commite38ba4acbe6f1536997ffb98d662fc3eff07add8 (patch)
treee39d3317dcf1cdceb6ba9fee54fd952d1c3b32ce
parentda910fd5ea024f214f806d880d86d77bf94497b5 (diff)
Fix gmail crossfade artifacts.
Display lists could not handle custom views that did their own draw dispatching, as is the case with gmail. This fix makes that possible and display lists handle this case robustly. Now the crossfade works because the display lists contain the right content. Change-Id: Iea7d6e99239b24f833701d546fe083aa00e2b31b
-rw-r--r--core/java/android/view/ViewGroup.java19
1 files changed, 8 insertions, 11 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index d4efdb6eaa3c..1313b7815095 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2263,13 +2263,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
boolean scalingRequired = false;
boolean caching;
int layerType = child.getLayerType();
-
+
+ final boolean hardwareAccelerated = canvas.isHardwareAccelerated();
if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE ||
(flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) {
caching = true;
if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired;
} else {
- caching = (layerType != LAYER_TYPE_NONE) || canvas.isHardwareAccelerated();
+ caching = (layerType != LAYER_TYPE_NONE) || hardwareAccelerated;
}
if (a != null) {
@@ -2351,7 +2352,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return more;
}
- if (canvas.isHardwareAccelerated()) {
+ if (hardwareAccelerated) {
// Clear INVALIDATED flag to allow invalidation to occur during rendering, but
// retain the flag's value temporarily in the mRecreateDisplayList flag
child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED;
@@ -2367,7 +2368,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
Bitmap cache = null;
boolean hasDisplayList = false;
if (caching) {
- if (!canvas.isHardwareAccelerated()) {
+ if (!hardwareAccelerated) {
if (layerType != LAYER_TYPE_NONE) {
layerType = LAYER_TYPE_SOFTWARE;
child.buildDrawingCache(true);
@@ -2506,11 +2507,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
} else {
child.mPrivateFlags &= ~DIRTY_MASK;
- // Skip drawing the display list into ours if we were just refreshing
- // it's content; we already have a reference to it in our display list
- if (mRecreateDisplayList || mLayerType != LAYER_TYPE_NONE) {
- ((HardwareCanvas) canvas).drawDisplayList(displayList);
- }
+ ((HardwareCanvas) canvas).drawDisplayList(displayList);
}
}
} else if (cache != null) {
@@ -2536,13 +2533,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
canvas.restoreToCount(restoreTo);
if (a != null && !more) {
- if (!canvas.isHardwareAccelerated() && !a.getFillAfter()) {
+ if (!hardwareAccelerated && !a.getFillAfter()) {
child.onSetAlpha(255);
}
finishAnimatingView(child, a);
}
- if (more && canvas.isHardwareAccelerated()) {
+ if (more && hardwareAccelerated) {
// invalidation is the trigger to recreate display lists, so if we're using
// display lists to render, force an invalidate to allow the animation to
// continue drawing another frame