1164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner/*
2164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * Copyright (C) 2011 The Android Open Source Project
3164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner *
4164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * you may not use this file except in compliance with the License.
6164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * You may obtain a copy of the License at
7164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner *
8164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner *
10164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * Unless required by applicable law or agreed to in writing, software
11164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * See the License for the specific language governing permissions and
14164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner * limitations under the License.
15164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner */
16164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
17164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerpackage com.android.server.wm;
18164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
19164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.content.Context;
20164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.graphics.Bitmap;
21164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.graphics.Point;
22164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.os.Debug;
23164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.os.Handler;
24164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.os.IRemoteCallback;
25164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.util.Slog;
26164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.WindowManager;
27164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.AlphaAnimation;
28164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.Animation;
29164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.AnimationSet;
30164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.AnimationUtils;
31164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.Interpolator;
32164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport android.view.animation.ScaleAnimation;
33164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
34164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport com.android.internal.util.DumpUtils.Dump;
35164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport com.android.server.AttributeCache;
36164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport com.android.server.wm.WindowManagerService.H;
37164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
38164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerimport java.io.PrintWriter;
39164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
409a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation;
419a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
429a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation;
439a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
449a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation;
459a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
469a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation;
479a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
489a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation;
499a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
509a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation;
519a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
529a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
539a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
549a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation;
559a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
569a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation;
579a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
589a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation;
599a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautnerimport static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
609a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
61164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner// State management of app transitions.  When we are preparing for a
62164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner// transition, mNextAppTransition will be the kind of transition to
63164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner// perform or TRANSIT_NONE if we are not waiting.  If we are waiting,
64164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner// mOpeningApps and mClosingApps are the lists of tokens that will be
65164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner// made visible or hidden at the next transition.
66164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautnerpublic class AppTransition implements Dump {
67164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private static final String TAG = "AppTransition";
68321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    private static final boolean DEBUG_APP_TRANSITIONS =
69321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            WindowManagerService.DEBUG_APP_TRANSITIONS;
70321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    private static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM;
71321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
729a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** Bit mask that is set for all enter transition. */
734b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_ENTER_MASK = 0x1000;
749a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
759a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** Bit mask that is set for all exit transitions. */
764b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_EXIT_MASK = 0x2000;
779a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
784b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** Not set up for a transition. */
794b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_UNSET = -1;
804b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** No animation for transition. */
814b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_NONE = 0;
824b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** A window in a new activity is being opened on top of an existing one in the same task. */
834b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_ACTIVITY_OPEN = 6 | TRANSIT_ENTER_MASK;
844b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** The window in the top-most activity is being closed to reveal the
854b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * previous activity in the same task. */
864b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_ACTIVITY_CLOSE = 7 | TRANSIT_EXIT_MASK;
874b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** A window in a new task is being opened on top of an existing one
884b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * in another activity's task. */
894b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_TASK_OPEN = 8 | TRANSIT_ENTER_MASK;
904b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** A window in the top-most activity is being closed to reveal the
914b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * previous activity in a different task. */
924b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_TASK_CLOSE = 9 | TRANSIT_EXIT_MASK;
934b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** A window in an existing task is being displayed on top of an existing one
944b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * in another activity's task. */
954b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_TASK_TO_FRONT = 10 | TRANSIT_ENTER_MASK;
964b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /** A window in an existing task is being put below all other tasks. */
974b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_TASK_TO_BACK = 11 | TRANSIT_EXIT_MASK;
989a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** A window in a new activity that doesn't have a wallpaper is being opened on top of one that
999a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner     * does, effectively closing the wallpaper. */
1004b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_WALLPAPER_CLOSE = 12 | TRANSIT_EXIT_MASK;
1019a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** A window in a new activity that does have a wallpaper is being opened on one that didn't,
1029a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner     * effectively opening the wallpaper. */
1034b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_WALLPAPER_OPEN = 13 | TRANSIT_ENTER_MASK;
1049a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** A window in a new activity is being opened on top of an existing one, and both are on top
1059a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner     * of the wallpaper. */
1064b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_WALLPAPER_INTRA_OPEN = 14 | TRANSIT_ENTER_MASK;
1079a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    /** The window in the top-most activity is being closed to reveal the previous activity, and
1089a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner     * both are on top of the wallpaper. */
1094b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static final int TRANSIT_WALLPAPER_INTRA_CLOSE = 15 | TRANSIT_EXIT_MASK;
1104b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner
111321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    /** Fraction of animation at which the recents thumbnail becomes completely transparent */
1129a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.25f;
1139a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
1149a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final long DEFAULT_APP_TRANSITION_DURATION = 250;
115321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
1169a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final Context mContext;
1179a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final Handler mH;
118164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
1199a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransition = TRANSIT_UNSET;
120164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
1219a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final int NEXT_TRANSIT_TYPE_NONE = 0;
1229a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final int NEXT_TRANSIT_TYPE_CUSTOM = 1;
1239a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final int NEXT_TRANSIT_TYPE_SCALE_UP = 2;
1249a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP = 3;
1259a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN = 4;
1269a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
1279a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
1289a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private String mNextAppTransitionPackage;
1299a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private Bitmap mNextAppTransitionThumbnail;
130164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    // Used for thumbnail transitions. True if we're scaling up, false if scaling down
1319a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private boolean mNextAppTransitionScaleUp;
1329a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private IRemoteCallback mNextAppTransitionCallback;
1339a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionEnter;
1349a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionExit;
1359a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionStartX;
1369a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionStartY;
1379a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionStartWidth;
1389a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mNextAppTransitionStartHeight;
1399a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
1409a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final static int APP_STATE_IDLE = 0;
1419a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final static int APP_STATE_READY = 1;
1429a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final static int APP_STATE_RUNNING = 2;
1439a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final static int APP_STATE_TIMEOUT = 3;
1449a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private int mAppTransitionState = APP_STATE_IDLE;
1459a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
1469a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private final int mConfigShortAnimTime;
147321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    private final Interpolator mDecelerateInterpolator;
148321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    private final Interpolator mThumbnailFadeoutInterpolator;
149164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
1504befbecfcc286652209126b9a64883b35544157dAmith Yamasani    private int mCurrentUserId = 0;
1514befbecfcc286652209126b9a64883b35544157dAmith Yamasani
152164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    AppTransition(Context context, Handler h) {
153164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mContext = context;
154164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mH = h;
155164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mConfigShortAnimTime = context.getResources().getInteger(
156164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                com.android.internal.R.integer.config_shortAnimTime);
157321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        mDecelerateInterpolator = AnimationUtils.loadInterpolator(context,
158321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                com.android.internal.R.interpolator.decelerate_cubic);
159321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        mThumbnailFadeoutInterpolator = new Interpolator() {
160321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            @Override
161321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            public float getInterpolation(float input) {
162321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                // Linear response for first fraction, then complete after that.
163321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                if (input < RECENTS_THUMBNAIL_FADEOUT_FRACTION) {
164321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                    return input / RECENTS_THUMBNAIL_FADEOUT_FRACTION;
165321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                }
166321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                return 1.0f;
167321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            }
168321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        };
169164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
170164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
171164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isTransitionSet() {
172164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return mNextAppTransition != TRANSIT_UNSET;
173164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
174164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
175164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isTransitionNone() {
176164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return mNextAppTransition == TRANSIT_NONE;
177164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
178164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
179164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isTransitionEqual(int transit) {
180164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return mNextAppTransition == transit;
181164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
182164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
183164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    int getAppTransition() {
184321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        return mNextAppTransition;
185164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     }
186164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
187164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void setAppTransition(int transit) {
188164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mNextAppTransition = transit;
189164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
190164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
191164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isReady() {
1929a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        return mAppTransitionState == APP_STATE_READY
1939a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                || mAppTransitionState == APP_STATE_TIMEOUT;
194164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
195164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
196ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner    void setReady() {
1979a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        mAppTransitionState = APP_STATE_READY;
198164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
199164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
200164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isRunning() {
2019a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        return mAppTransitionState == APP_STATE_RUNNING;
202164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
203164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
2049a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    void setIdle() {
2059a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        mAppTransitionState = APP_STATE_IDLE;
206164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
207164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
208164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    boolean isTimeout() {
2099a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        return mAppTransitionState == APP_STATE_TIMEOUT;
210164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
211164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
2129a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    void setTimeout() {
2139a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        mAppTransitionState = APP_STATE_TIMEOUT;
214164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
215164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
216164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    Bitmap getNextAppTransitionThumbnail() {
217164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return mNextAppTransitionThumbnail;
218164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
219164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
220164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void getStartingPoint(Point outPoint) {
221164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        outPoint.x = mNextAppTransitionStartX;
222164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        outPoint.y = mNextAppTransitionStartY;
223164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
224164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
225164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void prepare() {
2269a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        if (!isRunning()) {
2279a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            mAppTransitionState = APP_STATE_IDLE;
2289a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        }
229164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
230164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
231164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void goodToGo() {
2324b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner        mNextAppTransition = TRANSIT_UNSET;
2339a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        mAppTransitionState = APP_STATE_RUNNING;
234164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
235164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
236164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void clear() {
2379a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
238164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mNextAppTransitionPackage = null;
239164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        mNextAppTransitionThumbnail = null;
240164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
241164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
2429a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    void freeze() {
2439a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        setAppTransition(AppTransition.TRANSIT_UNSET);
2449a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        clear();
2459a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        setReady();
2469a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    }
2479a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
248164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
249164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
250164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                + (lp != null ? lp.packageName : null)
251164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
252164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (lp != null && lp.windowAnimations != 0) {
253164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // If this is a system resource, don't try to load it from the
254164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // application resources.  It is nice to avoid loading application
255164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // resources if we can.
256164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            String packageName = lp.packageName != null ? lp.packageName : "android";
257164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            int resId = lp.windowAnimations;
258164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if ((resId&0xFF000000) == 0x01000000) {
259164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                packageName = "android";
260164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
261164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
262164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + packageName);
263164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            return AttributeCache.instance().get(packageName, resId,
2644befbecfcc286652209126b9a64883b35544157dAmith Yamasani                    com.android.internal.R.styleable.WindowAnimation, mCurrentUserId);
265164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
266164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return null;
267164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
268164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
269164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
270164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package="
271164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                + packageName + " resId=0x" + Integer.toHexString(resId));
272164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (packageName != null) {
273164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if ((resId&0xFF000000) == 0x01000000) {
274164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                packageName = "android";
275164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
276164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
277164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + packageName);
278164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            return AttributeCache.instance().get(packageName, resId,
2794befbecfcc286652209126b9a64883b35544157dAmith Yamasani                    com.android.internal.R.styleable.WindowAnimation, mCurrentUserId);
280164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
281164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return null;
282164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
283164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
284164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) {
285164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        int anim = 0;
286164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        Context context = mContext;
287164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (animAttr >= 0) {
288164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            AttributeCache.Entry ent = getCachedAnimations(lp);
289164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (ent != null) {
290164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                context = ent.context;
291164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                anim = ent.array.getResourceId(animAttr, 0);
292164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
293164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
294164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (anim != 0) {
295164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            return AnimationUtils.loadAnimation(context, anim);
296164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
297164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return null;
298164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
299164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
300164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private Animation loadAnimation(String packageName, int resId) {
301164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        int anim = 0;
302164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        Context context = mContext;
303164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (resId >= 0) {
304164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
305164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (ent != null) {
306164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                context = ent.context;
307164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                anim = resId;
308164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
309164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
310164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (anim != 0) {
311164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            return AnimationUtils.loadAnimation(context, anim);
312164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
313164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return null;
314164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
315164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
316164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    /**
317164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * Compute the pivot point for an animation that is scaling from a small
318164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * rect on screen to a larger rect.  The pivot point varies depending on
319164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * the distance between the inner and outer edges on both sides.  This
320164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * function computes the pivot point for one dimension.
321164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * @param startPos  Offset from left/top edge of outer rectangle to
322164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * left/top edge of inner rectangle.
323164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * @param finalScale The scaling factor between the size of the outer
324164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     * and inner rectangles.
325164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner     */
326164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private static float computePivot(int startPos, float finalScale) {
327164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        final float denom = finalScale-1;
328164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (Math.abs(denom) < .0001f) {
329164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            return startPos;
330164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
331164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return -startPos / denom;
332164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
333164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
334164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    private Animation createScaleUpAnimationLocked(int transit, boolean enter,
335164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                                                   int appWidth, int appHeight) {
336164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        Animation a = null;
337164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (enter) {
338164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // Entering app zooms out from the center of the initial rect.
339164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            float scaleW = mNextAppTransitionStartWidth / (float) appWidth;
340164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            float scaleH = mNextAppTransitionStartHeight / (float) appHeight;
341164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            Animation scale = new ScaleAnimation(scaleW, 1, scaleH, 1,
342164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    computePivot(mNextAppTransitionStartX, scaleW),
343164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    computePivot(mNextAppTransitionStartY, scaleH));
344321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            scale.setInterpolator(mDecelerateInterpolator);
345321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
346164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            Animation alpha = new AlphaAnimation(0, 1);
347321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            alpha.setInterpolator(mThumbnailFadeoutInterpolator);
348321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
349321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            AnimationSet set = new AnimationSet(false);
350164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            set.addAnimation(scale);
351164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            set.addAnimation(alpha);
352164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            set.setDetachWallpaper(true);
353164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            a = set;
3544b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner        } else  if (transit == TRANSIT_WALLPAPER_INTRA_OPEN ||
3554b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                    transit == TRANSIT_WALLPAPER_INTRA_CLOSE) {
356321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            // If we are on top of the wallpaper, we need an animation that
357321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            // correctly handles the wallpaper staying static behind all of
358321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            // the animated elements.  To do this, will just have the existing
359321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            // element fade out.
360321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            a = new AlphaAnimation(1, 0);
361321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            a.setDetachWallpaper(true);
362164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else {
363321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            // For normal animations, the exiting element just holds in place.
364321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            a = new AlphaAnimation(1, 1);
365164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
366164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
367164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        // Pick the desired duration.  If this is an inter-activity transition,
368164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        // it  is the standard duration for that.  Otherwise we use the longer
369164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        // task transition duration.
370321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final long duration;
371164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        switch (transit) {
3724b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_OPEN:
3734b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_CLOSE:
374164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                duration = mConfigShortAnimTime;
375164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                break;
376164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            default:
377321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                duration = DEFAULT_APP_TRANSITION_DURATION;
378164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                break;
379164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
380321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.setDuration(duration);
381321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.setFillAfter(true);
382321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.setInterpolator(mDecelerateInterpolator);
383321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.initialize(appWidth, appHeight, appWidth, appHeight);
384321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        return a;
385321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    }
386321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
387321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner    Animation createThumbnailAnimationLocked(int transit, boolean enter, boolean thumb,
388321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                                    int appWidth, int appHeight) {
389321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        Animation a;
390321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final int thumbWidthI = mNextAppTransitionThumbnail.getWidth();
391321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final float thumbWidth = thumbWidthI > 0 ? thumbWidthI : 1;
392321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final int thumbHeightI = mNextAppTransitionThumbnail.getHeight();
393321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final float thumbHeight = thumbHeightI > 0 ? thumbHeightI : 1;
394164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (thumb) {
395164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // Animation for zooming thumbnail from its initial size to
396164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // filling the screen.
397164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (mNextAppTransitionScaleUp) {
398164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleW = appWidth / thumbWidth;
399164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleH = appHeight / thumbHeight;
400164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                Animation scale = new ScaleAnimation(1, scaleW, 1, scaleH,
401164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartX, 1 / scaleW),
402164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartY, 1 / scaleH));
403321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                scale.setInterpolator(mDecelerateInterpolator);
404321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
405164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                Animation alpha = new AlphaAnimation(1, 0);
406321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                alpha.setInterpolator(mThumbnailFadeoutInterpolator);
407321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
408321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                // This AnimationSet uses the Interpolators assigned above.
409321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                AnimationSet set = new AnimationSet(false);
410164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                set.addAnimation(scale);
411164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                set.addAnimation(alpha);
412164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                a = set;
413164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            } else {
414164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleW = appWidth / thumbWidth;
415164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleH = appHeight / thumbHeight;
416321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                a = new ScaleAnimation(scaleW, 1, scaleH, 1,
417164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartX, 1 / scaleW),
418164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartY, 1 / scaleH));
419164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
420164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else if (enter) {
421164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // Entering app zooms out from the center of the thumbnail.
422164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (mNextAppTransitionScaleUp) {
423164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleW = thumbWidth / appWidth;
424164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleH = thumbHeight / appHeight;
425321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                a = new ScaleAnimation(scaleW, 1, scaleH, 1,
426164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartX, scaleW),
427164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartY, scaleH));
428164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            } else {
429164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                // noop animation
430164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                a = new AlphaAnimation(1, 1);
431164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
432164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else {
433164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            // Exiting app
434164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (mNextAppTransitionScaleUp) {
4354b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                if (transit == TRANSIT_WALLPAPER_INTRA_OPEN) {
436164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    // Fade out while bringing up selected activity. This keeps the
437164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    // current activity from showing through a launching wallpaper
438164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    // activity.
439164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    a = new AlphaAnimation(1, 0);
440164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                } else {
441164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    // noop animation
442164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    a = new AlphaAnimation(1, 1);
443164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                }
444164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            } else {
445164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleW = thumbWidth / appWidth;
446164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                float scaleH = thumbHeight / appHeight;
447164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                Animation scale = new ScaleAnimation(1, scaleW, 1, scaleH,
448164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartX, scaleW),
449164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        computePivot(mNextAppTransitionStartY, scaleH));
450321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
451164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                Animation alpha = new AlphaAnimation(1, 0);
452321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
453321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                AnimationSet set = new AnimationSet(true);
454164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                set.addAnimation(scale);
455164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                set.addAnimation(alpha);
456164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                set.setZAdjustment(Animation.ZORDER_TOP);
457164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                a = set;
458164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
459164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
460321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner
461321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        // Pick the desired duration.  If this is an inter-activity transition,
462321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        // it  is the standard duration for that.  Otherwise we use the longer
463321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        // task transition duration.
464321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        final long duration;
465321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        switch (transit) {
4664b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_OPEN:
4674b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_CLOSE:
468321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                duration = mConfigShortAnimTime;
469321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                break;
470321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner            default:
471321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                duration = DEFAULT_APP_TRANSITION_DURATION;
472321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner                break;
473321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        }
474321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.setDuration(duration);
475164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        a.setFillAfter(true);
476321bdf52a1b277a687c8618bcd20c3cfc5a60b40Craig Mautner        a.setInterpolator(mDecelerateInterpolator);
477164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        a.initialize(appWidth, appHeight, appWidth, appHeight);
478164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return a;
479164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
480164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
481164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
482164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
483164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                            int appWidth, int appHeight) {
484164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        Animation a;
4859a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM) {
486164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            a = loadAnimation(mNextAppTransitionPackage, enter ?
487164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    mNextAppTransitionEnter : mNextAppTransitionExit);
488164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
489164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    "applyAnimation:"
490164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " anim=" + a + " nextAppTransition=ANIM_CUSTOM"
491164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " transit=" + transit + " isEntrance=" + enter
492164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " Callers=" + Debug.getCallers(3));
4939a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_SCALE_UP) {
494164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            a = createScaleUpAnimationLocked(transit, enter, appWidth, appHeight);
495164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
496164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    "applyAnimation:"
497164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " anim=" + a + " nextAppTransition=ANIM_SCALE_UP"
498164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " transit=" + transit + " isEntrance=" + enter
499164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " Callers=" + Debug.getCallers(3));
5009a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP ||
5019a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN) {
502164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionScaleUp =
5039a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                    (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP);
504164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            a = createThumbnailAnimationLocked(transit, enter, false, appWidth, appHeight);
505164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) {
506164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                String animName = mNextAppTransitionScaleUp ?
507164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        "ANIM_THUMBNAIL_SCALE_UP" : "ANIM_THUMBNAIL_SCALE_DOWN";
508164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                Slog.v(TAG, "applyAnimation:"
509164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        + " anim=" + a + " nextAppTransition=" + animName
510164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        + " transit=" + transit + " isEntrance=" + enter
511164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        + " Callers=" + Debug.getCallers(3));
512164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
513164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else {
514164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            int animAttr = 0;
515164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            switch (transit) {
5164b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_ACTIVITY_OPEN:
517164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5189a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_activityOpenEnterAnimation
5199a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_activityOpenExitAnimation;
520164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5214b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_ACTIVITY_CLOSE:
522164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5239a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_activityCloseEnterAnimation
5249a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_activityCloseExitAnimation;
525164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5264b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_TASK_OPEN:
527164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5289a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_taskOpenEnterAnimation
5299a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_taskOpenExitAnimation;
530164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5314b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_TASK_CLOSE:
532164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5339a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_taskCloseEnterAnimation
5349a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_taskCloseExitAnimation;
535164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5364b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_TASK_TO_FRONT:
537164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5389a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_taskToFrontEnterAnimation
5399a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_taskToFrontExitAnimation;
540164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5414b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_TASK_TO_BACK:
542164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5439a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_taskToBackEnterAnimation
5449a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_taskToBackExitAnimation;
545164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5464b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_WALLPAPER_OPEN:
547164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5489a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_wallpaperOpenEnterAnimation
5499a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_wallpaperOpenExitAnimation;
550164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5514b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_WALLPAPER_CLOSE:
552164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5539a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_wallpaperCloseEnterAnimation
5549a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_wallpaperCloseExitAnimation;
555164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5564b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_WALLPAPER_INTRA_OPEN:
557164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5589a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_wallpaperIntraOpenEnterAnimation
5599a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_wallpaperIntraOpenExitAnimation;
560164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
5614b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                case TRANSIT_WALLPAPER_INTRA_CLOSE:
562164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    animAttr = enter
5639a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            ? WindowAnimation_wallpaperIntraCloseEnterAnimation
5649a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                            : WindowAnimation_wallpaperIntraCloseExitAnimation;
565164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    break;
566164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            }
567164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
568164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
569164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    "applyAnimation:"
570164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " anim=" + a
571164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " animAttr=0x" + Integer.toHexString(animAttr)
572164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " transit=" + transit + " isEntrance=" + enter
573164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                    + " Callers=" + Debug.getCallers(3));
574164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
575164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return a;
576164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
577164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
578164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void postAnimationCallback() {
579164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (mNextAppTransitionCallback != null) {
580164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mH.sendMessage(mH.obtainMessage(H.DO_ANIMATION_CALLBACK, mNextAppTransitionCallback));
581164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionCallback = null;
582164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
583164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
584164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
585164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim,
586164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                                             IRemoteCallback startedCallback) {
587164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (isTransitionSet()) {
5889a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            mNextAppTransitionType = NEXT_TRANSIT_TYPE_CUSTOM;
589164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionPackage = packageName;
590164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionThumbnail = null;
591164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionEnter = enterAnim;
592164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionExit = exitAnim;
593164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            postAnimationCallback();
594164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionCallback = startedCallback;
595164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else {
596164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            postAnimationCallback();
597164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
598164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
599164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
600164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
601164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                                                    int startHeight) {
602164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (isTransitionSet()) {
6039a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            mNextAppTransitionType = NEXT_TRANSIT_TYPE_SCALE_UP;
604164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionPackage = null;
605164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionThumbnail = null;
606164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartX = startX;
607164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartY = startY;
608164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartWidth = startWidth;
609164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartHeight = startHeight;
610164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            postAnimationCallback();
611164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionCallback = null;
612164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
613164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
614164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
615164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
616164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                                           IRemoteCallback startedCallback, boolean scaleUp) {
617164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (isTransitionSet()) {
6189a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            mNextAppTransitionType = scaleUp ? NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP
6199a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                    : NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN;
620164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionPackage = null;
621164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionThumbnail = srcThumb;
622164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionScaleUp = scaleUp;
623164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartX = startX;
624164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionStartY = startY;
625164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            postAnimationCallback();
626164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            mNextAppTransitionCallback = startedCallback;
627164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        } else {
628164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            postAnimationCallback();
629164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
630164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
631164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
632164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    @Override
633164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    public String toString() {
634164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        return "mNextAppTransition=0x" + Integer.toHexString(mNextAppTransition);
635164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
636164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner
6374b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    /**
6384b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * Returns the human readable name of a window transition.
6394b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     *
6404b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * @param transition The window transition.
6414b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     * @return The transition symbolic name.
6424b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner     */
6434b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    public static String appTransitionToString(int transition) {
6444b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner        switch (transition) {
6454b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_UNSET: {
6464b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_UNSET";
6474b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6484b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_NONE: {
6494b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_NONE";
6504b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6514b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_EXIT_MASK: {
6524b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_EXIT_MASK";
6534b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6544b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_OPEN: {
6554b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_ACTIVITY_OPEN";
6564b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6574b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_ACTIVITY_CLOSE: {
6584b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_ACTIVITY_CLOSE";
6594b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6604b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_TASK_OPEN: {
6614b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_TASK_OPEN";
6624b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6634b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_TASK_CLOSE: {
6644b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_TASK_CLOSE";
6654b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6664b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_TASK_TO_FRONT: {
6674b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_TASK_TO_FRONT";
6684b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6694b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_TASK_TO_BACK: {
6704b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_TASK_TO_BACK";
6714b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6724b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_WALLPAPER_CLOSE: {
6734b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_WALLPAPER_CLOSE";
6744b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6754b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_WALLPAPER_OPEN: {
6764b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_WALLPAPER_OPEN";
6774b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6784b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_WALLPAPER_INTRA_OPEN: {
6794b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_WALLPAPER_INTRA_OPEN";
6804b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6814b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            case TRANSIT_WALLPAPER_INTRA_CLOSE: {
6824b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "TRANSIT_WALLPAPER_INTRA_CLOSE";
6834b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6844b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            default: {
6854b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner                return "<UNKNOWN>";
6864b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner            }
6874b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner        }
6884b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner    }
6894b71aa1f8a1a3b7189fd29241ea7c594ce01623cCraig Mautner
6909a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private String appStateToString() {
6919a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        switch (mAppTransitionState) {
6929a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case APP_STATE_IDLE:
6939a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "APP_STATE_IDLE";
6949a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case APP_STATE_READY:
6959a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "APP_STATE_READY";
6969a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case APP_STATE_RUNNING:
6979a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "APP_STATE_RUNNING";
6989a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case APP_STATE_TIMEOUT:
6999a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "APP_STATE_TIMEOUT";
7009a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            default:
7019a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "unknown state=" + mAppTransitionState;
7029a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        }
7039a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    }
7049a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
7059a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    private String transitTypeToString() {
7069a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        switch (mNextAppTransitionType) {
7079a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_NONE:
7089a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "NEXT_TRANSIT_TYPE_NONE";
7099a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_CUSTOM:
7109a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "NEXT_TRANSIT_TYPE_CUSTOM";
7119a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_SCALE_UP:
7129a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "NEXT_TRANSIT_TYPE_SCALE_UP";
7139a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP:
7149a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP";
7159a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN:
7169a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN";
7179a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            default:
7189a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner                return "unknown type=" + mNextAppTransitionType;
7199a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        }
7209a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner    }
7219a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner
722164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    @Override
723164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    public void dump(PrintWriter pw) {
724164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        pw.print(" " + this);
7259a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        pw.print(" mAppTransitionState="); pw.println(appStateToString());
7269a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner        if (mNextAppTransitionType != NEXT_TRANSIT_TYPE_NONE) {
7279a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            pw.print("  mNextAppTransitionType="); pw.println(transitTypeToString());
728164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
729164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        switch (mNextAppTransitionType) {
7309a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_CUSTOM:
731164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionPackage=");
732164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.println(mNextAppTransitionPackage);
733164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionEnter=0x");
734164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(Integer.toHexString(mNextAppTransitionEnter));
735164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(" mNextAppTransitionExit=0x");
736164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.println(Integer.toHexString(mNextAppTransitionExit));
737164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                break;
7389a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_SCALE_UP:
739164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionStartX="); pw.print(mNextAppTransitionStartX);
740164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(" mNextAppTransitionStartY=");
741164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.println(mNextAppTransitionStartY);
742164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionStartWidth=");
743164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(mNextAppTransitionStartWidth);
744164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(" mNextAppTransitionStartHeight=");
745164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.println(mNextAppTransitionStartHeight);
746164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                break;
7479a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP:
7489a29a5d6790cda3f9eedd8231570d9b4f76c06cdCraig Mautner            case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN:
749164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionThumbnail=");
750164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(mNextAppTransitionThumbnail);
751164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(" mNextAppTransitionStartX=");
752164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(mNextAppTransitionStartX);
753164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.print(" mNextAppTransitionStartY=");
754164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                        pw.println(mNextAppTransitionStartY);
755164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                pw.print("  mNextAppTransitionScaleUp="); pw.println(mNextAppTransitionScaleUp);
756164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner                break;
757164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
758164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        if (mNextAppTransitionCallback != null) {
759164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            pw.print("  mNextAppTransitionCallback=");
760164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner            pw.println(mNextAppTransitionCallback);
761164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner        }
762164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner    }
7634befbecfcc286652209126b9a64883b35544157dAmith Yamasani
7644befbecfcc286652209126b9a64883b35544157dAmith Yamasani    public void setCurrentUser(int newUserId) {
7654befbecfcc286652209126b9a64883b35544157dAmith Yamasani        mCurrentUserId = newUserId;
7664befbecfcc286652209126b9a64883b35544157dAmith Yamasani    }
767164d4bb4c3eeba1488d9b4994980d24c1f6ec961Craig Mautner}
768