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