From d367ca88eeede24e7d9a51ae85996a9d08d734b2 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 7 May 2012 15:49:39 -0700 Subject: [PATCH] Tweak anim API to automatically call Intent.setSourceBounds(). Also don't retain the source bounds in recent tasks, since it has no meaning there and it would be better when relaunching an activity to have a new bounds set based on wherever it is now being launched from. Change-Id: Ia90c04ee98a888a7f725b038abe23d71e2b12800 --- core/java/android/app/ActivityOptions.java | 12 +++++++++++- .../com/android/server/am/ActivityRecord.java | 15 +++++++++++++++ .../java/com/android/server/am/TaskRecord.java | 4 +++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index b73058140bd93..3d0b7d8e17a87 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -147,12 +147,17 @@ public class ActivityOptions { * activity is scaled from a small originating area of the screen to * its final full representation. * + *

If the Intent this is being used with has not set its + * {@link android.content.Intent#setSourceBounds Intent.setSourceBounds}, + * those bounds will be filled in for you based on the initial + * bounds passed in here. + * * @param source The View that the new activity is animating from. This * defines the coordinate space for startX and startY. * @param startX The x starting location of the new activity, relative to source. * @param startY The y starting location of the activity, relative to source. * @param startWidth The initial width of the new activity. - * @param startWidth The initial height of the new activity. + * @param startHeight The initial height of the new activity. * @return Returns a new ActivityOptions object that you can use to * supply these options as the options Bundle when starting an activity. */ @@ -175,6 +180,11 @@ public class ActivityOptions { * is scaled from a given position to the new activity window that is * being started. * + *

If the Intent this is being used with has not set its + * {@link android.content.Intent#setSourceBounds Intent.setSourceBounds}, + * those bounds will be filled in for you based on the initial + * thumbnail location and size provided here. + * * @param source The View that this thumbnail is animating from. This * defines the coordinate space for startX and startY. * @param thumbnail The bitmap that will be shown as the initial thumbnail diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java index cce8e7af0081b..97bfd6f4af0bb 100644 --- a/services/java/com/android/server/am/ActivityRecord.java +++ b/services/java/com/android/server/am/ActivityRecord.java @@ -29,6 +29,7 @@ import android.content.pm.ApplicationInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; +import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.os.IBinder; @@ -562,12 +563,26 @@ final class ActivityRecord { service.mWindowManager.overridePendingAppTransitionScaleUp( pendingOptions.getStartX(), pendingOptions.getStartY(), pendingOptions.getStartWidth(), pendingOptions.getStartHeight()); + if (intent.getSourceBounds() == null) { + intent.setSourceBounds(new Rect(pendingOptions.getStartX(), + pendingOptions.getStartY(), + pendingOptions.getStartX()+pendingOptions.getStartWidth(), + pendingOptions.getStartY()+pendingOptions.getStartHeight())); + } break; case ActivityOptions.ANIM_THUMBNAIL: service.mWindowManager.overridePendingAppTransitionThumb( pendingOptions.getThumbnail(), pendingOptions.getStartX(), pendingOptions.getStartY(), pendingOptions.getOnAnimationStartListener()); + if (intent.getSourceBounds() == null) { + intent.setSourceBounds(new Rect(pendingOptions.getStartX(), + pendingOptions.getStartY(), + pendingOptions.getStartX() + + pendingOptions.getThumbnail().getWidth(), + pendingOptions.getStartY() + + pendingOptions.getThumbnail().getHeight())); + } break; } pendingOptions = null; diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java index e3ebcc610f4fd..4b4a89d55eefa 100644 --- a/services/java/com/android/server/am/TaskRecord.java +++ b/services/java/com/android/server/am/TaskRecord.java @@ -63,9 +63,10 @@ class TaskRecord extends ThumbnailHolder { // If this Intent has a selector, we want to clear it for the // recent task since it is not relevant if the user later wants // to re-launch the app. - if (_intent.getSelector() != null) { + if (_intent.getSelector() != null || _intent.getSourceBounds() != null) { _intent = new Intent(_intent); _intent.setSelector(null); + _intent.setSourceBounds(null); } } intent = _intent; @@ -78,6 +79,7 @@ class TaskRecord extends ThumbnailHolder { Intent targetIntent = new Intent(_intent); targetIntent.setComponent(targetComponent); targetIntent.setSelector(null); + targetIntent.setSourceBounds(null); intent = targetIntent; realActivity = targetComponent; origActivity = _intent.getComponent();