Revert "Support changes in Scene Activity Transition API."

This reverts commit 8ad5ffb4618350715cfef346e553b2b0501840eb.

Change-Id: I3277537f7cc6a033ea1fc2948529f96c1dbc30e8
diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index 7e8c9e1..26fcbab 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -1295,8 +1295,8 @@
 
         <activity android:name=".animation.ActivityTransition"
                 android:label="Animation/Activity Transition"
-                android:enabled="@bool/atLeastHoneycomb"
-                android:theme="@style/ActivityTransitionTheme">
+		android:enabled="@bool/atLeastHoneycomb"
+		android:theme="@style/ActivityTransitionTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.SAMPLE_CODE" />
@@ -1304,9 +1304,9 @@
         </activity>
 
         <activity android:name=".animation.ActivityTransitionDetails"
-                android:label="Animation/Details of a specific thingy"
-                android:enabled="@bool/atLeastHoneycomb"
-                android:theme="@style/ActivityTransitionTheme">
+                android:label="Animation/Activity Transition Details"
+		android:enabled="@bool/atLeastHoneycomb"
+		android:theme="@style/ActivityTransitionTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
diff --git a/samples/ApiDemos/res/layout/image_block.xml b/samples/ApiDemos/res/layout/image_block.xml
index 58d6a23..50d7d04 100644
--- a/samples/ApiDemos/res/layout/image_block.xml
+++ b/samples/ApiDemos/res/layout/image_block.xml
@@ -1,21 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:clipChildren="true"
-            android:columnCount="2"
-            android:rowCount="4"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             android:clipChildren="false"
+             android:columnCount="2"
+             android:rowCount="4"
         >
     <ImageView android:id="@+id/ducky"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:scaleType="center"
+               android:src="@drawable/ducky"
                android:layout_column="0"
                android:layout_row="0"
-               android:src="@drawable/ducky"
                android:onClick="clicked"
-               android:sharedElementName="ducky"
             />
     <ImageView android:id="@+id/woot"
                android:layout_height="wrap_content"
@@ -25,7 +24,6 @@
                android:layout_column="1"
                android:layout_row="0"
                android:onClick="clicked"
-               android:sharedElementName="woot"
             />
     <ImageView android:id="@+id/ball"
                android:layout_height="wrap_content"
@@ -35,7 +33,6 @@
                android:layout_column="0"
                android:layout_row="1"
                android:onClick="clicked"
-               android:sharedElementName="ball"
             />
     <ImageView android:id="@+id/block"
                android:layout_height="wrap_content"
@@ -45,7 +42,6 @@
                android:layout_column="1"
                android:layout_row="1"
                android:onClick="clicked"
-               android:sharedElementName="block"
             />
     <ImageView android:id="@+id/jellies"
                android:layout_height="wrap_content"
@@ -55,7 +51,6 @@
                android:layout_column="0"
                android:layout_row="2"
                android:onClick="clicked"
-               android:sharedElementName="jellies"
             />
     <ImageView android:id="@+id/mug"
                android:layout_height="wrap_content"
@@ -65,7 +60,6 @@
                android:layout_column="1"
                android:layout_row="2"
                android:onClick="clicked"
-               android:sharedElementName="mug"
             />
     <ImageView android:id="@+id/pencil"
                android:layout_height="wrap_content"
@@ -75,7 +69,6 @@
                android:layout_column="0"
                android:layout_row="3"
                android:onClick="clicked"
-               android:sharedElementName="pencil"
             />
     <ImageView android:id="@+id/scissors"
                android:layout_height="wrap_content"
@@ -85,6 +78,5 @@
                android:layout_column="1"
                android:layout_row="3"
                android:onClick="clicked"
-               android:sharedElementName="scissors"
             />
 </GridLayout>
\ No newline at end of file
diff --git a/samples/ApiDemos/res/layout/image_details.xml b/samples/ApiDemos/res/layout/image_details.xml
index e254d64..a1a7459 100644
--- a/samples/ApiDemos/res/layout/image_details.xml
+++ b/samples/ApiDemos/res/layout/image_details.xml
@@ -4,22 +4,15 @@
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
-             android:clipChildren="false"
         >
-    <FrameLayout android:id="@+id/shared_element"
-                   android:layout_height="0px"
-                   android:layout_weight="1"
-                   android:layout_width="match_parent"
-                   android:sharedElementName="hero"
-                   android:onClick="clicked"
-                   android:clipChildren="false">
-        <ImageView android:id="@+id/titleImage"
-                   android:layout_height="wrap_content"
-                   android:layout_width="wrap_content"
-                   android:scaleType="center"
-                   android:layout_gravity="left|bottom"
-                />
-    </FrameLayout>
+    <ImageView android:id="@+id/titleImage"
+               android:layout_height="0px"
+               android:layout_weight="1"
+               android:layout_width="match_parent"
+               android:scaleType="centerCrop"
+               android:onClick="clicked"
+               android:sharedElementName="hero"
+            />
     <LinearLayout android:layout_height="0px"
                   android:layout_width="match_parent"
                   android:layout_weight="2"
diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransition.java b/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransition.java
index c839daa..c3171c4 100644
--- a/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransition.java
+++ b/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransition.java
@@ -17,17 +17,23 @@
 
 import com.example.android.apis.R;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.RectEvaluator;
 import android.app.Activity;
+import android.app.ActivityOptions;
 import android.content.Intent;
+import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.transition.ChangeBounds;
-import android.transition.Transition;
 import android.transition.TransitionManager;
 import android.transition.TransitionSet;
-import android.util.ArrayMap;
-import android.util.Pair;
+import android.util.Property;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroupOverlay;
 import android.view.Window;
 import android.widget.ImageView;
 
@@ -37,50 +43,138 @@
  *
  */
 public class ActivityTransition extends Activity {
-
     private static final String TAG = "ActivityTransition";
 
+    private static final String KEY_LEFT_ON_SCREEN = "ViewTransitionValues:left:";
+    private static final String KEY_TOP_ON_SCREEN = "ViewTransitionValues:top:";
+    private static final String KEY_WIDTH = "ViewTransitionValues:width:";
+    private static final String KEY_HEIGHT = "ViewTransitionValues:height:";
     private static final String KEY_ID = "ViewTransitionValues:id";
 
     private Random mRandom = new Random();
-
-    private ImageView mHero;
+    private boolean mComeBack;
+    private Fall mFall;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS);
-        getWindow().setTriggerEarlyEnterTransition(true);
+        setEarlyBackgroundTransition(false);
         getWindow().setBackgroundDrawable(new ColorDrawable(randomColor()));
         setContentView(R.layout.image_block);
-        setupHero();
+        View hero = getHero();
+        if (hero != null) {
+            hero.setSharedElementName("hero");
+        }
         TransitionManager transitionManager = getContentTransitionManager();
         TransitionSet transitions = new TransitionSet();
         Fall fall = new Fall();
         fall.setDuration(600);
+        fall.setStartDelay(600);
+        fall.setHero(hero);
         transitions.addTransition(fall);
-        transitions.addTransition(new ScaleTransition());
-        transitions.addTransition(new ChangeBounds());
         transitions.addTransition(new Up());
-        transitionManager.setTransition(getContentScene(), transitions);
-        transitionManager.setExitTransition(getContentScene(), transitions);
+        transitionManager.setTransition("null", getContentScene(), transitions);
+
+        transitions = new TransitionSet();
+        mFall = new Fall();
+        mFall.setDuration(600);
+        transitions.addTransition(mFall);
+        transitions.addTransition(new Up());
+        transitionManager.setTransition(getContentScene(), "null", transitions);
     }
 
-    private void setupHero() {
-        int id = getIntent().getIntExtra(KEY_ID, 0);
-        mHero = (ImageView) findViewById(id);
-        if (mHero != null) {
-            ArrayMap<String, String> sharedElementsMap = new ArrayMap<String, String>();
-            sharedElementsMap.put("hero", mHero.getSharedElementName());
-            getWindow().mapTransitionTargets(sharedElementsMap);
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mComeBack) {
+            mComeBack = false;
+            setContentView(R.layout.image_block);
         }
     }
 
+    private View getHero() {
+        Bundle transitionArgs = getTransitionArgs();
+        if (transitionArgs == null) {
+            return null;
+        }
+        int id = transitionArgs.getInt(KEY_ID);
+        return findViewById(id);
+    }
+
+    private static Property<Drawable, Rect> DRAWABLE_BOUNDS
+            = new Property<Drawable, Rect>(Rect.class, "bounds") {
+        @Override
+        public Rect get(Drawable object) {
+            return null;
+        }
+
+        @Override
+        public void set(Drawable object, Rect value) {
+            object.setBounds(value);
+            object.invalidateSelf();
+        }
+    };
+
+    @Override
+    public void startSharedElementTransition(Bundle transitionArgs) {
+        final ImageView hero = (ImageView)getHero();
+        hero.setSharedElementName(null);
+        hero.setVisibility(View.INVISIBLE);
+
+        int[] loc = new int[2];
+        hero.getLocationOnScreen(loc);
+        int endScreenLeft = loc[0];
+        int endScreenTop = loc[1];
+        int originalWidth = hero.getWidth();
+        int originalHeight = hero.getHeight();
+
+        hero.setVisibility(View.INVISIBLE);
+        ViewGroup sceneRoot = getContentScene().getSceneRoot();
+        sceneRoot.getLocationOnScreen(loc);
+        int overlayLeft = loc[0];
+        int overlayTop = loc[1];
+        final ViewGroupOverlay overlay = sceneRoot.getOverlay();
+
+        int endX = endScreenLeft - overlayLeft;
+        int endY = endScreenTop - overlayTop;
+
+        int startX = transitionArgs.getInt(KEY_LEFT_ON_SCREEN) - overlayLeft;
+        int startY = transitionArgs.getInt(KEY_TOP_ON_SCREEN) - overlayTop;
+        int startWidth = transitionArgs.getInt(KEY_WIDTH);
+        int startHeight = transitionArgs.getInt(KEY_HEIGHT);
+
+        int endHeight = originalWidth * startHeight / startWidth;
+        final Drawable image = hero.getDrawable();
+        Rect startBounds = new Rect(startX, startY, startX + startWidth, startY + startHeight);
+        endY += originalHeight - endHeight;
+        Rect endBounds = new Rect(endX, endY, endX + originalWidth, endY + endHeight);
+        ObjectAnimator boundsAnimator = ObjectAnimator.ofObject(image, DRAWABLE_BOUNDS,
+                new RectEvaluator(new Rect()), startBounds, endBounds);
+        hero.setImageDrawable(null);
+        image.setBounds(startBounds);
+        overlay.add(image);
+
+        boundsAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                overlay.remove(image);
+                hero.setImageDrawable(image);
+                hero.setVisibility(View.VISIBLE);
+            }
+        });
+        boundsAnimator.start();
+    }
+
     public void clicked(View v) {
-        mHero = (ImageView) v;
+        v.setSharedElementName("hero");
+        mFall.setHero(v);
         Intent intent = new Intent(this, ActivityTransitionDetails.class);
-        intent.putExtra(KEY_ID, v.getId());
-        startActivity(intent, new Pair<View, String>(mHero, "hero"));
+        Bundle args = getHeroInfo(v);
+        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(args);
+        startActivity(intent, options.toBundle());
+        //v.setTranslationZ(300);
+        mComeBack = true;
     }
 
     private int randomColor() {
@@ -90,25 +184,15 @@
         return 0xFF000000 | (red << 16) | (green << 8) | blue;
     }
 
-    @Override
-    public void onCaptureSharedElementStart(Transition transition) {
-        int width = mHero.getWidth();
-        int newTop = mHero.getBottom() - width;
-        mHero.setTop(newTop);
-
-        int imageWidth = mHero.getDrawable().getIntrinsicWidth();
-        mHero.setPivotX(0);
-        mHero.setPivotY(0);
-        float scale = ((float)width)/imageWidth;
-        mHero.setScaleX(scale);
-        mHero.setScaleY(scale);
-    }
-
-    @Override
-    public void onCaptureSharedElementEnd() {
-        mHero.setPivotX(0);
-        mHero.setPivotY(0);
-        mHero.setScaleX(1);
-        mHero.setScaleY(1);
+    static Bundle getHeroInfo(View view) {
+        int[] loc = new int[2];
+        view.getLocationOnScreen(loc);
+        Bundle bundle = new Bundle();
+        bundle.putInt(KEY_LEFT_ON_SCREEN, loc[0]);
+        bundle.putInt(KEY_TOP_ON_SCREEN, loc[1]);
+        bundle.putInt(KEY_WIDTH, view.getWidth());
+        bundle.putInt(KEY_HEIGHT, view.getHeight());
+        bundle.putInt(KEY_ID, view.getId());
+        return bundle;
     }
 }
diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransitionDetails.java b/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransitionDetails.java
index 931c5db..d0b2c4f 100644
--- a/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransitionDetails.java
+++ b/samples/ApiDemos/src/com/example/android/apis/animation/ActivityTransitionDetails.java
@@ -17,17 +17,26 @@
 
 import com.example.android.apis.R;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.RectEvaluator;
 import android.app.Activity;
+import android.app.ActivityOptions;
 import android.content.Intent;
+import android.graphics.Matrix;
+import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.transition.ChangeBounds;
-import android.transition.Transition;
 import android.transition.TransitionManager;
 import android.transition.TransitionSet;
-import android.util.Pair;
+import android.util.Log;
+import android.util.Property;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroupOverlay;
+import android.view.ViewTreeObserver;
 import android.view.Window;
 import android.widget.ImageView;
 
@@ -37,94 +46,72 @@
  *
  */
 public class ActivityTransitionDetails extends Activity {
-
     private static final String TAG = "ActivityTransitionDetails";
 
+    private static final String KEY_LEFT_ON_SCREEN = "ViewTransitionValues:left:";
+    private static final String KEY_TOP_ON_SCREEN = "ViewTransitionValues:top:";
+    private static final String KEY_WIDTH = "ViewTransitionValues:width:";
+    private static final String KEY_HEIGHT = "ViewTransitionValues:height:";
     private static final String KEY_ID = "ViewTransitionValues:id";
 
     private Random mRandom = new Random();
-
+    private boolean mComeBack;
     private int mImageResourceId = R.drawable.ducky;
-
-    private int mId = R.id.ducky;
+    private int mId;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS);
-        getWindow().setTriggerEarlyEnterTransition(false);
+        setEarlyBackgroundTransition(false);
         getWindow().setBackgroundDrawable(new ColorDrawable(randomColor()));
         setContentView(R.layout.image_details);
-        ImageView titleImage = (ImageView) findViewById(R.id.titleImage);
-        titleImage.setImageDrawable(getHeroDrawable());
-
+        setImageMatrix();
+        ImageView hero = (ImageView)findViewById(R.id.titleImage);
+        hero.setImageDrawable(getHeroDrawable());
+        //hero.setTranslationZ(300);
         TransitionManager transitionManager = getContentTransitionManager();
         TransitionSet transitions = new TransitionSet();
-
         Fall fall = new Fall();
         fall.setDuration(600);
+        fall.setStartDelay(600);
+        transitions.addTransition(fall);
+        transitions.addTransition(new Up());
+        transitionManager.setTransition("null", getContentScene(), transitions);
+
+        transitions = new TransitionSet();
+        fall = new Fall();
+        fall.setDuration(600);
         transitions.addTransition(fall);
         transitions.addTransition(new Up());
-        transitions.addTransition(new ChangeBounds());
-        transitions.addTransition(new ScaleTransition());
-        transitionManager.setTransition(getContentScene(), transitions);
-        transitionManager.setExitTransition(getContentScene(), transitions);
+        transitionManager.setTransition(getContentScene(), "null", transitions);
     }
 
     @Override
-    public void onCaptureSharedElementStart(Transition transition) {
-        ImageView imageView = (ImageView) findViewById(R.id.titleImage);
-        imageView.setScaleX(1);
-        imageView.setScaleY(1);
-        imageView.offsetTopAndBottom(-imageView.getTop());
-    }
-
-    @Override
-    public void onCaptureSharedElementEnd() {
-        setScale();
-    }
-
-    private void setScale() {
-        ImageView imageView = (ImageView) findViewById(R.id.titleImage);
-        Drawable drawable = imageView.getDrawable();
-        float intrinsicWidth = drawable.getIntrinsicWidth();
-        View sharedElementTarget = findViewById(R.id.shared_element);
-        float scale = sharedElementTarget.getWidth()/intrinsicWidth;
-        imageView.setPivotY(imageView.getHeight());
-        imageView.setScaleX(scale);
-        imageView.setScaleY(scale);
+    protected void onResume() {
+        super.onResume();
+        if (mComeBack) {
+            mComeBack = false;
+            setContentView(R.layout.image_details);
+            ImageView hero = (ImageView)findViewById(R.id.titleImage);
+            hero.setImageDrawable(getHeroDrawable());
+            setImageMatrix();
+        }
     }
 
     private Drawable getHeroDrawable() {
-        int id = getIntent().getIntExtra(KEY_ID, mId);
-        mId = id;
-
+        Bundle args = getTransitionArgs();
+        int id = args == null ? 0 : args.getInt(KEY_ID);
         int resourceId;
         switch (id) {
-            case R.id.ducky:
-                resourceId = R.drawable.ducky;
-                break;
-            case R.id.jellies:
-                resourceId = R.drawable.jellies;
-                break;
-            case R.id.mug:
-                resourceId = R.drawable.mug;
-                break;
-            case R.id.pencil:
-                resourceId = R.drawable.pencil;
-                break;
-            case R.id.scissors:
-                resourceId = R.drawable.scissors;
-                break;
-            case R.id.woot:
-                resourceId = R.drawable.woot;
-                break;
-            case R.id.ball:
-                resourceId = R.drawable.ball;
-                break;
-            case R.id.block:
-                resourceId = R.drawable.block;
-                break;
+            case R.id.ducky: resourceId = R.drawable.ducky; break;
+            case R.id.jellies: resourceId = R.drawable.jellies; break;
+            case R.id.mug: resourceId = R.drawable.mug; break;
+            case R.id.pencil: resourceId = R.drawable.pencil; break;
+            case R.id.scissors: resourceId = R.drawable.scissors; break;
+            case R.id.woot: resourceId = R.drawable.woot; break;
+            case R.id.ball: resourceId = R.drawable.ball; break;
+            case R.id.block: resourceId = R.drawable.block; break;
             default:
                 resourceId = mImageResourceId;
                 break;
@@ -133,10 +120,96 @@
         return getResources().getDrawable(resourceId);
     }
 
+    private static Property<Drawable, Rect> DRAWABLE_BOUNDS
+            = new Property<Drawable, Rect>(Rect.class, "bounds") {
+        @Override
+        public Rect get(Drawable object) {
+            return null;
+        }
+
+        @Override
+        public void set(Drawable object, Rect value) {
+            object.setBounds(value);
+            object.invalidateSelf();
+        }
+    };
+
+    private void setImageMatrix() {
+        getWindow().getDecorView().getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+            @Override
+            public boolean onPreDraw() {
+                getWindow().getDecorView().getViewTreeObserver().removeOnPreDrawListener(this);
+                // Use an image matrix such that it aligns with the bottom.
+                final ImageView hero = (ImageView)findViewById(R.id.titleImage);
+                hero.setScaleType(ImageView.ScaleType.MATRIX);
+                Matrix matrix = hero.getImageMatrix();
+                int height = hero.getHeight();
+                int width = hero.getWidth();
+                Drawable image = hero.getDrawable();
+                int intrinsicHeight = image.getIntrinsicHeight();
+                int intrinsicWidth = image.getIntrinsicWidth();
+                int scaledHeight = intrinsicHeight * width / intrinsicWidth;
+                matrix.postTranslate(0, (height - scaledHeight) / 2);
+                hero.setImageMatrix(matrix);
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public void startSharedElementTransition(Bundle transitionArgs) {
+        mId = transitionArgs.getInt(KEY_ID);
+        final ImageView hero = (ImageView)findViewById(R.id.titleImage);
+        int[] loc = new int[2];
+        hero.getLocationOnScreen(loc);
+        int endScreenLeft = loc[0];
+        int endScreenTop = loc[1];
+        int originalWidth = hero.getWidth();
+        int originalHeight = hero.getHeight();
+
+        hero.setVisibility(View.INVISIBLE);
+        ViewGroup sceneRoot = getContentScene().getSceneRoot();
+        sceneRoot.getLocationOnScreen(loc);
+        int overlayLeft = loc[0];
+        int overlayTop = loc[1];
+        final ViewGroupOverlay overlay = sceneRoot.getOverlay();
+
+        int endX = endScreenLeft - overlayLeft;
+        int endY = endScreenTop - overlayTop;
+
+        int startX = transitionArgs.getInt(KEY_LEFT_ON_SCREEN) - overlayLeft;
+        int startY = transitionArgs.getInt(KEY_TOP_ON_SCREEN) - overlayTop;
+        int startWidth = transitionArgs.getInt(KEY_WIDTH);
+        int startHeight = transitionArgs.getInt(KEY_HEIGHT);
+
+        int endHeight = originalWidth * startHeight / startWidth;
+        final Drawable image = hero.getDrawable();
+        Rect startBounds = new Rect(startX, startY, startX + startWidth, startY + startHeight);
+        endY += originalHeight - endHeight;
+        Rect endBounds = new Rect(endX, endY, endX + originalWidth, endY + endHeight);
+        ObjectAnimator boundsAnimator = ObjectAnimator.ofObject(image, DRAWABLE_BOUNDS,
+            new RectEvaluator(new Rect()), startBounds, endBounds);
+        hero.setImageDrawable(null);
+        image.setBounds(startBounds);
+        overlay.add(image);
+
+        boundsAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                overlay.remove(image);
+                hero.setImageDrawable(image);
+                hero.setVisibility(View.VISIBLE);
+            }
+        });
+        boundsAnimator.start();
+    }
+
     public void clicked(View v) {
         Intent intent = new Intent(this, ActivityTransition.class);
-        intent.putExtra(KEY_ID, mId);
-        startActivity(intent, new Pair<View, String>(v, "hero"));
+        Bundle args = getHeroInfo((ImageView)v);
+        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(args);
+        startActivity(intent, options.toBundle());
+        mComeBack = true;
     }
 
     private int randomColor() {
@@ -146,4 +219,22 @@
         return 0xFF000000 | (red << 16) | (green << 8) | blue;
     }
 
+    private Bundle getHeroInfo(ImageView view) {
+        int[] loc = new int[2];
+        view.getLocationOnScreen(loc);
+        Bundle bundle = new Bundle();
+        Drawable image = view.getDrawable();
+        int intrinsicWidth = image.getIntrinsicWidth();
+        int intrinsicHeight = image.getIntrinsicHeight();
+        int width = view.getWidth();
+        int height = intrinsicHeight * width / intrinsicWidth;
+        int top = loc[1] + view.getHeight() - height;
+        bundle.putInt(KEY_LEFT_ON_SCREEN, loc[0]);
+        bundle.putInt(KEY_TOP_ON_SCREEN, top);
+        bundle.putInt(KEY_WIDTH, width);
+        bundle.putInt(KEY_HEIGHT, height);
+        bundle.putInt(KEY_ID, mId);
+        return bundle;
+    }
+
 }
diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/Fall.java b/samples/ApiDemos/src/com/example/android/apis/animation/Fall.java
index 6a866e5..e7281b3 100644
--- a/samples/ApiDemos/src/com/example/android/apis/animation/Fall.java
+++ b/samples/ApiDemos/src/com/example/android/apis/animation/Fall.java
@@ -20,9 +20,11 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
 import android.transition.Transition;
 import android.transition.TransitionValues;
 import android.transition.Visibility;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.AccelerateInterpolator;
@@ -37,7 +39,11 @@
     private static final String TAG = "Fall";
     private static final String PROPNAME_SCREEN_LOCATION = "android:fade:screen_location";
 
-    private View mFocusElement;
+    private View mHero;
+
+    public void setHero(View hero) {
+        mHero = hero;
+    }
 
     private Animator createAnimation(final View view, long startDelay, final float startY,
             float endY, AnimatorListenerAdapter listener, TimeInterpolator interpolator) {
@@ -93,6 +99,7 @@
             return null;
         }
         final View endView = endValues.view;
+        Log.v(TAG, "onAppear: " + endView.getId());
         final float endY = endView.getTranslationY();
         final float startY = endY + sceneRoot.getHeight();
 
@@ -129,9 +136,8 @@
             }
         };
         addListener(transitionListener);
-        View sharedElement = getFocusElement(sceneRoot);
         int[] loc = (int[]) endValues.values.get(PROPNAME_SCREEN_LOCATION);
-        long startDelay = calculateRiseStartDelay(sceneRoot, sharedElement, endView, loc);
+        long startDelay = calculateRiseStartDelay(sceneRoot, endView, loc);
         return createAnimation(endView, startDelay, startY, endY, null, sDecelerate);
     }
 
@@ -184,13 +190,12 @@
             }
         }
         final int finalVisibility = endVisibility;
-        View sharedElement = getFocusElement(sceneRoot);
 
         int[] loc = (int[]) startValues.values.get(PROPNAME_SCREEN_LOCATION);
         // TODO: add automatic facility to Visibility superclass for keeping views around
         if (overlayView != null) {
             // TODO: Need to do this for general case of adding to overlay
-            long startDelay = calculateFallStartDelay(sceneRoot, sharedElement, overlayView, loc);
+            long startDelay = calculateFallStartDelay(sceneRoot, overlayView, loc);
             int screenX = loc[0];
             int screenY = loc[1];
             loc = new int[2];
@@ -235,7 +240,7 @@
             return createAnimation(view, startDelay, startY, endY, endListener, sAccelerate);
         }
         if (viewToKeep != null) {
-            long startDelay = calculateFallStartDelay(sceneRoot, sharedElement, viewToKeep, loc);
+            long startDelay = calculateFallStartDelay(sceneRoot, viewToKeep, loc);
             // TODO: find a different way to do this, like just changing the view to be
             // VISIBLE for the duration of the transition
             viewToKeep.setVisibility((View.VISIBLE));
@@ -294,73 +299,37 @@
         return null;
     }
 
-    private View getFocusElement(ViewGroup sceneRoot) {
-        if (mFocusElement == null) {
-            mFocusElement = findFocusElement(sceneRoot);
-            if (mFocusElement == null) {
-                mFocusElement = sceneRoot;
-            }
-        }
-        return (mFocusElement == sceneRoot) ? null : mFocusElement;
-    }
-
-    private static View findFocusElement(ViewGroup viewGroup) {
-        int numChildren = viewGroup.getChildCount();
-        for (int i = 0; i < numChildren; i++) {
-            View child = viewGroup.getChildAt(i);
-            String sharedElementName = child.getSharedElementName();
-            if (sharedElementName != null && !sharedElementName.startsWith("android:")) {
-                return child;
-            }
-            if (child instanceof ViewGroup) {
-                View sharedElement = findFocusElement((ViewGroup) child);
-                if (sharedElement != null) {
-                    return sharedElement;
-                }
-            }
-        }
-        return null;
-    }
-
-    private long calculateFallStartDelay(ViewGroup sceneRoot, View shared, View view,
-            int[] viewLoc) {
+    private long calculateFallStartDelay(View sceneRoot, View view, int[] viewLoc) {
         int[] loc = new int[2];
         sceneRoot.getLocationOnScreen(loc);
         int bottom = loc[1] + sceneRoot.getHeight();
         float distance = bottom - viewLoc[1] + view.getTranslationY();
-        if (shared != null) {
-            shared.getLocationOnScreen(loc);
-            float heroX = loc[0] + shared.getTranslationX() + (shared.getWidth() / 2.0f);
+        if (mHero != null) {
+            mHero.getLocationOnScreen(loc);
+            float heroX = loc[0] + mHero.getTranslationX() + (mHero.getWidth() / 2.0f);
             float viewX = viewLoc[0] + view.getTranslationX() + (view.getWidth() / 2.0f);
             float distanceX = Math.abs(heroX - viewX);
             float distanceXRatio = distanceX / sceneRoot.getWidth();
-            distance += (1 - distanceXRatio) * shared.getHeight();
+            distance += (1 - distanceXRatio) * mHero.getHeight();
         }
         float distanceRatio = distance/sceneRoot.getHeight() / 3;
         return Math.max(0, Math.round(distanceRatio * getDuration()));
     }
 
-    private long calculateRiseStartDelay(View sceneRoot, View shared, View view, int[] viewLoc) {
+    private long calculateRiseStartDelay(View sceneRoot, View view, int[] viewLoc) {
         int[] loc = new int[2];
         sceneRoot.getLocationOnScreen(loc);
         int top = loc[1];
         float distance = viewLoc[1] + view.getTranslationY() - top;
-        if (shared != null) {
-            shared.getLocationOnScreen(loc);
-            float heroX = loc[0] + shared.getTranslationX() + (shared.getWidth() / 2.0f);
+        if (mHero != null) {
+            mHero.getLocationOnScreen(loc);
+            float heroX = loc[0] + mHero.getTranslationX() + (mHero.getWidth() / 2.0f);
             float viewX = viewLoc[0] + view.getTranslationX() + (view.getWidth() / 2.0f);
             float distanceX = Math.abs(heroX - viewX);
             float distanceXRatio = distanceX / sceneRoot.getWidth();
-            distance += distanceXRatio * shared.getHeight();
+            distance += distanceXRatio * mHero.getHeight();
         }
         float distanceRatio = distance/sceneRoot.getHeight() / 3;
         return Math.max(0, Math.round(distanceRatio * getDuration()));
     }
-
-    @Override
-    public Transition clone() {
-        Fall transition = (Fall) super.clone();
-        transition.mFocusElement = null;
-        return transition;
-    }
 }
diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/ScaleTransition.java b/samples/ApiDemos/src/com/example/android/apis/animation/ScaleTransition.java
deleted file mode 100644
index 787cdb3..0000000
--- a/samples/ApiDemos/src/com/example/android/apis/animation/ScaleTransition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.example.android.apis.animation;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.transition.Transition;
-import android.transition.TransitionValues;
-import android.util.Property;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- *
- */
-public class ScaleTransition extends Transition {
-    private static final String PROPNAME_SCALE_X = "android:scale:x";
-    private static final String PROPNAME_SCALE_Y = "android:scale:y";
-    private static final String[] sTransitionProperties = {
-            PROPNAME_SCALE_X,
-            PROPNAME_SCALE_Y,
-    };
-
-    @Override
-    public String[] getTransitionProperties() {
-        return sTransitionProperties;
-    }
-
-    @Override
-    public void captureStartValues(TransitionValues transitionValues) {
-        captureValues(transitionValues);
-    }
-
-    @Override
-    public void captureEndValues(TransitionValues transitionValues) {
-        captureValues(transitionValues);
-    }
-
-    private void captureValues(TransitionValues transitionValues) {
-        transitionValues.values.put(PROPNAME_SCALE_X, transitionValues.view.getScaleX());
-        transitionValues.values.put(PROPNAME_SCALE_Y, transitionValues.view.getScaleY());
-    }
-
-    @Override
-    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
-            TransitionValues endValues) {
-        if (startValues == null || endValues == null) {
-            return null;
-        }
-        Animator scaleXAnimator = createScaleAnimator(startValues, endValues, PROPNAME_SCALE_X,
-                View.SCALE_X);
-        Animator scaleYAnimator = createScaleAnimator(startValues, endValues, PROPNAME_SCALE_Y,
-                View.SCALE_Y);
-        if (scaleXAnimator == null) {
-            return scaleYAnimator;
-        } else if (scaleYAnimator == null) {
-            return scaleXAnimator;
-        }
-        AnimatorSet animatorSet = new AnimatorSet();
-        animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
-        return animatorSet;
-    }
-
-    private Animator createScaleAnimator(TransitionValues startValues, TransitionValues endValues,
-            String propertyName, Property<View, Float> scaleProperty) {
-        float start = (Float)startValues.values.get(propertyName);
-        float end = (Float)endValues.values.get(propertyName);
-        if (start == end) {
-            return null;
-        }
-        return ObjectAnimator.ofFloat(endValues.view, scaleProperty, start, end);
-    }
-}