diff options
| author | 2017-09-29 15:03:47 -0700 | |
|---|---|---|
| committer | 2017-09-29 15:03:47 -0700 | |
| commit | 3884b03b9829b3f609fa48ba7299b06407621e28 (patch) | |
| tree | d4b606f6bce75dfb10409058b4537d8b948ac020 | |
| parent | bbdc422bb1358f039207f5a6c322fb1327e3bee8 (diff) | |
Fix Transition test failure.
Bug: 67049319
TransitionUtils was returning null when the View wasn't attached,
but Visibility transitions can do that intentionally. This CL
temporarily adds detached views to the view hierarchy as part of
an overlay while creating the hardware bitmap representation.
Test: ran transition CTS tests
Change-Id: Ie335619953653dce0224514f0d5c9c8eb00ee1a9
| -rw-r--r-- | core/java/android/app/SharedElementCallback.java | 4 | ||||
| -rw-r--r-- | core/java/android/transition/TransitionUtils.java | 18 |
2 files changed, 17 insertions, 5 deletions
diff --git a/core/java/android/app/SharedElementCallback.java b/core/java/android/app/SharedElementCallback.java index 0d14a8d1e51f..80fb80588e55 100644 --- a/core/java/android/app/SharedElementCallback.java +++ b/core/java/android/app/SharedElementCallback.java @@ -27,6 +27,7 @@ import android.os.Bundle; import android.os.Parcelable; import android.transition.TransitionUtils; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType; @@ -202,7 +203,8 @@ public abstract class SharedElementCallback { } else { mTempMatrix.set(viewToGlobalMatrix); } - return TransitionUtils.createViewBitmap(sharedElement, mTempMatrix, screenBounds); + ViewGroup parent = (ViewGroup) sharedElement.getParent(); + return TransitionUtils.createViewBitmap(sharedElement, mTempMatrix, screenBounds, parent); } /** diff --git a/core/java/android/transition/TransitionUtils.java b/core/java/android/transition/TransitionUtils.java index 3306a5055297..084b79d58301 100644 --- a/core/java/android/transition/TransitionUtils.java +++ b/core/java/android/transition/TransitionUtils.java @@ -101,7 +101,7 @@ public class TransitionUtils { ImageView copy = new ImageView(view.getContext()); copy.setScaleType(ImageView.ScaleType.CENTER_CROP); - Bitmap bitmap = createViewBitmap(view, matrix, bounds); + Bitmap bitmap = createViewBitmap(view, matrix, bounds, sceneRoot); if (bitmap != null) { copy.setImageBitmap(bitmap); } @@ -156,11 +156,18 @@ public class TransitionUtils { * returning. * @param bounds The bounds of the bitmap in the destination coordinate system (where the * view should be presented. Typically, this is matrix.mapRect(viewBounds); + * @param sceneRoot A ViewGroup that is attached to the window to temporarily contain the view + * if it isn't attached to the window. * @return A bitmap of the given view or null if bounds has no width or height. */ - public static Bitmap createViewBitmap(View view, Matrix matrix, RectF bounds) { - if (!view.isAttachedToWindow()) { - return null; + public static Bitmap createViewBitmap(View view, Matrix matrix, RectF bounds, + ViewGroup sceneRoot) { + final boolean addToOverlay = !view.isAttachedToWindow(); + if (addToOverlay) { + if (sceneRoot == null || !sceneRoot.isAttachedToWindow()) { + return null; + } + sceneRoot.getOverlay().add(view); } Bitmap bitmap = null; int bitmapWidth = Math.round(bounds.width()); @@ -181,6 +188,9 @@ public class TransitionUtils { node.end(canvas); bitmap = ThreadedRenderer.createHardwareBitmap(node, bitmapWidth, bitmapHeight); } + if (addToOverlay) { + sceneRoot.getOverlay().remove(view); + } return bitmap; } |