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
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index b730581..3d0b7d8 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -147,12 +147,17 @@
      * activity is scaled from a small originating area of the screen to
      * its final full representation.
      *
+     * <p>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 <var>startX</var> and <var>startY</var>.
      * @param startX The x starting location of the new activity, relative to <var>source</var>.
      * @param startY The y starting location of the activity, relative to <var>source</var>.
      * @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 @@
      * is scaled from a given position to the new activity window that is
      * being started.
      *
+     * <p>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 <var>startX</var> and <var>startY</var>.
      * @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 cce8e7a..97bfd6f 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.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 @@
                     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 e3ebcc61..4b4a89d 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -63,9 +63,10 @@
                 // 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 @@
                 Intent targetIntent = new Intent(_intent);
                 targetIntent.setComponent(targetComponent);
                 targetIntent.setSelector(null);
+                targetIntent.setSourceBounds(null);
                 intent = targetIntent;
                 realActivity = targetComponent;
                 origActivity = _intent.getComponent();