ActivityOptions.java revision ddc52a80b5280d4a67180a6caae8c7dead00157f
16de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn/*
26de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project
36de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn *
46de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
56de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * you may not use this file except in compliance with the License.
66de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * You may obtain a copy of the License at
76de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn *
86de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
96de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn *
106de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
116de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
126de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * See the License for the specific language governing permissions and
146de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * limitations under the License.
156de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn */
166de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
176de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackbornpackage android.app;
186de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
196de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackbornimport android.content.Context;
208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.graphics.Bitmap;
216de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackbornimport android.os.Bundle;
228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.os.Handler;
238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.os.IRemoteCallback;
248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.os.RemoteException;
258078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.view.View;
266de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
276de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn/**
286de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * Helper class for building an options Bundle that can be used with
296de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * {@link android.content.Context#startActivity(android.content.Intent, android.os.Bundle)
306de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn * Context.startActivity(Intent, Bundle)} and related methods.
316de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn */
326de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackbornpublic class ActivityOptions {
336de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
346de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * The package name that created the options.
356de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @hide
366de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
376de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public static final String KEY_PACKAGE_NAME = "android:packageName";
386de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
396de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Type of animation that arguments specify.
418078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @hide
428078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final String KEY_ANIM_TYPE = "android:animType";
448078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
458078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
466de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Custom enter animation resource ID.
476de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @hide
486de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
496de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public static final String KEY_ANIM_ENTER_RES_ID = "android:animEnterRes";
506de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
516de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
526de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Custom exit animation resource ID.
536de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @hide
546de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
556de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public static final String KEY_ANIM_EXIT_RES_ID = "android:animExitRes";
566de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Bitmap for thumbnail animation.
598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @hide
608078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
618078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final String KEY_ANIM_THUMBNAIL = "android:animThumbnail";
628078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
638078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
648078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Start X position of thumbnail animation.
658078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @hide
668078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
678078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final String KEY_ANIM_START_X = "android:animStartX";
688078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
698078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
708078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Start Y position of thumbnail animation.
718078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @hide
728078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
738078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final String KEY_ANIM_START_Y = "android:animStartY";
748078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
758078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
76eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * Initial width of the animation.
77eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @hide
78eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     */
79eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public static final String KEY_ANIM_START_WIDTH = "android:animStartWidth";
80eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn
81eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /**
82eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * Initial height of the animation.
83eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @hide
84eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     */
85eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public static final String KEY_ANIM_START_HEIGHT = "android:animStartHeight";
86eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn
87eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /**
888078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Callback for when animation is started.
898078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @hide
908078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
918078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final String KEY_ANIM_START_LISTENER = "android:animStartListener";
928078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
938078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
948078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final int ANIM_NONE = 0;
958078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
968078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static final int ANIM_CUSTOM = 1;
978078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
98eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public static final int ANIM_SCALE_UP = 2;
99eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /** @hide */
100eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public static final int ANIM_THUMBNAIL = 3;
1018078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
1026de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    private String mPackageName;
1038078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private int mAnimationType = ANIM_NONE;
1046de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    private int mCustomEnterResId;
1056de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    private int mCustomExitResId;
1068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private Bitmap mThumbnail;
1078078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private int mStartX;
1088078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private int mStartY;
109eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    private int mStartWidth;
110eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    private int mStartHeight;
1118078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private IRemoteCallback mAnimationStartedListener;
1126de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
1136de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
1146de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Create an ActivityOptions specifying a custom animation to run when
1156de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * the activity is displayed.
1166de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     *
1176de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @param context Who is defining this.  This is the application that the
1186de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * animation resources will be loaded from.
1196de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @param enterResId A resource ID of the animation resource to use for
1206de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * the incoming activity.  Use 0 for no animation.
1216de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @param exitResId A resource ID of the animation resource to use for
1226de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * the outgoing activity.  Use 0 for no animation.
1236de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * @return Returns a new ActivityOptions object that you can use to
1246de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * supply these options as the options Bundle when starting an activity.
1256de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
1266de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public static ActivityOptions makeCustomAnimation(Context context,
1276de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn            int enterResId, int exitResId) {
1286de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        ActivityOptions opts = new ActivityOptions();
1296de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        opts.mPackageName = context.getPackageName();
1308078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mAnimationType = ANIM_CUSTOM;
1316de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        opts.mCustomEnterResId = enterResId;
1326de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        opts.mCustomExitResId = exitResId;
1336de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        return opts;
1346de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
1356de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
1368078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
1378078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Callback for use with {@link ActivityOptions#makeThumbnailScaleUpAnimation}
1388078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * to find out when the given animation has started running.
1399944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * @hide
1408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
1418078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public interface OnAnimationStartedListener {
1428078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        void onAnimationStarted();
1438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
1448078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
1458078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
146eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * Create an ActivityOptions specifying an animation where the new
147eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * activity is scaled from a small originating area of the screen to
148eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * its final full representation.
149eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     *
150eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param source The View that the new activity is animating from.  This
151eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * defines the coordinate space for <var>startX</var> and <var>startY</var>.
152eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startX The x starting location of the new activity, relative to <var>source</var>.
153eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startY The y starting location of the activity, relative to <var>source</var>.
154eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startWidth The initial width of the new activity.
155eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startWidth The initial height of the new activity.
156eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @return Returns a new ActivityOptions object that you can use to
157eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * supply these options as the options Bundle when starting an activity.
158eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     */
159eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public static ActivityOptions makeScaleUpAnimation(View source,
160eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            int startX, int startY, int startWidth, int startHeight) {
161eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        ActivityOptions opts = new ActivityOptions();
162eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mPackageName = source.getContext().getPackageName();
163eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mAnimationType = ANIM_SCALE_UP;
164eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        int[] pts = new int[2];
165eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        source.getLocationOnScreen(pts);
166eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mStartX = pts[0] + startX;
167eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mStartY = pts[1] + startY;
168eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mStartWidth = startWidth;
169eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        opts.mStartHeight = startHeight;
170eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        return opts;
171eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    }
172eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn
173eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /**
1748078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * Create an ActivityOptions specifying an animation where a thumbnail
1758078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * is scaled from a given position to the new activity window that is
1768078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * being started.
1778078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     *
1788078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @param source The View that this thumbnail is animating from.  This
1798078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * defines the coordinate space for <var>startX</var> and <var>startY</var>.
1808078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @param thumbnail The bitmap that will be shown as the initial thumbnail
1818078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * of the animation.
182eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startX The x starting location of the bitmap, relative to <var>source</var>.
183eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startY The y starting location of the bitmap, relative to <var>source</var>.
1849944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * @return Returns a new ActivityOptions object that you can use to
1859944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * supply these options as the options Bundle when starting an activity.
1869944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     */
1879944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn    public static ActivityOptions makeThumbnailScaleUpAnimation(View source,
1889944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn            Bitmap thumbnail, int startX, int startY) {
1899944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn        return makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY, null);
1909944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn    }
1919944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn
1929944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn    /**
1939944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * Create an ActivityOptions specifying an animation where a thumbnail
1949944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * is scaled from a given position to the new activity window that is
1959944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * being started.
1969944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     *
1979944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * @param source The View that this thumbnail is animating from.  This
1989944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * defines the coordinate space for <var>startX</var> and <var>startY</var>.
1999944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * @param thumbnail The bitmap that will be shown as the initial thumbnail
2009944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * of the animation.
201eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startX The x starting location of the bitmap, relative to <var>source</var>.
202eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn     * @param startY The y starting location of the bitmap, relative to <var>source</var>.
2038078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @param listener Optional OnAnimationStartedListener to find out when the
2048078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * requested animation has started running.  If for some reason the animation
2058078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * is not executed, the callback will happen immediately.
2068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @return Returns a new ActivityOptions object that you can use to
2078078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * supply these options as the options Bundle when starting an activity.
2089944ecd28e1c56c4e9f0a50ed6e8be2110ba5c31Dianne Hackborn     * @hide
2098078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
2108078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static ActivityOptions makeThumbnailScaleUpAnimation(View source,
2118078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener) {
2128078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        ActivityOptions opts = new ActivityOptions();
2138078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mPackageName = source.getContext().getPackageName();
2148078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mAnimationType = ANIM_THUMBNAIL;
2158078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mThumbnail = thumbnail;
2168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        int[] pts = new int[2];
2178078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        source.getLocationOnScreen(pts);
2188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mStartX = pts[0] + startX;
2198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        opts.mStartY = pts[1] + startY;
2208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (listener != null) {
2218078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            final Handler h = source.getHandler();
2228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            final OnAnimationStartedListener finalListener = listener;
2238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            opts.mAnimationStartedListener = new IRemoteCallback.Stub() {
2248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                @Override public void sendResult(Bundle data) throws RemoteException {
2258078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    h.post(new Runnable() {
2268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        @Override public void run() {
2278078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            finalListener.onAnimationStarted();
2288078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        }
2298078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    });
2308078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
2318078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            };
2328078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
2338078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return opts;
2348078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
2358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
2366de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    private ActivityOptions() {
2376de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2386de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2396de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /** @hide */
2406de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public ActivityOptions(Bundle opts) {
2416de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        mPackageName = opts.getString(KEY_PACKAGE_NAME);
2428078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        mAnimationType = opts.getInt(KEY_ANIM_TYPE);
2438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (mAnimationType == ANIM_CUSTOM) {
2446de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn            mCustomEnterResId = opts.getInt(KEY_ANIM_ENTER_RES_ID, 0);
2456de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn            mCustomExitResId = opts.getInt(KEY_ANIM_EXIT_RES_ID, 0);
246eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        } else if (mAnimationType == ANIM_SCALE_UP) {
247eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            mStartX = opts.getInt(KEY_ANIM_START_X, 0);
248eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
249eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            mStartWidth = opts.getInt(KEY_ANIM_START_WIDTH, 0);
250eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            mStartHeight = opts.getInt(KEY_ANIM_START_HEIGHT, 0);
2518078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        } else if (mAnimationType == ANIM_THUMBNAIL) {
2528078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            mThumbnail = (Bitmap)opts.getParcelable(KEY_ANIM_THUMBNAIL);
2538078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            mStartX = opts.getInt(KEY_ANIM_START_X, 0);
2548078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
2558078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            mAnimationStartedListener = IRemoteCallback.Stub.asInterface(
2568078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    opts.getIBinder(KEY_ANIM_START_LISTENER));
2576de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        }
2586de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2596de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2606de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /** @hide */
2616de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public String getPackageName() {
2626de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        return mPackageName;
2636de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2646de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2656de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /** @hide */
2668078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public int getAnimationType() {
2678078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return mAnimationType;
2686de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2696de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2706de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /** @hide */
2716de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public int getCustomEnterResId() {
2726de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        return mCustomEnterResId;
2736de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2746de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2756de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /** @hide */
2766de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public int getCustomExitResId() {
2776de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        return mCustomExitResId;
2786de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
2796de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
2808078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
2818078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public Bitmap getThumbnail() {
2828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return mThumbnail;
2838078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
2848078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
2858078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
2868078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public int getStartX() {
2878078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return mStartX;
2888078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
2898078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
2908078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
2918078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public int getStartY() {
2928078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return mStartY;
2938078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
2948078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
2958078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
296eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public int getStartWidth() {
297eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        return mStartWidth;
298eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    }
299eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn
300eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /** @hide */
301eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    public int getStartHeight() {
302eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn        return mStartHeight;
303eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    }
304eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn
305eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn    /** @hide */
3068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public IRemoteCallback getOnAnimationStartListener() {
3078078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return mAnimationStartedListener;
3088078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
3098078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
3108078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
3118078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public void abort() {
3128078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (mAnimationStartedListener != null) {
3138078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            try {
3148078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mAnimationStartedListener.sendResult(null);
3158078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            } catch (RemoteException e) {
3168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            }
3178078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
3188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
3198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
3208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /** @hide */
3218078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public static void abort(Bundle options) {
3228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (options != null) {
3238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            (new ActivityOptions(options)).abort();
3248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
3258078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
3268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
3276de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
328ddc52a80b5280d4a67180a6caae8c7dead00157fDianne Hackborn     * Update the current values in this ActivityOptions from those supplied
329ddc52a80b5280d4a67180a6caae8c7dead00157fDianne Hackborn     * in <var>otherOptions</var>.  Any values
3306de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * defined in <var>otherOptions</var> replace those in the base options.
3316de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
332ddc52a80b5280d4a67180a6caae8c7dead00157fDianne Hackborn    public void update(ActivityOptions otherOptions) {
3336de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        if (otherOptions.mPackageName != null) {
3346de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn            mPackageName = otherOptions.mPackageName;
3356de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        }
3368078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        switch (otherOptions.mAnimationType) {
3378078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            case ANIM_CUSTOM:
3388078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mAnimationType = otherOptions.mAnimationType;
3398078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mCustomEnterResId = otherOptions.mCustomEnterResId;
3408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mCustomExitResId = otherOptions.mCustomExitResId;
3418078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mThumbnail = null;
3428078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mAnimationStartedListener = null;
3438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                break;
344eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            case ANIM_SCALE_UP:
345eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                mAnimationType = otherOptions.mAnimationType;
346eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                mStartX = otherOptions.mStartX;
347eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                mStartY = otherOptions.mStartY;
348eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                mStartWidth = otherOptions.mStartWidth;
349eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                mStartHeight = otherOptions.mStartHeight;
350eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                break;
3518078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            case ANIM_THUMBNAIL:
3528078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mAnimationType = otherOptions.mAnimationType;
3538078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mThumbnail = otherOptions.mThumbnail;
3548078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mStartX = otherOptions.mStartX;
3558078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mStartY = otherOptions.mStartY;
3568078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                if (otherOptions.mAnimationStartedListener != null) {
3578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    try {
3588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        otherOptions.mAnimationStartedListener.sendResult(null);
3598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    } catch (RemoteException e) {
3608078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    }
3618078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
3628078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                mAnimationStartedListener = otherOptions.mAnimationStartedListener;
3638078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                break;
3646de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        }
3656de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
3666de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn
3676de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    /**
3686de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Returns the created options as a Bundle, which can be passed to
3696de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * {@link android.content.Context#startActivity(android.content.Intent, android.os.Bundle)
3706de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Context.startActivity(Intent, Bundle)} and related methods.
3716de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * Note that the returned Bundle is still owned by the ActivityOptions
3726de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * object; you must not modify it, but can supply it to the startActivity
3736de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     * methods that take an options Bundle.
3746de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn     */
3756de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    public Bundle toBundle() {
3766de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        Bundle b = new Bundle();
3776de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        if (mPackageName != null) {
3786de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn            b.putString(KEY_PACKAGE_NAME, mPackageName);
3796de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        }
3808078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        switch (mAnimationType) {
3818078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            case ANIM_CUSTOM:
3828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_TYPE, mAnimationType);
3838078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_ENTER_RES_ID, mCustomEnterResId);
3848078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_EXIT_RES_ID, mCustomExitResId);
3858078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                break;
386eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn            case ANIM_SCALE_UP:
387eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                b.putInt(KEY_ANIM_TYPE, mAnimationType);
388eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                b.putInt(KEY_ANIM_START_X, mStartX);
389eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                b.putInt(KEY_ANIM_START_Y, mStartY);
390eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                b.putInt(KEY_ANIM_START_WIDTH, mStartWidth);
391eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                b.putInt(KEY_ANIM_START_HEIGHT, mStartHeight);
392eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                break;
3938078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            case ANIM_THUMBNAIL:
3948078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_TYPE, mAnimationType);
3958078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putParcelable(KEY_ANIM_THUMBNAIL, mThumbnail);
3968078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_START_X, mStartX);
3978078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putInt(KEY_ANIM_START_Y, mStartY);
3988078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                b.putIBinder(KEY_ANIM_START_LISTENER, mAnimationStartedListener
3998078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        != null ? mAnimationStartedListener.asBinder() : null);
400eabfb3a36e9469c5e219f92b39b7200104319185Dianne Hackborn                break;
4016de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        }
4026de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn        return b;
4036de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn    }
4046de01a9b03ad6f8a1af4a0d893d952caa4b69d39Dianne Hackborn}
405