ActivityStack.java revision 80a4af2bbc6af42ae605e454bf89558e564f5244
150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/*
250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project
350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn *
450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License.
650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at
750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn *
850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn *
1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and
1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License.
1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */
1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am;
1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1935be7560300a97fc3675bdd325910f28827d9508Jeff Sharkeyimport static android.Manifest.permission.START_ANY_ACTIVITY;
2035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkeyimport static android.content.pm.PackageManager.PERMISSION_GRANTED;
2135be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey
2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity;
2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl;
2450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity;
270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.ActivityManager;
287a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackbornimport android.app.ActivityOptions;
2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals;
3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager;
310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever;
3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread;
3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent;
3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo;
3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult;
3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName;
3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context;
3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender;
3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent;
4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender;
4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo;
4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo;
4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager;
4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo;
4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration;
460aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources;
470aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap;
4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder;
49ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle;
5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler;
5150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder;
5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message;
5362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor;
5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager;
55e302a162359e191633e966520a6bab4ad569390cDianne Hackbornimport android.os.Process;
5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException;
5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock;
58f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog;
6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log;
6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog;
6259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display;
6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy;
6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException;
6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference;
6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList;
6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator;
6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List;
7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/**
7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities.
7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */
740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack {
7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final String TAG = ActivityManagerService.TAG;
76b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn    static final boolean localLOGV = ActivityManagerService.localLOGV;
7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH;
7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE;
7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY;
8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING;
8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION;
8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS;
8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION;
8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS;
8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
86ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    static final boolean DEBUG_STATES = false;
8798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
8898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_SAVED_STATE = false;
89ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS;
9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity telling us it
9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is idle.
9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int IDLE_TIMEOUT = 10*1000;
952a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
962a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    // Ticks during which we check progress while waiting for an app to launch.
972a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    static final int LAUNCH_TICK = 500;
982a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity to pause.  This
10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is short because it directly impacts the responsiveness of starting the
10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // next activity.
10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int PAUSE_TIMEOUT = 500;
10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
104162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // How long we wait for the activity to tell us it has stopped before
105162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // giving up.  This is a good amount of time because we really need this
106162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // from the application in order to get its saved state.
107162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    static final int STOP_TIMEOUT = 10*1000;
108162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn
1094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    // How long we can hold the sleep wake lock before giving up.
1104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    static final int SLEEP_TIMEOUT = 5*1000;
1114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we can hold the launch wake lock before giving up.
11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int LAUNCH_TIMEOUT = 10*1000;
11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on an activity telling us it has
11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // finished destroying itself.
11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int DESTROY_TIMEOUT = 10*1000;
11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long until we reset a task when the user returns to it.  Currently
120621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    // disabled.
121621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    static final long ACTIVITY_INACTIVE_RESET_TIME = 0;
12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // How long between activity launches that we consider safe to not warn
1240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // the user about an unexpected activity being launched on top.
1250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    static final long START_WARN_TIME = 5*1000;
1260dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // Set to false to disable the preview that is shown while a new activity
12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is being started.
12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean SHOW_APP_STARTING_PREVIEW = true;
13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    enum ActivityState {
13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        INITIALIZING,
13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        RESUMED,
13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSING,
13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSED,
13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPING,
13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPED,
13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        FINISHING,
13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYING,
14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYED
14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityManagerService mService;
14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean mMainStack;
14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Context mContext;
14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The back history of all previous (and possibly still
15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * running) activities.  It contains HistoryRecord objects.
15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();
153be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
154be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    /**
155be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     * Used for validating app tokens with window manager.
156be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     */
157be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>();
158be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of running activities, sorted by recent usage.
16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The first entry in the list is the least recently used.
16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * It contains HistoryRecord objects.
16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>();
16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are waiting for a new activity
16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to become visible before completing whatever operation they are
16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * supposed to do.
17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mWaitingVisibleActivities
17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be stopped, but waiting
17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the next activity to settle down before doing so.  It contains
17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mStoppingActivities
18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
1834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * List of activities that are in the process of going to sleep.
1844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
1854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    final ArrayList<ActivityRecord> mGoingToSleepActivities
1864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            = new ArrayList<ActivityRecord>();
1874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
1884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Animations that for the current transition have requested not to
19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * be considered for the transition animation.
19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mNoAnimActivities
19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be finished, but waiting
19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the previous activity to settle down before doing so.  It contains
19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mFinishingActivities
20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next launched activity.
20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched
20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next visible activity.
21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible
21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
21480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
21580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn    final ArrayList<UserStartedState> mStartingUsers
21680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            = new ArrayList<UserStartedState>();
21780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when the system is going to sleep, until we have
22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * successfully paused the current activity and released our wake lock.
22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * At that point the system is allowed to actually sleep.
22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mGoingToSleep;
22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * We don't want to allow the device to go to sleep while in the process
22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of launching an activity.  This is primarily to allow alarm intent
22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * receivers to launch an activity and get that to run before the device
22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * goes back to sleep.
23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mLaunchingActivity;
23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * When we are in the process of pausing an activity, before starting the
23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * next one, this variable holds the activity that is currently being paused.
23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
237621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    ActivityRecord mPausingActivity = null;
23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is the last activity that we put into the paused state.  This is
24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * used to determine if we need to do an activity transition while sleeping,
24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * when we normally hold the top activity paused.
24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mLastPausedActivity = null;
24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Current activity that is resumed, or null if there is none.
24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mResumedActivity = null;
25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
2520dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * This is the last activity that has been started.  It is only used to
2530dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * identify when multiple activities are started at once so that the user
2540dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * can be warned they may not be in the activity they think they are.
2550dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     */
2560dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    ActivityRecord mLastStartedActivity = null;
2570dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
2580dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    /**
25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when we know we are going to be calling updateConfiguration()
26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * soon, so want to skip intermediate config checks.
26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mConfigWillChange;
26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set to indicate whether to issue an onUserLeaving callback when a
26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * newly launched activity is being brought in front of us.
26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mUserLeaving = false;
26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    long mInitialStartTime = 0;
27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
2734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * Set when we have taken too long waiting to go to sleep.
2744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
2754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    boolean mSleepTimeout = false;
2764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
27790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    /**
27890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     * Dismiss the keyguard after the next activity is displayed?
27990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     */
28090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    boolean mDismissKeyguardOnNextActivity = false;
28190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
2820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailWidth = -1;
2830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailHeight = -1;
2840aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
285742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private int mCurrentUser;
286742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG;
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
29429ba7e66804e91cbd05fed74893061b4971ec52bDianne Hackborn    static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7;
295162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 8;
296755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 9;
297755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
298755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static class ScheduleDestroyArgs {
299755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final ProcessRecord mOwner;
300755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final boolean mOomAdj;
301755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final String mReason;
302755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        ScheduleDestroyArgs(ProcessRecord owner, boolean oomAdj, String reason) {
303755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOwner = owner;
304755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOomAdj = oomAdj;
305755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mReason = reason;
306755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        }
307755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
308755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Handler mHandler = new Handler() {
31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //public Handler() {
31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //}
31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        public void handleMessage(Message msg) {
31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            switch (msg.what) {
3164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                case SLEEP_TIMEOUT_MSG: {
3178e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    synchronized (mService) {
3188e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        if (mService.isSleeping()) {
3198e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
3208e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            mSleepTimeout = true;
3218e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            checkReadyForSleepLocked();
3228e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        }
3234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    }
3244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } break;
32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case PAUSE_TIMEOUT_MSG: {
326be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
329be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity pause timeout for " + r);
3302a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3312a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.app != null) {
3322a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.pauseTime,
3332a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "pausing " + r);
3342a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3352a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3362a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
337be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityPaused(r != null ? r.appToken : null, true);
33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_TIMEOUT_MSG: {
34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        nmsg.obj = msg.obj;
34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
349be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
350be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity idle timeout for " + r);
351be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, true, null);
35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
3532a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                case LAUNCH_TICK_MSG: {
3542a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
3552a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3562a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.continueLaunchTickingLocked()) {
3572a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.launchTickTime,
3582a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "launching " + r);
3592a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3602a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3612a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                } break;
36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case DESTROY_TIMEOUT_MSG: {
363be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
366be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity destroy timeout for " + r);
367be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityDestroyed(r != null ? r.appToken : null);
36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_NOW_MSG: {
370be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
371be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, false, null);
37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case LAUNCH_TIMEOUT_MSG: {
37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT);
37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mLaunchingActivity.isHeld()) {
38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mLaunchingActivity.release();
38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case RESUME_TOP_ACTIVITY_MSG: {
38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
392162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                case STOP_TIMEOUT_MSG: {
393162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
394162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
395162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // so we need to be conservative and assume it isn't.
396162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    Slog.w(TAG, "Activity stop timeout for " + r);
397162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    synchronized (mService) {
398162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        if (r.isInHistory()) {
399162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            activityStoppedLocked(r, null, null, null);
400162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        }
401162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
402162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } break;
403755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                case DESTROY_ACTIVITIES_MSG: {
404755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj;
405755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    synchronized (mService) {
406755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        destroyActivitiesLocked(args.mOwner, args.mOomAdj, args.mReason);
407755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    }
408755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                }
40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    };
41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService = service;
41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mContext = context;
41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mMainStack = mainStack;
41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PowerManager pm =
41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            (PowerManager)context.getSystemService(Context.POWER_SERVICE);
41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity.setReferenceCounted(false);
42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
425742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && r != notTop) {
43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
438742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && !r.delayedResume && r != notTop) {
44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is a simplified version of topRunningActivityLocked that provides a number of
45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param token If non-null, any history records matching this token will be skipped.
45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns the HistoryRecord of the next activity on the stack.
45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
460742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: the taskId check depends on real taskId fields being non-zero
465be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) {
46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int indexOfTokenLocked(IBinder token) {
474be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(ActivityRecord.forToken(token));
475be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
476be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
477be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final int indexOfActivityLocked(ActivityRecord r) {
478be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(r);
479ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
481ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final ActivityRecord isInStackLocked(IBinder token) {
482be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ActivityRecord r = ActivityRecord.forToken(token);
483be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        if (mHistory.contains(r)) {
484be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return r;
485ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
486ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        return null;
48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean updateLRUListLocked(ActivityRecord r) {
49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadit = mLRUActivities.remove(r);
49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLRUActivities.add(r);
49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return hadit;
49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the top activity in any existing task matching the given
49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Intent.  Returns null if no such task is found.
49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        TaskRecord cp = null;
50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
507f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        final int userId = UserHandle.getUserId(info.applicationInfo.uid);
50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
511742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (!r.finishing && r.task != cp && r.userId == userId
51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                cp = r.task;
51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + "/aff=" + r.task.affinity + " to new cls="
51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.task.affinity != null) {
51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.task.affinity.equals(info.taskAffinity)) {
51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        //Slog.i(TAG, "Found matching affinity!");
52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return r;
52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.intent != null
52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.intent.getComponent().equals(cls)) {
52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.affinityIntent != null
52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.affinityIntent.getComponent().equals(cls)) {
53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the first activity (starting from the top of the stack) that
54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is the same as the given activity.  Returns null if no such activity
54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is found.
54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
551f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        final int userId = UserHandle.getUserId(info.applicationInfo.uid);
55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
557742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.intent.getComponent().equals(cls) && r.userId == userId) {
55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    final void showAskCompatModeDialogLocked(ActivityRecord r) {
57036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        Message msg = Message.obtain();
57136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
57236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.obj = r.task.askedCompatMode ? null : r;
57336cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        mService.mHandler.sendMessage(msg);
57436cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    }
57536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn
576742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /*
577742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * Move the activities around in the stack to bring a user to the foreground.
578742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * @return whether there are any activities for the specified user.
579742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     */
580742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    final boolean switchUser(int userId) {
581742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        synchronized (mService) {
582742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mCurrentUser = userId;
583742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
584742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Only one activity? Nothing to do...
585742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (mHistory.size() < 2)
586742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return false;
587742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
588742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            boolean haveActivities = false;
589742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Check if the top activity is from the new user.
590742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ActivityRecord top = mHistory.get(mHistory.size() - 1);
591742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (top.userId == userId) return true;
592742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Otherwise, move the user's activities to the top.
593742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int N = mHistory.size();
594742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int i = 0;
595742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            while (i < N) {
596742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                ActivityRecord r = mHistory.get(i);
597742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.userId == userId) {
598742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    ActivityRecord moveToTop = mHistory.remove(i);
599742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mHistory.add(moveToTop);
600742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // No need to check the top one now
601742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    N--;
602742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    haveActivities = true;
603742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                } else {
604742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    i++;
605742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                }
606742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
607742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Transition from the old top to the new top
608742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            resumeTopActivityLocked(top);
609742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return haveActivities;
610742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
611742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
612742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean realStartActivityLocked(ActivityRecord r,
61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord app, boolean andResume, boolean checkConfig)
61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throws RemoteException {
61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(app, 0);
618be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.setAppVisibility(r.appToken, true);
61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6202a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        // schedule launch ticks to collect information about slow apps.
6212a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.startLaunchTickingLocked();
6222a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Have the window manager re-evaluate the orientation of
62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the screen based on the new activity order.  Note that
62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // as a result of this, it can call back into the activity
62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // manager with a new orientation.  We don't care about that,
62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because the activity is not currently running so we are
62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // just restarting it anyway.
62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (checkConfig) {
63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mConfiguration,
632be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
633813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn            mService.updateConfigurationLocked(config, r, false, false);
63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.app = app;
6370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        app.waitingToKill = null;
63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Launching: " + r);
64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int idx = app.activities.indexOf(r);
64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (idx < 0) {
64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.add(r);
64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateLruProcessLocked(app, true, true);
64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (app.thread == null) {
64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                throw new RemoteException();
65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<ResultInfo> results = null;
65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<Intent> newIntents = null;
65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                results = r.results;
65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                newIntents = r.newIntents;
65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " icicle=" + r.icicle
65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " with results=" + results + " newIntents=" + newIntents
66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " andResume=" + andResume);
66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(r),
66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.task.taskId, r.shortComponentName);
66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.isHomeActivity) {
66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mHomeProcess = app;
66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
6704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.sleeping = false;
671e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
67236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn            showAskCompatModeDialogLocked(r);
6738ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
67462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile = null;
67562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            ParcelFileDescriptor profileFd = null;
67662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean profileAutoStop = false;
67762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
67862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (mService.mProfileProc == null || mService.mProfileProc == app) {
67962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.mProfileProc = app;
68062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFile = mService.mProfileFile;
68162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = mService.mProfileFd;
68262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop = mService.mAutoStopProfiler;
68362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
68462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
685f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn            app.hasShownUi = true;
686c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            app.pendingUiClean = true;
68762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFd != null) {
68862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                try {
68962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = profileFd.dup();
69062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                } catch (IOException e) {
69162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = null;
69262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
69362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
694be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
695813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    System.identityHashCode(r), r.info,
696813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    new Configuration(mService.mConfiguration),
69758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    r.compat, r.icicle, results, newIntents, !andResume,
69862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.isNextTransitionForward(), profileFile, profileFd,
69962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop);
70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
70154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Note that the package
70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // manager will ensure that only activity can run in the main
70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // process of the .apk, which is the only thing that will be
70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // considered heavy-weight.
70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (app.processName.equals(app.info.packageName)) {
70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null
70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && mService.mHeavyWeightProcess != app) {
70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Log.w(TAG, "Starting new heavy weight process " + app
71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " when already running "
71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + mService.mHeavyWeightProcess);
71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = app;
71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Message msg = mService.mHandler.obtainMessage(
71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    msg.obj = r;
71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendMessage(msg);
71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.launchFailed) {
72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second time we failed -- finish activity
72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and give up.
72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.e(TAG, "Second failure launching "
72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + r.intent.getComponent().flattenToShortString()
72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + ", giving up", e);
72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.appDiedLocked(app, app.pid, app.thread);
729be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "2nd-crash");
73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return false;
73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This is the first time we failed -- restart process and
73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // retry.
73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.remove(r);
73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw e;
73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.launchFailed = false;
74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (updateLRUListLocked(r)) {
74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r
74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                  + " being launched, but already in LRU list");
74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // As part of the process of launching, ActivityThread also performs
74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // a resume.
74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.RESUMED;
750ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r
751ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting new instance)");
75250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = false;
75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = r;
75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.task.touchActiveTime();
75588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
75688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(r.task);
75788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
75850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            completeResumeLocked(r);
7594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
76098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
76198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.icicle = null;
76298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.haveState = false;
76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not starting in the resumed state... which
76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should look like we asked it to pause+stop (but remain visible),
76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and it has done so and reported back the current icicle and
76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // other state.
768ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
769ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting in stopped state)");
77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPED;
77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = true;
77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Launch the new version setup screen if needed.  We do this -after-
77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // launching the initial activity (that is, home), so that it can have
77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a chance to initialize itself while in the background, making the
77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // switch back to it faster and look better.
77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.startSetupActivityLocked();
78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startSpecificActivityLocked(ActivityRecord r,
78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean andResume, boolean checkConfig) {
78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Is this activity's application already running?
78850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.info.applicationInfo.uid);
79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7910dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        if (r.launchTime == 0) {
7920dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            r.launchTime = SystemClock.uptimeMillis();
79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mInitialStartTime == 0) {
7940dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mInitialStartTime = r.launchTime;
79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mInitialStartTime == 0) {
79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mInitialStartTime = SystemClock.uptimeMillis();
79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (app != null && app.thread != null) {
80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
8026c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                app.addPackage(r.info.packageName);
80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                realStartActivityLocked(r, app, andResume, checkConfig);
80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception when starting activity "
80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + r.intent.getComponent().flattenToShortString(), e);
80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If a dead object exception was thrown -- fall through to
81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // restart the application.
81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
815a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn                "activity", r.intent.getComponent(), false, false);
81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void stopIfSleepingLocked() {
8194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.isSleeping()) {
82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mGoingToSleep.isHeld()) {
82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mGoingToSleep.acquire();
82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mLaunchingActivity.isHeld()) {
82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
8274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG);
8294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT);
8304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void awakeFromSleepingLocked() {
8354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mSleepTimeout = false;
8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
8384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
8394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        // Ensure activities are no longer sleeping.
8414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
8420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.setSleeping(false);
8444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.clear();
8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void activitySleptLocked(ActivityRecord r) {
8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        checkReadyForSleepLocked();
8514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void checkReadyForSleepLocked() {
8544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mService.isSleeping()) {
8554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Do not care.
8564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            return;
8574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mSleepTimeout) {
8604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mResumedActivity != null) {
8614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still have something resumed; can't sleep until it is paused.
8624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity);
86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, true);
8654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
867621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity != null) {
8684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still waiting for something to pause; can't sleep yet.
869621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity);
8704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mStoppingActivities.size() > 0) {
8744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to stop; can't sleep yet.
8754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
8764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mStoppingActivities.size() + " activities");
87780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                scheduleIdleLocked();
8784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            ensureActivitiesVisibleLocked(null, 0);
8824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Make sure any stopped but visible activities are now sleeping.
8844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // This ensures that the activity's onStop() is called.
8854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            for (int i=mHistory.size()-1; i>=0; i--) {
8860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord r = mHistory.get(i);
8874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
8884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
8894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
8904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mGoingToSleepActivities.size() > 0) {
8934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to sleep; can't sleep yet.
8944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
8954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mGoingToSleepActivities.size() + " activities");
8964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
8994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
9004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
9014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
9024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
9034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
9044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
9054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.mShuttingDown) {
9064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mService.notifyAll();
9074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
90959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
910d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public final Bitmap screenshotActivities(ActivityRecord who) {
911ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        if (who.noDisplay) {
912ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn            return null;
913ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        }
914ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn
9150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Resources res = mService.mContext.getResources();
9160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int w = mThumbnailWidth;
9170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int h = mThumbnailHeight;
9180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w < 0) {
9190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailWidth = w =
9200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
9210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailHeight = h =
9220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
9230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
9250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w > 0) {
92659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            return mService.mWindowManager.screenshotApplications(who.appToken,
92759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                    Display.DEFAULT_DISPLAY, w, h);
9280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return null;
9300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
9310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
933621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
934621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            RuntimeException e = new RuntimeException();
935621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            Slog.e(TAG, "Trying to pause when pause is already pending for "
936621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                  + mPausingActivity, e);
937621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord prev = mResumedActivity;
93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev == null) {
94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            RuntimeException e = new RuntimeException();
94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
945ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);
946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mResumedActivity = null;
948621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        mPausingActivity = prev;
94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLastPausedActivity = prev;
95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.state = ActivityState.PAUSING;
95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.task.touchActiveTime();
952f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        prev.updateThumbnail(screenshotActivities(prev), null);
95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateCpuStats();
95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.app.thread != null) {
95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(prev),
96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        prev.shortComponentName);
962be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
963be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        userLeaving, prev.configChangeFlags);
96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.updateUsageStats(prev, false);
96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Ignore exception, if process died other code will cleanup.
96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
970621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                mPausingActivity = null;
97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mLastPausedActivity = null;
97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
974621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLastPausedActivity = null;
97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not going to sleep, we want to ensure the device is
97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // awake until the next activity is started.
98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mService.mSleeping && !mService.mShuttingDown) {
98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLaunchingActivity.acquire();
98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // To be safe, don't allow the wake lock to be held for too long.
98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT);
98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
989621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
990621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager pause its key dispatching until the new
99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity has started.  If we're pausing the activity just because
99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen is being turned off and the UI is sleeping, don't interrupt
99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // key dispatch; the same activity will pick it up again on wakeup.
99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!uiSleeping) {
996621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev.pauseKeyDispatchingLocked();
99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Schedule a pause timeout in case the app doesn't respond.
100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We don't give it much time because this directly impacts the
100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // responsiveness seen by the user.
100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = prev;
10062a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            prev.pauseTime = SystemClock.uptimeMillis();
100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity failed to schedule the
101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // pause, so just treat it as being paused now.
101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
1013621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(null);
101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
10170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    final void activityPaused(IBinder token, boolean timeout) {
101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(
10190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = null;
102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(token);
102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
10260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                r = mHistory.get(index);
102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
1028621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (mPausingActivity == r) {
1029ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
1030ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                            + (timeout ? " (due to timeout)" : " (pause complete)"));
103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.state = ActivityState.PAUSED;
1032621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    completePauseLocked();
103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            System.identityHashCode(r), r.shortComponentName,
1036621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            mPausingActivity != null
1037621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                                ? mPausingActivity.shortComponentName : "(none)");
103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1043ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail,
1044ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            CharSequence description) {
1045b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        if (r.state != ActivityState.STOPPING) {
1046b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            Slog.i(TAG, "Activity reported stop, but no longer stopping: " + r);
1047b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1048b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            return;
1049b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        }
105098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle);
1051162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (icicle != null) {
1052162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // If icicle is null, this is happening due to a timeout, so we
1053162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // haven't really saved the state.
1054162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.icicle = icicle;
1055162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.haveState = true;
1056162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.updateThumbnail(thumbnail, description);
1057162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        }
1058162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (!r.stopped) {
1059162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
1060162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1061162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.stopped = true;
1062162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.state = ActivityState.STOPPED;
10636e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            if (r.finishing) {
10646e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn                r.clearOptionsLocked();
10656e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            } else {
1066162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                if (r.configDestroy) {
1067162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    destroyActivityLocked(r, true, false, "stop-config");
1068162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    resumeTopActivityLocked(null);
1069162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } else {
1070162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // Now that this process has stopped, we may want to consider
1071162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // it to be the previous app to try to keep around in case
1072162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // the user wants to return to it.
1073162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ProcessRecord fgApp = null;
1074162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (mResumedActivity != null) {
1075162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mResumedActivity.app;
1076162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    } else if (mPausingActivity != null) {
1077162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mPausingActivity.app;
1078162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
1079162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (r.app != null && fgApp != null && r.app != fgApp
1080162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
1081162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.app != mService.mHomeProcess) {
1082162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcess = r.app;
1083162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
1084162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
108550685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
1086ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1087ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
1088ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
1089ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
1090621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    private final void completePauseLocked() {
1091621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        ActivityRecord prev = mPausingActivity;
109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1094621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1095621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (prev.finishing) {
1096621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
1097621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
1098621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else if (prev.app != null) {
1099621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
1100621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.waitingVisible) {
1101621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    prev.waitingVisible = false;
1102621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mWaitingVisibleActivities.remove(prev);
1103621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
1104621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            TAG, "Complete pause, no longer waiting: " + prev);
1105621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                }
1106621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.configDestroy) {
1107621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // The previous is being paused because the configuration
1108621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // is changing, which means it is actually stopping...
1109621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // To juggle the fact that we are also starting a new
1110621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // instance right now, we need to first completely stop
1111621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // the current instance before starting the new one.
1112621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
1113621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    destroyActivityLocked(prev, true, false, "pause-config");
111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
1115621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mStoppingActivities.add(prev);
1116621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (mStoppingActivities.size() > 3) {
1117621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // If we already have a few activities waiting to stop,
1118621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // then give up on things going idle and start clearing
1119621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // them out.
1120621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
1121621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        scheduleIdleLocked();
1122621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    } else {
1123621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        checkReadyForSleepLocked();
1124621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    }
112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1126621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else {
1127621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
1128621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = null;
112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
1130621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1133621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (!mService.isSleeping()) {
1134621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(prev);
1135621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        } else {
11364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
113742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            if (topRunningActivityLocked(null) == null) {
113842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                // If there are no more activities available to run, then
113942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                // do resume anyway to start something.
114042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
114142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1143621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
1144621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1145621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            prev.resumeKeyDispatchingLocked();
1146621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.cpuTimeAtResume > 0
114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mService.mBatteryStatsService.isOnBattery()) {
115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long diff = 0;
115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid)
115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        - prev.cpuTimeAtResume;
115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (diff > 0) {
115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (bsi) {
115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    BatteryStatsImpl.Uid.Proc ps =
115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            prev.info.packageName);
116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (ps != null) {
116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ps.addForegroundTimeLocked(diff);
116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.cpuTimeAtResume = 0; // reset it
116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Once we know that we have asked an application to put an activity in
117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the resumed state (either by launching it or explicitly telling it),
117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * this function updates the rest of our state to match that fact.
117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void completeResumeLocked(ActivityRecord next) {
117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.idle = false;
117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.results = null;
117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.newIntents = null;
117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // schedule an idle timeout in case the app doesn't do it for us.
118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        msg.obj = next;
118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (false) {
118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity was never told to pause, so just keep
118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // things going as-is.  To maintain our own state,
118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we need to emulate it coming back and saying it is
118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // idle.
119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg = mHandler.obtainMessage(IDLE_NOW_MSG);
119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = next;
119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessage(msg);
119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.reportResumedActivityLocked(next);
119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1199f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        next.clearThumbnail();
120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.setFocusedActivityLocked(next);
120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1203621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        next.resumeKeyDispatchingLocked();
120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ensureActivitiesVisibleLocked(null, 0);
120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.executeAppTransition();
120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mNoAnimActivities.clear();
120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Mark the point when the activity is resuming
120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // TODO: To be more accurate, the mark should be before the onCreate,
121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //       not after the onResume. But for subsequent starts, onResume is fine.
121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null) {
121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process
121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure that all activities that need to be visible (that is, they
122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * currently can be seen by the user) actually are.
122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord top,
122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord starting, String onlyThisProcess, int configChanges) {
122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_VISBILITY) Slog.v(
122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "ensureActivitiesVisible behind " + top
122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " configChanges=0x" + Integer.toHexString(configChanges));
122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is not fullscreen, then we need to
123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure any activities under it are now visible.
123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int count = mHistory.size();
123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = count-1;
123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (mHistory.get(i) != top) {
123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r;
123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean behindFullscreen = false;
123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (; i>=0; i--) {
12400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make visible? " + r + " finishing=" + r.finishing
124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state);
124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean doThisProcess = onlyThisProcess == null
124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || onlyThisProcess.equals(r.processName);
125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // First: if this is not the current activity being started, make
125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // sure it matches the current configuration.
125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != starting && doThisProcess) {
125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivityConfigurationLocked(r, 0);
125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == null || r.app.thread == null) {
125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (onlyThisProcess == null
125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        || onlyThisProcess.equals(r.processName)) {
126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // This activity needs to be visible, but isn't even
126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // running...  get it started, but don't resume it
126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // at this point.
126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Start and freeze screen for " + r);
126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.startFreezingScreenLocked(r.app, configChanges);
126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!r.visible) {
126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Starting and making visible: " + r);
1271be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        startSpecificActivityLocked(r, false, false);
127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (r.visible) {
127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is already visible, then there is nothing
128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // else to do here.
128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Skipping: already visible at " + r);
128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopFreezingScreenLocked(false);
128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (onlyThisProcess == null) {
128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This activity is not currently visible, but is running.
128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Tell it to become visible.
128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.visible = true;
128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state != ActivityState.RESUMED && r != starting) {
129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is paused, tell it
129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to now show its window.
129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Making visible and scheduling visibility: " + r);
129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    try {
1295be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
12964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        r.sleeping = false;
1297905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                        r.app.pendingUiClean = true;
1298be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.app.thread.scheduleWindowVisibility(r.appToken, true);
129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.stopFreezingScreenLocked(false);
130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } catch (Exception e) {
130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Just skip on any failure; we'll make it
130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // visible when it next restarts.
130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Slog.w(TAG, "Exception thrown making visibile: "
130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + r.intent.getComponent(), e);
130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Aggregate current change flags.
131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            configChanges |= r.configChangeFlags;
131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.fullscreen) {
131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // At this point, nothing else needs to be shown
131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping: fullscreen at " + r);
131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                behindFullscreen = true;
131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now for any activities that aren't visible to the user, make
132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // sure they no longer are keeping the screen frozen.
132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
13250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state
132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " behindFullscreen=" + behindFullscreen);
133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (behindFullscreen) {
133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.visible) {
133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Making invisible: " + r);
133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.visible = false;
133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
1337be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppVisibility(r.appToken, false);
133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if ((r.state == ActivityState.STOPPING
133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    || r.state == ActivityState.STOPPED)
134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    && r.app != null && r.app.thread != null) {
134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (DEBUG_VISBILITY) Slog.v(
134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        TAG, "Scheduling invisibility: " + r);
1343be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                r.app.thread.scheduleWindowVisibility(r.appToken, false);
134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (Exception e) {
134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Just skip on any failure; we'll make it
134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // visible when it next restarts.
134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Exception thrown making hidden: "
134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + r.intent.getComponent(), e);
135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Already invisible: " + r);
135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.fullscreen) {
135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Now behindFullscreen: " + r);
135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    behindFullscreen = true;
135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Version of ensureActivitiesVisible that can easily be called anywhere.
136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord starting,
136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int configChanges) {
137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = topRunningActivityLocked(null);
137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r != null) {
137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ensureActivitiesVisibleLocked(r, starting, null, configChanges);
137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Ensure that the top activity in the stack is resumed.
137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param prev The previously resumed activity, for when in the process
138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of pausing; can be null to call from elsewhere.
138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if something is being resumed, or false if
138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * nothing happened.
138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev) {
138684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        return resumeTopActivityLocked(prev, null);
138784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    }
138884375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
138984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Find the first activity that is not finishing.
139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord next = topRunningActivityLocked(null);
139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remember how we'll process this pause/resume situation, and ensure
139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the state is reset however we wind up proceeding.
139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean userLeaving = mUserLeaving;
139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = false;
139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next == null) {
139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are no more activities!  Let's just start up the
140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Launcher...
140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
140284375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                ActivityOptions.abort(options);
140380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                return mService.startHomeActivityLocked(0, null);
140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.delayedResume = false;
140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is the resumed one, nothing to do.
141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == next && next.state == ActivityState.RESUMED) {
141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
141584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are sleeping, and there is no resumed activity, and the top
142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity is paused, well that is the state we want.
142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((mService.mSleeping || mService.mShuttingDown)
1422dbad287b62966399d0d5029f3b10932895010337p                && mLastPausedActivity == next
1423dbad287b62966399d0d5029f3b10932895010337p                && (next.state == ActivityState.PAUSED
1424dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPED
1425dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPING)) {
142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
143084375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
143380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
143480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // Make sure that the user who owns this activity is started.  If not,
143580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // we will just leave it as is because someone should be bringing
143680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // another user's activities to the top of the stack.
143780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        if (mService.mStartedUsers.get(next.userId) == null) {
143880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            Slog.w(TAG, "Skipping resume of top activity " + next
143980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                    + ": user " + next.userId + " is stopped");
144080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            return false;
144180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        }
144280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // The activity may be waiting for stop, but that is no longer
144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // appropriate for it.
144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(next);
14464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(next);
14474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        next.sleeping = false;
144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(next);
144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
145084375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        next.updateOptionsLocked(options);
145184375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1454621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // If we are currently pausing an activity, then don't do anything
1455621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // until that is done.
1456621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
1457621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity);
1458621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            return false;
1459621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
1460621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
14610dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // Okay we are now going to start a switch, to 'next'.  We may first
14620dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // have to pause the current activity, but this is an important point
14630dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // where we have decided to go to 'next' so keep track of that.
1464034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // XXX "App Redirected" dialog is getting too many false positives
1465034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // at this point, so turn off for now.
1466034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        if (false) {
1467034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn            if (mLastStartedActivity != null && !mLastStartedActivity.finishing) {
1468034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                long now = SystemClock.uptimeMillis();
1469034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final boolean inTime = mLastStartedActivity.startTime != 0
1470034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && (mLastStartedActivity.startTime + START_WARN_TIME) >= now;
1471034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int lastUid = mLastStartedActivity.info.applicationInfo.uid;
1472034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int nextUid = next.info.applicationInfo.uid;
1473034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                if (inTime && lastUid != nextUid
1474034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && lastUid != next.launchedFromUid
1475034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && mService.checkPermission(
1476034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                android.Manifest.permission.STOP_APP_SWITCHES,
1477034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                -1, next.launchedFromUid)
1478034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
1479034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mService.showLaunchWarningLocked(mLastStartedActivity, next);
1480034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                } else {
1481034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    next.startTime = now;
1482034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mLastStartedActivity = next;
1483034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                }
14840dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            } else {
1485034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                next.startTime = SystemClock.uptimeMillis();
14860dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mLastStartedActivity = next;
14870dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            }
14880dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        }
14890dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We need to start pausing the current activity so the top one
149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can be resumed...
149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity != null) {
149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startPausingLocked(userLeaving, false);
149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
149750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1498d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // If the most recent activity was noHistory but was only stopped rather
1499d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // than stopped+finished because the device went to sleep, we need to make
1500d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // sure to finish it as we're making a new activity topmost.
1501d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        final ActivityRecord last = mLastPausedActivity;
1502d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (mService.mSleeping && last != null && !last.finishing) {
1503d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            if ((last.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
1504d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    || (last.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
1505d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (DEBUG_STATES) {
1506d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    Slog.d(TAG, "no-history finish of " + last + " on new resume");
1507d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
1508d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null,
150980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                        "no-history");
1510d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            }
1511d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        }
1512d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate
151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null && prev != next) {
151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!prev.waitingVisible && next != null && !next.nowVisible) {
151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                prev.waitingVisible = true;
151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.add(prev);
151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(
151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Resuming top, waiting visible to hide: " + prev);
151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The next activity is already visible, so hide the previous
152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity's windows right now so we can show the new one ASAP.
152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We only do this if the previous is finishing, which should mean
152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it is on top of the one being resumed so hiding it quickly
152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is good.  Otherwise, we want to do the normal route of allowing
152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the resumed activity to be shown so we can decide if the
152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // previous should actually be hidden depending on whether the
152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // new one is found to be full-screen or not.
152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev.finishing) {
1529be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(prev.appToken, false);
153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + prev + ", waitingVisible="
153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + (prev != null ? prev.waitingVisible : null)
153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + ", nowVisible=" + next.nowVisible);
153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + prev + ", waitingVisible="
153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + (prev != null ? prev.waitingVisible : null)
153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", nowVisible=" + next.nowVisible);
153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1543e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Launching this app's activity, make sure the app is no longer
1544e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // considered stopped.
1545e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        try {
1546e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            AppGlobals.getPackageManager().setPackageStoppedState(
1547483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    next.packageName, false, next.userId); /* TODO: Verify if correct userid */
1548e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } catch (RemoteException e1) {
1549a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn        } catch (IllegalArgumentException e) {
1550a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn            Slog.w(TAG, "Failed trying to unstop package "
1551a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn                    + next.packageName + ": " + e);
1552e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
1553e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are starting up the next activity, so tell the window manager
155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the previous one will be hidden soon.  This way it can know
155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to ignore it when computing the desired screen orientation.
15577a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        boolean noAnim = false;
155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null) {
155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (prev.finishing) {
156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare close transition: prev=" + prev);
156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(prev)) {
15637da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
15647da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
15687da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1570be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1571be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare open transition: prev=" + prev);
157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(next)) {
15767a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    noAnim = true;
15777da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
15787da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
15827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (false) {
1586be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1587be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mHistory.size() > 1) {
159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: no previous");
159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mNoAnimActivities.contains(next)) {
15937a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                noAnim = true;
15947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
15957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, false);
159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
15977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
15987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
16017a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        if (!noAnim) {
16027a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.applyOptionsLocked();
16037a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        } else {
16047a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.clearOptionsLocked();
16057a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        }
160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null && next.app.thread != null) {
160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is now becoming visible.
1611be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(next.appToken, true);
161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16132a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            // schedule launch ticks to collect information about slow apps.
16142a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            next.startLaunchTickingLocked();
16152a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord lastResumedActivity = mResumedActivity;
161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityState lastState = next.state;
161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateCpuStats();
162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1621ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.state = ActivityState.RESUMED;
162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = next;
162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.task.touchActiveTime();
162588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
162688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(next.task);
162788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateLruProcessLocked(next.app, true, true);
162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            updateLRUListLocked(next);
163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager re-evaluate the orientation of
163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen based on the new activity order.
163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean updated = false;
163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (mService) {
163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mConfiguration,
1638be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null);
163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (config != null) {
164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.frozenBeforeDestroy = true;
164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
1642813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    updated = mService.updateConfigurationLocked(config, next, false, false);
164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!updated) {
164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The configuration update wasn't able to keep the existing
164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity, and instead started a new one.
164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We should be all done, but let's just make sure our activity
164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is still at the top and schedule another run if something
165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // weird happened.
165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord nextNext = topRunningActivityLocked(null);
165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG,
165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Activity config changed during resume: " + next
165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", new next: " + nextNext);
165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (nextNext != next) {
165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Do over!
165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(next);
166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.executeAppTransition();
166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.clear();
166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Deliver all pending results.
167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList a = next.results;
167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (a != null) {
167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final int N = a.size();
167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!next.finishing && N > 0) {
167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_RESULTS) Slog.v(
167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Delivering results to " + next
167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + ": " + a);
1677be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        next.app.thread.scheduleSendResult(next.appToken, a);
167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (next.newIntents != null) {
1682be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(next),
168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.task.taskId, next.shortComponentName);
168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                next.sleeping = false;
169036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn                showAskCompatModeDialogLocked(next);
1691905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                next.app.pendingUiClean = true;
1692be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                next.app.thread.scheduleResumeActivity(next.appToken,
169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.isNextTransitionForward());
169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                checkReadyForSleepLocked();
169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Whoops, need to restart this activity!
1699ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to "
1700ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + lastState + ": " + next);
170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.state = lastState;
170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mResumedActivity = lastResumedActivity;
170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.i(TAG, "Restarting because process died: " + next);
170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!next.hasBeenLaunched) {
170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.hasBeenLaunched = true;
170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (SHOW_APP_STARTING_PREVIEW && mMainStack) {
170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mWindowManager.setAppStartingWindow(
1709be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                next.appToken, next.packageName, next.theme,
17102f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                mService.compatibilityInfoForPackageLocked(
17112f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                        next.info.applicationInfo),
171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                next.nonLocalizedLabel,
17137eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                next.labelRes, next.icon, next.windowFlags,
17147eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                null, true);
171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startSpecificActivityLocked(next, true, false);
171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // From this point on, if something goes wrong there is no way
172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to recover the activity.
172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.visible = true;
172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                completeResumeLocked(next);
172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If any exception gets thrown, toss away this
172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity and try the next one.
172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during resume of " + next, e);
1730be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "resume-exception");
173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Didn't need to use the icicle, and it is now out of date.
173698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next);
173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.icicle = null;
173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.haveState = false;
173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.stopped = false;
174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Whoops, need to restart this activity!
174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!next.hasBeenLaunched) {
174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.hasBeenLaunched = true;
174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (SHOW_APP_STARTING_PREVIEW) {
174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.setAppStartingWindow(
1748be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.appToken, next.packageName, next.theme,
17492f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            mService.compatibilityInfoForPackageLocked(
17502f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                    next.info.applicationInfo),
175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            next.nonLocalizedLabel,
17527eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            next.labelRes, next.icon, next.windowFlags,
17537eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            null, true);
175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startSpecificActivityLocked(next, true, true);
175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startActivityLocked(ActivityRecord r, boolean newTask,
17647a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            boolean doResume, boolean keepCurTransition, Bundle options) {
176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int NH = mHistory.size();
176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int addPos = -1;
176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!newTask) {
177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If starting in an existing task, find where that is...
177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean startIt = true;
177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (int i = NH-1; i >= 0; i--) {
17730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord p = mHistory.get(i);
177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.finishing) {
177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    continue;
177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.task == r.task) {
177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Here it is!  Now, if this is not yet visible to the
177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // user, then just add it without starting; it will
178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // get started when the user navigates back to it.
178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    addPos = i+1;
178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!startIt) {
178398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
178498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
178598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
178698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos,
178798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    here);
178898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(addPos, r);
1790f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        r.putInHistory();
1791be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                r.info.screenOrientation, r.fullscreen);
179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
1794be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
17968078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        ActivityOptions.abort(options);
179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    break;
180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.fullscreen) {
180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    startIt = false;
180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Place a new activity at top of stack, so it is next to interact
180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // with the user.
180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < 0) {
18100dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            addPos = NH;
181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not placing the new activity frontmost, we do not want
181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to deliver the onUserLeaving callback to the actual frontmost
181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity
181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < NH) {
181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mUserLeaving = false;
181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Slot the activity into the history stack and proceed
182298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
182398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
182498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
182598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here);
182698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(addPos, r);
1828f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        r.putInHistory();
182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frontOfTask = newTask;
183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (NH > 0) {
183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We want to show the starting preview window if we are
183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // switching to a new task, or the next activity's process is
183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // not currently running.
183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean showStartingIcon = newTask;
183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord proc = r.app;
183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null) {
183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null || proc.thread == null) {
184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                showStartingIcon = true;
184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: starting " + r);
184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
18457da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
18467da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(newTask
185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? WindowManagerPolicy.TRANSIT_TASK_OPEN
18517da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
18547a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            r.updateOptionsLocked(options);
185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.addAppToken(
1856be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen);
185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean doShow = true;
185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (newTask) {
185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Even though this activity is starting fresh, we still need
186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to reset it to make sure we apply affinities to move any
186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // existing activities from other tasks in to it.
186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller has requested that the target task be
186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // reset, then do so.
186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()
186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resetTaskIfNeededLocked(r, r);
186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    doShow = topRunningNonDelayedActivityLocked(null) == r;
186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (SHOW_APP_STARTING_PREVIEW && doShow) {
187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Figure out if we are transitioning from another activity that is
187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // "has the same starting icon" as the next one.  This allows the
187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // window manager to keep the previous window it had previously
187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // created, if it still had one.
187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord prev = mResumedActivity;
187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev != null) {
187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't want to reuse the previous starting preview if:
187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (1) The current activity is in a different task.
187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (prev.task != r.task) prev = null;
188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (2) The current activity is already displayed.
188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    else if (prev.nowVisible) prev = null;
188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.setAppStartingWindow(
1884be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.appToken, r.packageName, r.theme,
18852f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                        mService.compatibilityInfoForPackageLocked(
18862f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                r.info.applicationInfo), r.nonLocalizedLabel,
1887be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.labelRes, r.icon, r.windowFlags,
1888be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        prev != null ? prev.appToken : null, showStartingIcon);
188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this is the first activity, don't do any fancy animations,
189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // because there is nothing for it to animate on top of.
1893be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.info.screenOrientation, r.fullscreen);
18958078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
1898be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (doResume) {
190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1906be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final void validateAppTokensLocked() {
1907be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.clear();
1908be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.ensureCapacity(mHistory.size());
1909be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        for (int i=0; i<mHistory.size(); i++) {
1910be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mValidateAppTokens.add(mHistory.get(i).appToken);
1911be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        }
1912be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.validateAppTokens(mValidateAppTokens);
1913be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
1914be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform a reset of the given task, if needed as part of launching it.
191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the new HistoryRecord at the top of the task.
191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord newActivity) {
192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean forceReset = (newActivity.info.flags
192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0;
1923621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (ACTIVITY_INACTIVE_RESET_TIME > 0
1924621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) {
192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((newActivity.info.flags
192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) {
192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                forceReset = true;
192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final TaskRecord task = taskTop.task;
193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are going to move through the history list so that we can look
193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // at each activity 'target' with 'below' either the interesting
193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity immediately below it in the stack or null.
193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord target = null;
193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int targetI = 0;
193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int taskTopI = -1;
193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int replyChainEnd = -1;
194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int lastReparentPos = -1;
194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mHistory.size()-1; i>=-1; i--) {
19420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (below != null && below.finishing) {
194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
194704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            // Don't check any lower in the stack if we're crossing a user boundary.
194804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            if (below != null && below.userId != taskTop.userId) {
194904e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                break;
195004e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            }
195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target == null) {
195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                target = below;
195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                targetI = i;
195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If we were in the middle of a reply chain before this
195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, it doesn't appear like the root of the chain wants
195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // anything interesting, so drop it.
195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                replyChainEnd = -1;
195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int flags = target.info.flags;
196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean finishOnTaskLaunch =
196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean allowTaskReparenting =
196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0;
196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target.task == task) {
196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of the task being reset...  we'll either
197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // finish this activity, push it out for another task,
197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // or leave it as-is.  We only do this
197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for activities that are not the root of the task (since
197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // if we finish the root, we may no longer have the task!).
197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTopI < 0) {
197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    taskTopI = targetI;
197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (below != null && below.task == task) {
197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final boolean clearWhenTaskReset =
197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (target.intent.getFlags()
198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0;
198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) {
198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity is sending a reply to a previous
198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, we can't do anything with it now until
198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // we reach the start of the reply chain.
198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // XXX note that we are assuming the result is always
198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to the previous activity, which is almost always
198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the case but we really shouldn't count on.
198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting
199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && target.taskAffinity != null
199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && !target.taskAffinity.equals(task.affinity)) {
199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity has an affinity for another
199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // task, then we need to move it out of here.  We will
199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // move it as far out of the way as possible, to the
199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // bottom of the activity stack.  This also keeps it
199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // correctly ordered with any activities we previously
199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // moved.
20000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(0);
200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (target.taskAffinity != null
200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && target.taskAffinity.equals(p.task.affinity)) {
200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // If the activity currently at the bottom has the
200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // same task affinity as the one we are moving,
200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // then merge it into the same task.
2006f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(p.task, p.thumbHolder, false);
200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to bottom task " + p.task);
200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mCurTask++;
201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (mService.mCurTask <= 0) {
201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                mService.mCurTask = 1;
201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
2014f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(new TaskRecord(mService.mCurTask, target.info, null),
2015f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                                    null, false);
201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            target.task.affinityIntent = target.intent;
201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to new task " + target.task);
201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2020be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(target.appToken, task.taskId);
202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int dstPos = 0;
2025f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        ThumbnailHolder curThumbHolder = target.thumbHolder;
202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to target's task " + target.task);
2033f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            p.setTask(target.task, curThumbHolder, false);
2034f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            curThumbHolder = p.thumbHolder;
203598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            if (DEBUG_ADD_REMOVE) {
203698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                RuntimeException here = new RuntimeException("here");
203798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                here.fillInStackTrace();
203898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
203998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                        + dstPos, here);
204098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            }
204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.remove(srcPos);
204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.add(dstPos, p);
2043be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.moveAppToken(dstPos, p.appToken);
2044be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            dstPos++;
204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (VALIDATE_TOKENS) {
2047be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                validateAppTokensLocked();
204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            i++;
205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (forceReset || finishOnTaskLaunch
205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || clearWhenTaskReset) {
206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the activity should just be removed -- either
206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // because it asks for it, or the task should be
206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cleared -- then finish it and anything that is
206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // part of its reply chain.
206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (clearWhenTaskReset) {
206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case, we want to finish this activity
206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // and everything above it, so be sneaky and pretend
206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // like these are all in the reply chain.
206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI+1;
206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            while (replyChainEnd < mHistory.size() &&
20700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                                    (mHistory.get(
207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                                replyChainEnd)).task == task) {
207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd++;
207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (replyChainEnd < 0) {
207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord p = null;
207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (finishActivityLocked(p, srcPos,
208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    Activity.RESULT_CANCELED, null, "reset")) {
208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd--;
208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                srcPos--;
208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If we were in the middle of a chain, well the
209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity that started it all doesn't want anything
210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // special, so leave it all as-is.
210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Reached the bottom of the task -- any reply chain
210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // should be left as-is.
210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2108ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2109ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (target.resultTo != null && (below == null
2110ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    || below.task == target.task)) {
211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is sending a reply to a previous
211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity, we can't do anything with it now until
211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we reach the start of the reply chain.
211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // XXX note that we are assuming the result is always
211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to the previous activity, which is almost always
211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the case but we really shouldn't count on.
211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (replyChainEnd < 0) {
211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = targetI;
211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (taskTopI >= 0 && allowTaskReparenting
212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity != null
212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity.equals(target.taskAffinity)) {
212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of another task...  if this activity has
212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // an affinity for our task, then either remove it if we are
212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // clearing or move it over to our task.  Note that
212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we currently punt on the case where we are resetting a
212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task that is not at the top but who has activities above
212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // with an affinity to it...  this is really not a normal
213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // case, and we will need to later pull that task to the front
213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and usually at that point we will do the reset and pick
213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up those remaining activities.  (This only happens if
213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // someone starts an activity in a new task from an activity
213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in a task that is not currently on top.)
213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (forceReset || finishOnTaskLaunch) {
213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord p = null;
2140ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index "
2141ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
21430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        p = mHistory.get(srcPos);
214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (finishActivityLocked(p, srcPos,
214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Activity.RESULT_CANCELED, null, "reset")) {
214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI--;
215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            srcPos--;
215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2160ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index "
2161ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) {
21630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(srcPos);
216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (lastReparentPos < 0) {
216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos = taskTopI;
216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = p;
217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
217398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
217498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
217598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
217698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
217798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    + lastReparentPos, here);
217898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.remove(srcPos);
2180f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        p.setTask(task, null, false);
218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(lastReparentPos, p);
218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
2183ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                                + " from " + srcPos + " to " + lastReparentPos
218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " in to resetting task " + task);
2185be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken);
2186be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
2188be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Now we've moved it in to place...  but what if this is
219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // a singleTop activity and we have put it on top of another
219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // instance of the same activity?  Then we drop the instance
219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // below so it remains singleTop.
219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int j=lastReparentPos-1; j>=0; j--) {
21990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            ActivityRecord p = mHistory.get(j);
220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (finishActivityLocked(p, j,
220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        Activity.RESULT_CANCELED, null, "replace")) {
220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    taskTopI--;
220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    lastReparentPos--;
220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                }
220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2213ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2214ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (below != null && below.task != target.task) {
2215ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // We hit the botton of a task; the reply chain can't
2216ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // pass through it.
2217ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                replyChainEnd = -1;
221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            target = below;
222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            targetI = i;
222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return taskTop;
222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clear operation as requested by
222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the
223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * stack to the given task, then look for
223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * an instance of that activity in the stack and, if found, finish all
223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities on top of it and return the instance.
223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param newR Description of the new activity being started.
2235621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @return Returns the old activity that should be continued to be used,
223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * or null if none was found.
223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord performClearTaskLocked(int taskId,
2239621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            ActivityRecord newR, int launchFlags) {
224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First find the requested task.
224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == taskId) {
224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i++;
224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now clear it.
225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
225650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId != taskId) {
226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return null;
226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.realActivity.equals(newR.realActivity)) {
226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Here it is!  Now finish everything in front...
226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord ret = r;
2265621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                while (i < (mHistory.size()-1)) {
2266621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    i++;
22670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    r = mHistory.get(i);
2268621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.task.taskId != taskId) {
2269621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
2270621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2271621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.finishing) {
2272621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
2273621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2274621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
2275621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            null, "clear")) {
2276621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        i--;
227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Finally, if this is a normal launch mode (that is, not
228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // expecting onNewIntent()), then we will finish the current
228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity so a new fresh one can be started.
228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!ret.finishing) {
2286be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        int index = indexOfTokenLocked(ret.appToken);
228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (index >= 0) {
228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    null, "clear");
229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return null;
229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return ret;
229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * Completely remove all activities associated with an existing
23040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * task starting at a specified index.
23050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     */
23060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private final void performClearTaskAtIndexLocked(int taskId, int i) {
2307eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn        while (i < mHistory.size()) {
23080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
23090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.task.taskId != taskId) {
23100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                // Whoops hit the end.
23110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return;
23120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.finishing) {
23140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
23160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
23180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    null, "clear")) {
23190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
23220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
23230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
23240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    /**
2325621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Completely remove all activities associated with an existing task.
2326621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
2327621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    private final void performClearTaskLocked(int taskId) {
2328621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int i = mHistory.size();
2329621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2330621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // First find the requested task.
2331621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2332621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
23330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2334621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId == taskId) {
2335621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                i++;
2336621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                break;
2337621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2338621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2339621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
23400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Now find the start and clear it.
2341621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2342621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
23430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2344621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.finishing) {
2345621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                continue;
2346621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2347621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId != taskId) {
2348621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // We hit the bottom.  Now finish it all...
23490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                performClearTaskAtIndexLocked(taskId, i+1);
2350621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                return;
2351621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2352621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2353621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2354621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2355621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Find the activity in the history stack within the given task.  Returns
235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the index within the history at which it's found, or < 0 if not found.
235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final int findActivityInHistoryLocked(ActivityRecord r, int task) {
236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
23630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord candidate = mHistory.get(i);
236445a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            if (candidate.finishing) {
236545a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                continue;
236645a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            }
236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.task.taskId != task) {
236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.realActivity.equals(r.realActivity)) {
237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return i;
237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return -1;
237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Reorder the history stack so that the activity at the given index is
238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * brought to the front.
238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord moveActivityToFrontLocked(int where) {
23830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord newTop = mHistory.remove(where);
238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size();
23850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord oldTop = mHistory.get(top-1);
238698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
238798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
238898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
238998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at "
239098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    + top, here);
239198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(top, newTop);
239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        oldTop.frontOfTask = false;
239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        newTop.frontOfTask = true;
239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return newTop;
239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityLocked(IApplicationThread caller,
2399a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode,
2401a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int callingPid, int callingUid, int startFlags, Bundle options,
2402621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity) {
2403efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2404a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        int err = ActivityManager.START_SUCCESS;
2405efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2406efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        ProcessRecord callerApp = null;
2407efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (caller != null) {
2408efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            callerApp = mService.getRecordForAppLocked(caller);
2409efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            if (callerApp != null) {
2410efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingPid = callerApp.pid;
2411efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingUid = callerApp.info.uid;
2412efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            } else {
2413efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                Slog.w(TAG, "Unable to find app for caller " + caller
2414efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + " (pid=" + callingPid + ") when starting: "
2415efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + intent.toString());
2416a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                err = ActivityManager.START_PERMISSION_DENIED;
2417efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            }
2418efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
2419efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2420a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS) {
2421f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
242221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            Slog.i(TAG, "START {" + intent.toShortString(true, true, true, false)
2423a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani                    + " u=" + userId + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
2424efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord sourceRecord = null;
242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultRecord = null;
242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(resultTo);
243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(
243198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Will send result to " + resultTo + " (index " + index + ")");
243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
24330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sourceRecord = mHistory.get(index);
243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (requestCode >= 0 && !sourceRecord.finishing) {
243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord = sourceRecord;
243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && sourceRecord != null) {
244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Transfer the result target from the source activity to the new
244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // one being started, including any failures.
244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (requestCode >= 0) {
24478078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                ActivityOptions.abort(options);
2448a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultRecord = sourceRecord.resultTo;
245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultWho = sourceRecord.resultWho;
245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            requestCode = sourceRecord.requestCode;
245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sourceRecord.resultTo = null;
245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord.removeResultsLocked(
245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sourceRecord, resultWho, requestCode);
245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2460a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find a class that can handle the given Intent.
246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // That's the end of that!
2463a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_INTENT_NOT_RESOLVED;
246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2466a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find the specific class specified in the Intent.
246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Also the end of the line.
2469a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_CLASS_NOT_FOUND;
247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2472a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err != ActivityManager.START_SUCCESS) {
247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
247890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
24798078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return err;
248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
248335be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int startAnyPerm = mService.checkPermission(
248435be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey                START_ANY_ACTIVITY, callingPid, callingUid);
248535be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
24866c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
248735be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
249390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
24946c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            String msg;
24956c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            if (!aInfo.exported) {
24966c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
24976c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
24986c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
24996c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " not exported from uid " + aInfo.applicationInfo.uid;
25006c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            } else {
25016c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
25026c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
25036c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
25046c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " requires " + aInfo.permission;
25056c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            }
250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, msg);
250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw new SecurityException(msg);
250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mController != null) {
251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean abort = false;
251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The Intent we give to the watcher has the extra data
251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // stripped off, since it can contain private information.
251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Intent watchIntent = intent.cloneFilter();
251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    abort = !mService.mController.activityStarting(watchIntent,
251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo.applicationInfo.packageName);
251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (abort) {
252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (resultRecord != null) {
252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sendActivityResultLocked(-1,
252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resultRecord, resultWho, requestCode,
252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Activity.RESULT_CANCELED, null);
252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We pretend to the caller that it was really started, but
253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // they will just get a cancel result.
253190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
25328078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2533a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SUCCESS;
253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2537742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,
253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                intent, resolvedType, aInfo, mService.mConfiguration,
254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord, resultWho, requestCode, componentSpecified);
2541621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (outActivity != null) {
2542621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            outActivity[0] = r;
2543621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mResumedActivity == null
254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || mResumedActivity.info.applicationInfo.uid != callingUid) {
254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    PendingActivityLaunch pal = new PendingActivityLaunch();
255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.r = r;
255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.sourceRecord = sourceRecord;
2552a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    pal.startFlags = startFlags;
255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mPendingActivityLaunches.add(pal);
255490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
25558078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2556a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SWITCHES_CANCELED;
255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mDidAppSwitch) {
256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second allowed switch since we stopped switches,
256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // so now just generally allow switches.  Use case: user presses
256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // home (switches disabled, switch to home, mDidAppSwitch now true);
256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // user taps a home icon (coming from home so allowed, we hit here
256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and now allow anyone to switch again).
256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mAppSwitchesAllowedTime = 0;
256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mDidAppSwitch = true;
256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.doPendingActivityLaunchesLocked(false);
257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
257490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord,
25757a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                startFlags, true, options);
2576621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
257790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // Someone asked to have the keyguard dismissed on the next
257890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // activity start, but we are not actually doing an activity
257990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // switch...  just dismiss the keyguard now, because we
258090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // probably want to see whatever is behind it.
258190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
258290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
258390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
258490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        return err;
258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2587621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
2588621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((launchFlags &
2589621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2590621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2591621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // Caller wants to appear on home activity, so before starting
2592621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // their own activity we will bring home to the front.
2593621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontLocked();
2594621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2595621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2596621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r,
25987a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            ActivityRecord sourceRecord, int startFlags, boolean doResume,
25997a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            Bundle options) {
260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final Intent intent = r.intent;
260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int callingUid = r.launchedFromUid;
2602742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = r.userId;
2603742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We'll invoke onUserLeaving before onPause only if the launching
260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity did not explicitly state that this is an automated launch.
260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_USER_LEAVING) Slog.v(TAG,
261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "startActivity() => mUserLeaving=" + mUserLeaving);
261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the caller has asked not to resume at this point, we make note
261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of this in the record so that we can skip it when trying to find
261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the top running activity.
261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!doResume) {
261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.delayedResume = true;
261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)
262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                != 0 ? r : null;
262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the onlyIfNeeded flag is set, then we can do this if the activity
262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // being launched is the same as the one making the call...  or, as
262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a special case, if we do not know the caller then we count the
262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current top activity as the caller.
2626a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord checkedCaller = sourceRecord;
262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (checkedCaller == null) {
262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                checkedCaller = topRunningNonDelayedActivityLocked(notTop);
263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!checkedCaller.realActivity.equals(r.realActivity)) {
263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Caller is not the same as launcher, so always needed.
2633a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sourceRecord == null) {
263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not being started from another...  in this
263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // case we -always- start a new task.
264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + intent);
264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The original activity who is starting us is running as a single
264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // instance...  this new activity it is starting must go on its
264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // own task.
264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity being started is a single instance...  it always
265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // gets launched into its own task.
265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // For whatever reason this activity is being launched into a new
265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // task...  yet the caller has requested a result back.  Well, that
266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // is pretty messed up, so instead immediately send back a cancel
266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and let the new task continue launched as normal without a
266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // dependency on its originator.
266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sendActivityResultLocked(-1,
266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.resultTo, r.resultWho, r.requestCode,
266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Activity.RESULT_CANCELED, null);
266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean addingToTask = false;
267103fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn        boolean movedHome = false;
2672621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord reuseTask = null;
267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If bring to front is requested, and no result is requested, and
267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we can find a task that was started with this same
267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // component, then instead of launching bring that one to the front.
268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo == null) {
268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // See if there is a task to bring to the front.  If this is
268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // a SINGLE_INSTANCE activity, there can be one and only one
268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of it in the history, and it is always in its own
268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // unique task, so we do a special search.
268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? findTaskLocked(intent, r.info)
268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        : findActivityLocked(intent, r.info);
268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTop != null) {
268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (taskTop.task.intent == null) {
269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // This task was started because of movement of
269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the activity based on affinity...  now that we
269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // are actually launching it, we can assign the
269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // base intent.
269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(intent, r.info);
269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the target task is not in the front, then we need
269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to bring it to the front...  except...  well, with
269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to have the same behavior as if a new instance was
270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // being started, which means not bringing it to the front
270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // if the caller is not itself in the front.
270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop);
270366a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru                    if (curTop != null && curTop.task != taskTop.task) {
270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        boolean callerAtFront = sourceRecord == null
270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                || curTop.task == sourceRecord.task;
270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (callerAtFront) {
270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // We really do want to push this one into the
270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // user's face, right now.
271003fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                            movedHome = true;
2711621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            moveHomeToFrontFromLaunchLocked(launchFlags);
27128078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            moveTaskToFrontLocked(taskTop.task, r, options);
271384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            options = null;
271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller has requested that the target task be
271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // reset, then do so.
271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop = resetTaskIfNeededLocked(taskTop, r);
272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2721a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED)  != 0) {
272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We don't need to start a new activity, and
272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the client said not to do anything if that
272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is the case, so this is it!  And for paranoia, make
272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
272784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
272884375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
272984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2731a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2733621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if ((launchFlags &
2734621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
2735621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
2736621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // The caller has requested to completely replace any
27377da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // existing task with its new activity.  Well that should
2738621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // not be too hard...
2739621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask = taskTop.task;
2740621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        performClearTaskLocked(taskTop.task.taskId);
2741621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask.setIntent(r.intent, r.info);
2742621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this situation we want to remove all activities
274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from the task up to the one being started.  In most
274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cases this means we are resetting the task to its
274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // initial state.
274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord top = performClearTaskLocked(
2750621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                taskTop.task.taskId, r, launchFlags);
275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (top != null) {
275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (top.frontOfTask) {
275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // Activity aliases may mean we use different
275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intents for the top activity, so make sure
275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the task now has the identity of the new
275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intent.
275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                top.task.setIntent(r.intent, r.info);
275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
276039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // A special case: we need to
276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // start the activity because it is not currently
276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // running, and the caller has asked to clear the
276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // current task to have this activity at the top.
276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Now pretend like this activity is being started
276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // by the top of its task, so it is put in the
276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // right place.
277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (r.realActivity.equals(taskTop.task.realActivity)) {
277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case the top activity on the task is the
277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // same as the one being launched, so we take that
277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // as a request to bring the task to the foreground.
277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the top activity in the task is the root
277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, deliver this new intent to it if it
277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // desires.
277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && taskTop.realActivity.equals(r.realActivity)) {
278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (taskTop.frontOfTask) {
278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                taskTop.task.setIntent(r.intent, r.info);
278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
278539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            taskTop.deliverNewIntentLocked(callingUid, r.intent);
278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (!r.intent.filterEquals(taskTop.task.intent)) {
278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case we are launching the root activity
278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // of the task, but with a different intent.  We
278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // should start a new instance on top.
279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case an activity is being launched in to an
279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // existing task, without resetting that task.  This
279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is typically the situation of launching an activity
279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from a notification or shortcut.  We want to place
279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the new activity on top of the current task.
279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        addingToTask = true;
280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sourceRecord = taskTop;
280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!taskTop.task.rootWasReset) {
280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case we are launching in to an existing task
280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // that has not yet been started from its front door.
280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // The current task has been brought to the front.
280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Ideally, we'd probably like to place this new task
280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // at the bottom of its stack, but that's a little hard
280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to do with the current organization of the code so
280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // for now we'll just drop it.
280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(r.intent, r.info);
281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2811621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (!addingToTask && reuseTask == null) {
281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We didn't do anything...  but it was needed (a.k.a., client
281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // don't use that intent!)  And for paranoia, make
281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
281684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
281784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
281884375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2820a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_TASK_TO_FRONT;
282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //String uri = r.intent.toURI();
282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Intent intent2 = new Intent(uri);
282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "Given intent: " + r.intent);
282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "URI is: " + uri);
283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "To intent: " + intent2);
283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.packageName != null) {
283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity being launched is the same as the one currently
283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // at the top, then we need to check if it should only be launched
283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // once.
283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (top != null && r.resultTo == null) {
2838742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (top.app != null && top.app.thread != null) {
284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // For paranoia, make sure we have correctly
284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // resumed the top activity.
284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (doResume) {
284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                resumeTopActivityLocked(null);
284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
28498078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            ActivityOptions.abort(options);
2850a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // We don't need to start a new activity, and
285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the client said not to do anything if that
285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // is the case, so this is it!
2854a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
285639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
2857a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            return ActivityManager.START_DELIVERED_TO_TOP;
285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo != null) {
286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.resultTo, r.resultWho, r.requestCode,
286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
28698078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
2870a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            return ActivityManager.START_CLASS_NOT_FOUND;
287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean newTask = false;
28747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        boolean keepCurTransition = false;
287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Should this be considered a new task?
287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo == null && !addingToTask
287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (reuseTask == null) {
2880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // todo: should do better management of integers.
2881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mService.mCurTask++;
2882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (mService.mCurTask <= 0) {
2883621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    mService.mCurTask = 1;
2884621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
2885f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true);
2886621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
2887621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        + " in new task " + r.task);
2888621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else {
2889f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(reuseTask, reuseTask, true);
289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newTask = true;
289203fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            if (!movedHome) {
289303fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                moveHomeToFrontFromLaunchLocked(launchFlags);
289403fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            }
289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord != null) {
289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!addingToTask &&
289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are adding the activity to an existing
290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, but the caller has asked to clear that task if the
290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity is already running.
290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord top = performClearTaskLocked(
2903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        sourceRecord.task.taskId, r, launchFlags);
29047da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                keepCurTransition = true;
290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (top != null) {
290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
290739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // For paranoia, make sure we have correctly
290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // resumed the top activity.
291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
29138078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2914a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (!addingToTask &&
291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are launching an activity in our own task
291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // that may already be running somewhere in the history, and
292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we want to shuffle it to the front of the stack if so.
292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (where >= 0) {
292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord top = moveActivityToFrontLocked(where);
292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
29257a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    top.updateOptionsLocked(options);
292639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2930a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // An existing activity is starting this new activity, so we want
293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to keep the new one in the same task as the one that is starting
293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it.
2936f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in existing task " + r.task);
293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This not being started from an existing activity, and not part
294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // of a new task...  just put it in the top task, though these days
294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this case should never happen.
294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int N = mHistory.size();
294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord prev =
29460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                N > 0 ? mHistory.get(N-1) : null;
2947f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(prev != null
2948621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    ? prev.task
2949f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                    : new TaskRecord(mService.mCurTask, r.info, intent), null, true);
295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in new guessed " + r.task);
295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
295339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
295439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
29557e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                intent, r.getUriPermissionsLocked());
295639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (newTask) {
295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId);
295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
29617a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        startActivityLocked(r, newTask, doResume, keepCurTransition, options);
2962a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2965a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
2966483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            String profileFile, ParcelFileDescriptor profileFd, int userId) {
296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Collect information about the target of the Intent.
296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityInfo aInfo;
296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ResolveInfo rInfo =
297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                AppGlobals.getPackageManager().resolveIntent(
297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent, resolvedType,
297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        PackageManager.MATCH_DEFAULT_ONLY
2974483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = rInfo != null ? rInfo.activityInfo : null;
297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = null;
297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (aInfo != null) {
298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Store the found target back into the intent, because now that
298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we have it we never want to do this again.  For example, if the
298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // user navigates back to this point in the history, we should
298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // always restart the exact same activity.
298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            intent.setComponent(new ComponentName(
298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    aInfo.applicationInfo.packageName, aInfo.name));
298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Don't debug things in the system process
2989a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setDebugApp(aInfo.processName, true, false);
299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
299462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
2995a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
299692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                if (!aInfo.processName.equals("system")) {
299792a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
299892a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                }
299992a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy            }
300092a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
300162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFile != null) {
300262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
300362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
3004a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            profileFile, profileFd,
3005a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
300662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
300762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
3009621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return aInfo;
3010621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3011621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3012621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivityMayWait(IApplicationThread caller, int callingUid,
3013a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, IBinder resultTo,
3014a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            String resultWho, int requestCode, int startFlags, String profileFile,
3015a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
3016a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3017621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Refuse possible leaked file descriptors
3018621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intent != null && intent.hasFileDescriptors()) {
3019621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("File descriptors passed in Intent");
3020621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3021621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        boolean componentSpecified = intent.getComponent() != null;
3022621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3023621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Don't modify the client's object!
3024621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        intent = new Intent(intent);
3025621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3026621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Collect information about the target of the Intent.
3027a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
3028483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                profileFile, profileFd, userId);
3029a10d1aa6c790810990a09f5dfa616075fe198eedAmith Yamasani        if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0
3030a10d1aa6c790810990a09f5dfa616075fe198eedAmith Yamasani                && mService.isSingleton(aInfo.processName, aInfo.applicationInfo, null, 0)) {
3031a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani            userId = 0;
3032a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani        }
3033742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        aInfo = mService.getActivityInfoForUser(aInfo, userId);
303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid;
3037621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (callingUid >= 0) {
3038621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                callingPid = -1;
3039621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else if (caller == null) {
304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = Binder.getCallingPid();
304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingUid = Binder.getCallingUid();
304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = callingUid = -1;
304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mConfigWillChange = config != null
304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && mService.mConfiguration.diff(config) != 0;
304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_CONFIGURATION) Slog.v(TAG,
304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Starting activity when config will change = " + mConfigWillChange);
305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final long origId = Binder.clearCallingIdentity();
305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack && aInfo != null &&
305454e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Check to see if we already
305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // have another, different heavy-weight process running.
305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null &&
305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingPid = callingPid;
306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingUid = callingUid;
306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (caller != null) {
306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (callerApp != null) {
306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingPid = callerApp.pid;
306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingUid = callerApp.info.uid;
306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } else {
306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Slog.w(TAG, "Unable to find app for caller " + caller
307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + " (pid=" + realCallingPid + ") when starting: "
307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + intent.toString());
30728078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                                ActivityOptions.abort(options);
3073a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_PERMISSION_DENIED;
307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        IIntentSender target = mService.getIntentSenderLocked(
3078a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
3079621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                realCallingUid, null, null, 0, new Intent[] { intent },
3080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
30817a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                                | PendingIntent.FLAG_ONE_SHOT, null);
308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Intent newIntent = new Intent();
308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (requestCode >= 0) {
308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Caller is requesting a result.
308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                new IntentSender(target));
309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.packageName);
309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.task.taskId);
309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                aInfo.packageName);
309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setFlags(intent.getFlags());
310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setClassName("android",
310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                HeavyWeightSwitcherActivity.class.getName());
310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent = newIntent;
310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resolvedType = null;
310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        caller = null;
310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingUid = Binder.getCallingUid();
310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingPid = Binder.getCallingPid();
310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        componentSpecified = true;
310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ResolveInfo rInfo =
311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                AppGlobals.getPackageManager().resolveIntent(
311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        intent, null,
311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        PackageManager.MATCH_DEFAULT_ONLY
3113483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = rInfo != null ? rInfo.activityInfo : null;
3115742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (RemoteException e) {
311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = null;
311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType,
3124a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
3125a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    startFlags, options, componentSpecified, null);
312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mConfigWillChange && mMainStack) {
312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller also wants to switch to a new configuration,
312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // do so now.  This allows a clean switch, as we are waiting
313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for the current activity to pause (so we will not destroy
313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it), and have not yet started the next activity.
313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "updateConfiguration()");
313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mConfigWillChange = false;
313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG,
313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Updating to new configuration after starting activity.");
3137813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                mService.updateConfigurationLocked(config, null, false, false);
313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Binder.restoreCallingIdentity(origId);
314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (outResult != null) {
314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                outResult.result = res;
3144a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                if (res == ActivityManager.START_SUCCESS) {
314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mWaitingActivityLaunched.add(outResult);
314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    do {
314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
3148ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                            mService.wait();
314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (InterruptedException e) {
315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } while (!outResult.timeout && outResult.who == null);
3152a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord r = this.topRunningActivityLocked(null);
315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.nowVisible) {
315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.timeout = false;
315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.totalTime = 0;
315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = 0;
315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = SystemClock.uptimeMillis();
316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mWaitingActivityVisible.add(outResult);
316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        do {
316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            try {
3164ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                                mService.wait();
316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } catch (InterruptedException e) {
316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } while (!outResult.timeout && outResult.who == null);
316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return res;
317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3176621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivities(IApplicationThread caller, int callingUid,
3177a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
3178a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3179621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents == null) {
3180621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("intents is null");
3181621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3182621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (resolvedTypes == null) {
3183621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("resolvedTypes is null");
3184621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3185621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents.length != resolvedTypes.length) {
3186621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("intents are length different than resolvedTypes");
3187621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3188621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3189621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        ActivityRecord[] outActivity = new ActivityRecord[1];
3190621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3191621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int callingPid;
3192621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (callingUid >= 0) {
3193621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = -1;
3194621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else if (caller == null) {
3195621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = Binder.getCallingPid();
3196621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingUid = Binder.getCallingUid();
3197621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else {
3198621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = callingUid = -1;
3199621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3200621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        final long origId = Binder.clearCallingIdentity();
3201621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
3202621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mService) {
3203621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3204621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<intents.length; i++) {
3205621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    Intent intent = intents[i];
3206621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent == null) {
3207621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
3208621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3209621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3210621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Refuse possible leaked file descriptors
3211621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent != null && intent.hasFileDescriptors()) {
3212621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException("File descriptors passed in Intent");
3213621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3214621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3215621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    boolean componentSpecified = intent.getComponent() != null;
3216621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3217621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Don't modify the client's object!
3218621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    intent = new Intent(intent);
3219621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3220621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Collect information about the target of the Intent.
3221a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
3222483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            0, null, null, userId);
3223742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // TODO: New, check if this is correct
3224742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
3225621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3226621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags
3227621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
3228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException(
3229621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                "FLAG_CANT_SAVE_STATE not supported here");
3230621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3231621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
32327a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    Bundle theseOptions;
32337a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    if (options != null && i == intents.length-1) {
32347a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = options;
32357a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    } else {
32367a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = null;
32377a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    }
3238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
3239a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            aInfo, resultTo, null, -1, callingPid, callingUid,
32407a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                            0, theseOptions, componentSpecified, outActivity);
3241621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (res < 0) {
3242621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        return res;
3243621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3244621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3245be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
3246621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
3247621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3248621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } finally {
3249621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Binder.restoreCallingIdentity(origId);
3250621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3251621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3252a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
3253621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long thisTime, long totalTime) {
325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityLaunched.get(i);
325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = timeout;
326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = thisTime;
326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = totalTime;
326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3268621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityVisibleLocked(ActivityRecord r) {
327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityVisible.get(i);
327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = false;
327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = w.totalTime;
327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
328090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
328190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mDismissKeyguardOnNextActivity) {
328290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
328390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
328490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void sendActivityResultLocked(int callingUid, ActivityRecord r,
328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode, int resultCode, Intent data) {
328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (callingUid > 0) {
329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
32927e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                    data, r.getUriPermissionsLocked());
329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " : who=" + resultWho + " req=" + requestCode
329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " res=" + resultCode + " data=" + data);
329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r && r.app != null && r.app.thread != null) {
329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.add(new ResultInfo(resultWho, requestCode,
330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resultCode, data));
3303be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleSendResult(r.appToken, list);
330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown sending result to " + r, e);
330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void stopActivityLocked(ActivityRecord r) {
331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
3318d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (!mService.mSleeping) {
3319d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) {
3320d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                        Slog.d(TAG, "no-history finish of " + r);
3321d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    }
3322d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
3323d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                            "no-history");
3324d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                } else {
3325d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r
3326d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                            + " on stop because we're just sleeping");
3327d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
33295007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        }
33305007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate
33315007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        if (r.app != null && r.app.thread != null) {
333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mFocusedActivity == r) {
333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(topRunningActivityLocked(null));
333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3337621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            r.resumeKeyDispatchingLocked();
333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = false;
3340ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3341ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (stop requested)");
334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPING;
334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping visible=" + r.visible + " for " + r);
334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!r.visible) {
3346be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(r.appToken, false);
334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
3348be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
33494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (mService.isSleeping()) {
33504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
33514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
3352162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG);
3353162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                msg.obj = r;
3354162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                mHandler.sendMessageDelayed(msg, STOP_TIMEOUT);
335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Maybe just ignore exceptions here...  if the process
335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Just in case, assume it to be stopped.
336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = true;
3362ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);
336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPED;
336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.configDestroy) {
336528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                    destroyActivityLocked(r, true, false, "stop-except");
336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(
337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean remove) {
337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int N = mStoppingActivities.size();
337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (N <= 0) return null;
337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean nowVisible = mResumedActivity != null
337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mResumedActivity.nowVisible
338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && !mResumedActivity.waitingVisible;
338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=0; i<N; i++) {
338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord s = mStoppingActivities.get(i);
338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + nowVisible + " waitingVisible=" + s.waitingVisible
338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " finishing=" + s.finishing);
338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (s.waitingVisible && nowVisible) {
338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.remove(s);
338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                s.waitingVisible = false;
338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (s.finishing) {
339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is finishing, it is sitting on top of
339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // everyone else but we now know it is no longer needed...
339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so get rid of it.  Otherwise, we need to go through the
339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // normal flow and hide it once we determine that it is
339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // hidden by the activities in front of it.
339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3396be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(s.appToken, false);
339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
33994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if ((!s.waitingVisible || mService.isSleeping()) && remove) {
340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (stops == null) {
340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stops = new ArrayList<ActivityRecord>();
340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                stops.add(s);
340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.remove(i);
340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                N--;
340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return stops;
341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    final void scheduleIdleLocked() {
341580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        Message msg = Message.obtain();
341680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        msg.what = IDLE_NOW_MSG;
341780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        mHandler.sendMessage(msg);
341880a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    }
341980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn
342062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config) {
342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityRecord res = null;
342562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> finishes = null;
342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> thumbnails = null;
342980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        ArrayList<UserStartedState> startingUsers = null;
343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NS = 0;
343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NF = 0;
343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NT = 0;
343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        IApplicationThread sendThumbnail = null;
343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean booting = false;
343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean enableScreen = false;
343642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3439be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3440be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3441be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
34422a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                r.finishLaunchTickingLocked();
344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Get the activity record.
3446be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
344862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                res = r;
344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (fromTimeout) {
345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is a hack to semi-deal with a race condition
345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in the client where it can be constructed with a
345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // newer configuration from when we asked it to launch.
345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We'll update with whatever configuration it now says
345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it used to launch.
345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (config != null) {
346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.configuration = config;
346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // No longer need to keep the device awake.
346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mResumedActivity == r && mLaunchingActivity.isHeld()) {
346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are now idle.  If someone is waiting for a thumbnail from
347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // us, we can now deliver.
347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.idle = true;
347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.scheduleAppGcsLocked();
347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sendThumbnail = r.app.thread;
347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.thumbnailNeeded = false;
347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is fullscreen, set up to hide those under it.
347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
348529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (!mService.mBooted) {
348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mBooted = true;
348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        enableScreen = true;
348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (fromTimeout) {
349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Atomically retrieve all of the other things to do.
349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            stops = processStoppingActivitiesLocked(true);
349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            NS = stops != null ? stops.size() : 0;
349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NF=mFinishingActivities.size()) > 0) {
349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mFinishingActivities.clear();
350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NT=mService.mCancelledThumbnails.size()) > 0) {
350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails);
350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mCancelledThumbnails.clear();
350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                booting = mService.mBooting;
350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mBooting = false;
351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
351180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            if (mStartingUsers.size() > 0) {
351280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
351380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                mStartingUsers.clear();
351480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            }
351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i;
351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Send thumbnail if requested.
352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sendThumbnail != null) {
352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendThumbnail.requestThumbnail(token);
352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.sendPendingThumbnail(null, token, null, null, true);
352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Stop any activities that are scheduled to do so but have been
353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NS; i++) {
353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)stops.get(i);
353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stopActivityLocked(r);
353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Finish any activities that are scheduled to do so but have been
354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NF; i++) {
354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)finishes.get(i);
354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
354742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                activityRemoved = destroyActivityLocked(r, true, false, "finish-idle");
354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Report back to any thumbnail receivers.
355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NT; i++) {
355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)thumbnails.get(i);
355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.sendPendingThumbnail(r, null, null, null, true);
355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (booting) {
355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.finishBooting();
355980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        } else if (startingUsers != null) {
356080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            for (i=0; i<startingUsers.size(); i++) {
356180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                mService.finishUserSwitch(startingUsers.get(i));
356280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            }
356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.trimApplications();
356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //dump();
356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //mWindowManager.dump();
356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (enableScreen) {
357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.enableScreenAfterBoot();
357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
357262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
357342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
357442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
357542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
357642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
357762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        return res;
357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
358080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn    final void addStartingUserLocked(UserStartedState uss) {
358180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        mStartingUsers.add(uss);
358280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn    }
358380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
358550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the activity is being finished, false if for
358650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * some reason it is being left as-is.
358750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Intent resultData, String reason) {
359050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int index = indexOfTokenLocked(token);
3591d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(
359298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Finishing activity @" + index + ": token=" + token
3593d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", result=" + resultCode + ", data=" + resultData
3594d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", reason=" + reason);
359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
35980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord r = mHistory.get(index);
359950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishActivityLocked(r, index, resultCode, resultData, reason);
360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
360350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3604ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final void finishSubActivityLocked(IBinder token, String resultWho, int requestCode) {
3605ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord self = isInStackLocked(token);
3606ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (self == null) {
3607ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return;
3608ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3609ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3610ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int i;
3611ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        for (i=mHistory.size()-1; i>=0; i--) {
3612ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord r = (ActivityRecord)mHistory.get(i);
3613ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (r.resultTo == self && r.requestCode == requestCode) {
3614ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                if ((r.resultWho == null && resultWho == null) ||
3615ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    (r.resultWho != null && r.resultWho.equals(resultWho))) {
3616ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    finishActivityLocked(r, i,
3617ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                            Activity.RESULT_CANCELED, null, "request-sub");
3618ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                }
3619ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3620ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3621ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3622ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3623ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final boolean finishActivityAffinityLocked(IBinder token) {
3624ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int index = indexOfTokenLocked(token);
3625ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(
3626ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                TAG, "Finishing activity affinity @" + index + ": token=" + token);
3627ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (index < 0) {
3628ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return false;
3629ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3630ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord r = mHistory.get(index);
3631ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3632bfc1be1101b87f193b043b62edd1722b8c4eb23cAmith Yamasani        while (index >= 0) {
3633ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord cur = mHistory.get(index);
3634ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.task != r.task) {
3635ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3636ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3637ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity == null && r.taskAffinity != null) {
3638ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3639ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3640ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
3641ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3642ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3643ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity");
3644ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            index--;
3645ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3646ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        return true;
3647ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3648ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
36495c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
36505c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // send the result
36515c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        ActivityRecord resultTo = r.resultTo;
36525c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        if (resultTo != null) {
36535c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
36545c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " who=" + r.resultWho + " req=" + r.requestCode
36555c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " res=" + resultCode + " data=" + resultData);
36565c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (r.info.applicationInfo.uid > 0) {
36575c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
36585c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.packageName, resultData,
36595c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.getUriPermissionsLocked());
36605c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            }
36615c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
36625c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                                     resultData);
36635c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            r.resultTo = null;
36645c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        }
36655c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
36665c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
36675c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // Make sure this HistoryRecord is not holding on to other resources,
36685c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // because clients have remote IPC references to this object so we
36695c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // can't assume that will go away and want to avoid circular IPC refs.
36705c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.results = null;
36715c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.pendingResults = null;
36725c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.newIntents = null;
36735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.icicle = null;
36745c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    }
36755c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if this activity has been removed from the history
367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * list, or false if it is still in the list and will be removed later.
367950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
368150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int resultCode, Intent resultData, String reason) {
36828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return finishActivityLocked(r, index, resultCode, resultData, reason, false);
36838078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
36848078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
36858078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
36868078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @return Returns true if this activity has been removed from the history
36878078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * list, or false if it is still in the list and will be removed later.
36888078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
36898078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
36908078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            int resultCode, Intent resultData, String reason, boolean immediate) {
369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Duplicate finish request for " + r);
369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
369694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        r.makeFinishing();
369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName, reason);
370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < (mHistory.size()-1)) {
37010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord next = mHistory.get(index+1);
370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next.task == r.task) {
370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.frontOfTask) {
370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The next activity is now the front of the task.
370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.frontOfTask = true;
370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
370750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller asked that this activity (and all above it)
370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // be cleared when the task is reset, don't lose that information,
371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // but propagate it up to the next activity.
371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pauseKeyDispatchingLocked();
371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mFocusedActivity == r) {
371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.setFocusedActivityLocked(topRunningActivityLocked(null));
372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
372250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37235c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        finishActivityResultsLocked(r, resultCode, resultData);
372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37328078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (immediate) {
37338078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            return finishCurrentActivityLocked(r, index,
37348078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    FINISH_IMMEDIATELY) == null;
37358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        } else if (mResumedActivity == r) {
373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean endTask = index <= 0
37370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    || (mHistory.get(index-1)).task != r.task;
373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare close transition: finishing " + r);
374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.prepareAppTransition(endTask
374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
37427da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Tell window manager to prepare for this one to be removed.
3745be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(r.appToken, false);
374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3747621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity == null) {
374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, false);
375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.state != ActivityState.PAUSING) {
375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity is PAUSING, we will complete the finish once
375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it is done pausing; else we can just directly finish it here.
375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return finishCurrentActivityLocked(r, index,
375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    FINISH_AFTER_PAUSE) == null;
375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return false;
376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_IMMEDIATELY = 0;
376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_PAUSE = 1;
376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_VISIBLE = 2;
376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int mode) {
3772be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        final int index = indexOfActivityLocked(r);
377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return null;
377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return finishCurrentActivityLocked(r, index, mode);
377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index, int mode) {
378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First things first: if this activity is currently visible,
378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // and the resumed activity is not yet visible, then hold off on
378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // finishing until the resumed one becomes visible.
378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mStoppingActivities.contains(r)) {
378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.add(r);
378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mStoppingActivities.size() > 3) {
378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If we already have a few activities waiting to stop,
379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // then give up on things going idle and start clearing
379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // them out.
379280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                    scheduleIdleLocked();
37934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } else {
37944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    checkReadyForSleepLocked();
379550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
379650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3797ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3798ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (finish requested)");
379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPING;
380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateOomAdjLocked();
380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return r;
380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure the record is cleaned out of other places.
380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(r);
38064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final ActivityState prevState = r.state;
3812ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r);
381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.state = ActivityState.FINISHING;
381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_IMMEDIATELY
381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.STOPPED
381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.INITIALIZING) {
381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this activity is already stopped, we can just finish
381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it right now.
382042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            boolean activityRemoved = destroyActivityLocked(r, true, true, "finish-imm");
382142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            if (activityRemoved) {
382242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
382342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
382442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            return activityRemoved ? null : r;
382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Need to go through the full pause cycle to get this
382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity into the stopped state and then finish it.
382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mFinishingActivities.add(r);
383050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return r;
383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform the common clean-up of an activity record.  This is called both
383750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * as part of destroyActivityLocked() (when destroying the client-side
383850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * representation) and cleaning things up as a result of its hosting
383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * processing going away, in which case there is no remaining client-side
384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * state to destroy so only the cleanup here is needed.
384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
3842ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
3843ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            boolean setState) {
384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mFocusedActivity == r) {
384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mFocusedActivity = null;
384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configDestroy = false;
385250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frozenBeforeDestroy = false;
385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3854ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (setState) {
3855ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
3856ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            r.state = ActivityState.DESTROYED;
3857ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3858ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this record is no longer in the pending finishes list.
386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // This could happen, for example, if we are trimming activities
386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // down to the max limit while they are still waiting to finish.
386250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mFinishingActivities.remove(r);
386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
386550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remove any pending results.
386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing && r.pendingResults != null) {
386750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                PendingIntentRecord rec = apr.get();
386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (rec != null) {
387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.cancelIntentSenderLocked(rec, false);
387150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
387350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.pendingResults = null;
387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
387550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
387650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (cleanServices) {
387750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
387850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
387950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
388150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
388250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
388350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
388450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
388550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
388750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Get rid of any pending idle timeouts.
388842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        removeTimeoutsForActivityLocked(r);
388942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    }
389042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
389142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    private void removeTimeoutsForActivityLocked(ActivityRecord r) {
389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
3893162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
38950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
38962a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.finishLaunchTickingLocked();
389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38995c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void removeActivityFromHistoryLocked(ActivityRecord r) {
390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.state != ActivityState.DESTROYED) {
39015c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
390294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            r.makeFinishing();
390398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_ADD_REMOVE) {
390498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                RuntimeException here = new RuntimeException("here");
390598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                here.fillInStackTrace();
390698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                Slog.i(TAG, "Removing activity " + r + " from stack");
390798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            }
390850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHistory.remove(r);
3909f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.takeFromHistory();
3910ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3911ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (removed from history)");
391250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.DESTROYED;
3913be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.removeAppToken(r.appToken);
391450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (VALIDATE_TOKENS) {
3915be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                validateAppTokensLocked();
391650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
391750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
391850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.removeUriPermissionsLocked();
391950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
392050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
392150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
392250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
392350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clean-up of service connections in an activity record.
392450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
392550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void cleanUpActivityServicesLocked(ActivityRecord r) {
392650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Throw away any services that have been bound by this activity.
392750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.connections != null) {
392850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Iterator<ConnectionRecord> it = r.connections.iterator();
392950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            while (it.hasNext()) {
393050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ConnectionRecord c = it.next();
3931599db5c85faa5733af538a712b870e1f507cd380Dianne Hackborn                mService.mServices.removeConnectionLocked(c, null, r);
393250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
393350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.connections = null;
393450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3936755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
3937755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    final void scheduleDestroyActivities(ProcessRecord owner, boolean oomAdj, String reason) {
3938755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        Message msg = mHandler.obtainMessage(DESTROY_ACTIVITIES_MSG);
3939755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        msg.obj = new ScheduleDestroyArgs(owner, oomAdj, reason);
3940755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        mHandler.sendMessage(msg);
3941755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
3942755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
394328695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
3944755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        boolean lastIsOpaque = false;
394542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
3946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
3947ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            ActivityRecord r = mHistory.get(i);
3948755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.finishing) {
3949755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
3950755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3951755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.fullscreen) {
3952755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                lastIsOpaque = true;
3953755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3954ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (owner != null && r.app != owner) {
3955ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                continue;
3956ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3957755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (!lastIsOpaque) {
3958755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
3959755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3960ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // We can destroy this one if we have its icicle saved and
3961ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it is not in the process of pausing/stopping/finishing.
3962755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.app != null && r != mResumedActivity && r != mPausingActivity
3963755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    && r.haveState && !r.visible && r.stopped
3964ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYING
3965ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYED) {
3966755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Destroying " + r + " in state " + r.state
3967755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " resumed=" + mResumedActivity
3968755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " pausing=" + mPausingActivity);
396942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (destroyActivityLocked(r, true, oomAdj, reason)) {
397042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    activityRemoved = true;
397142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
3972ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3973ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
397442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
397542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
397642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
3977ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
3978ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Destroy the current CLIENT SIDE instance of an activity.  This may be
398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * called both when actually finishing an activity, or when performing
398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * a configuration switch where we destroy the current client-side object
398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * but then create a new client-side object for this same HistoryRecord.
398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean destroyActivityLocked(ActivityRecord r,
398628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            boolean removeFromApp, boolean oomAdj, String reason) {
398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(
3988755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            TAG, "Removing activity from " + reason + ": token=" + r
398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn              + ", app=" + (r.app != null ? r.app.processName : "(null)"));
399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
399228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                r.task.taskId, r.shortComponentName, reason);
399350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
399450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean removedFromHistory = false;
399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3996ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        cleanUpActivityLocked(r, false, false);
399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
399850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadApp = r.app != null;
399950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
400050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (hadApp) {
400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (removeFromApp) {
400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int idx = r.app.activities.indexOf(r);
400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (idx >= 0) {
400450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.app.activities.remove(idx);
400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = null;
400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendEmptyMessage(
400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
401050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
401150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.app.activities.size() == 0) {
401250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // No longer have activities, so update location in
401350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // LRU list.
4014ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    mService.updateLruProcessLocked(r.app, oomAdj, false);
401550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
401650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
401750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
401850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean skipDestroy = false;
401950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
402050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
402150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
4022be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
402350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.configChangeFlags);
402450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
402550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We can just ignore exceptions here...  if the process
402650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
402750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
402850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.w(TAG, "Exception thrown during finish", e);
402950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
403050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
403150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removedFromHistory = true;
403250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    skipDestroy = true;
403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.app = null;
403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.nowVisible = false;
403850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4039ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // If the activity is finishing, we need to wait on removing it
4040ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // from the list to give it a chance to do its cleanup.  During
4041ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // that time it may make calls back with its token so we need to
4042ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // be able to find it on the list and so we don't want to remove
4043ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it from the list yet.  Otherwise, we can just immediately put
4044ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it in the destroyed state since we are not removing it from the
4045ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // list.
404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing && !skipDestroy) {
4047ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r
4048ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy requested)");
404950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYING;
405050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
405150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                msg.obj = r;
405250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
405350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4054ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4055ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy skipped)");
405650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
405750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
405850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
405950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // remove this record from the history.
406050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
406150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removeActivityFromHistoryLocked(r);
406250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removedFromHistory = true;
406350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4064ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4065ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (no app)");
406650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
406750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
406850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
406950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configChangeFlags = 0;
407150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mLRUActivities.remove(r) && hadApp) {
407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
407450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
407550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return removedFromHistory;
407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void activityDestroyed(IBinder token) {
408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
408142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            final long origId = Binder.clearCallingIdentity();
408242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            try {
408342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                ActivityRecord r = ActivityRecord.forToken(token);
408442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (r != null) {
408542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
408642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
408742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
408842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                int index = indexOfActivityLocked(r);
408942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (index >= 0) {
409042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    if (r.state == ActivityState.DESTROYING) {
409145a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                        cleanUpActivityLocked(r, true, false);
409242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                        removeActivityFromHistoryLocked(r);
409342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    }
409450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
409542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
409642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            } finally {
409742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                Binder.restoreCallingIdentity(origId);
409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
409950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
410050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
410150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
410242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    private void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
410350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = list.size();
410450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(
410550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing app " + app + " from list " + list
410650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            + " with " + i + " entries");
410750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
410850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
410950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)list.get(i);
411050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
411150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "Record #" + i + " " + r + ": app=" + r.app);
411250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == app) {
411350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing this entry!");
411450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.remove(i);
411542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                removeTimeoutsForActivityLocked(r);
411650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
411750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
411850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
411950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
412050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void removeHistoryRecordsForAppLocked(ProcessRecord app) {
412150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mLRUActivities, app);
412250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mStoppingActivities, app);
41234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app);
412450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app);
412550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mFinishingActivities, app);
412650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
412750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4128621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
4129621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Move the current home activity's task (if one exists) to the front
4130621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * of the stack.
4131621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
4132621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontLocked() {
4133621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord homeTask = null;
4134621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
41350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord hr = mHistory.get(i);
4136621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (hr.isHomeActivity) {
4137621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                homeTask = hr.task;
413894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                break;
4139621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
4140621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4141621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (homeTask != null) {
41428078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            moveTaskToFrontLocked(homeTask, null, null);
4143621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4144621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
4145621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
41467f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    final void updateTransitLocked(int transit, Bundle options) {
41477f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        if (options != null) {
41487f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
41497f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (r != null && r.state != ActivityState.RESUMED) {
41507f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                r.updateOptionsLocked(options);
41517f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
41527f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
41537f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
41547f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        }
41557f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        mService.mWindowManager.prepareAppTransition(transit, false);
41567f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    }
4157621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
41588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason, Bundle options) {
415950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
416050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
416150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int task = tr.taskId;
416250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size()-1;
416350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (top < 0 || (mHistory.get(top)).task.taskId == task) {
416550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // nothing to do!
41667f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (reason != null &&
41677f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                    (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
41687f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
41697f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
41707f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
41717f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
417450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4175be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
417650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
417750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Applying the affinities may have removed entries from the history,
417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // so get the size again.
417950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        top = mHistory.size()-1;
418050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = top;
418150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
418250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task up to the top
418350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
418450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos >= 0) {
41850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
418650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
418750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
418850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
418950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
419098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
419198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
419298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
419398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here);
419498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
419550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
419650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(top, r);
4197be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(0, r.appToken);
419850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                top--;
419950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
420050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos--;
420150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
420250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
420350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
420450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to front transition: task=" + tr);
420550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
420650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
42077da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
42087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
420950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
421050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
421150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
421250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
42138078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
421450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
42157f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
421650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
421750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
421850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToTop(moved);
421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4220be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
422150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
422250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
422350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task);
422550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
422650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
422750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void finishTaskMoveLocked(int task) {
422850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        resumeTopActivityLocked(null);
422950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
423050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
423150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
423250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Worker method for rearranging history stack.  Implements the function of moving all
423350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities for a specific task (gathering them if disjoint) into a single group at the
423450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * bottom of the stack.
423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
423650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * If a watcher is installed, the action is preflighted and the watcher has an opportunity
423750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to premeptively cancel the move.
423850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
423950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param task The taskId to collect and move to the bottom.
424050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the move completed, false if not.
424150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
424250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean moveTaskToBackLocked(int task, ActivityRecord reason) {
424350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Slog.i(TAG, "moveTaskToBack: " + task);
424450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
424550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we have a watcher, preflight the move before committing to it.  First check
424650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // for *other* available tasks, but if none are available, then try again allowing the
424750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current task to be selected.
424850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack && mService.mController != null) {
424950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord next = topRunningActivityLocked(null, task);
425050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next == null) {
425150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next = topRunningActivityLocked(null, 0);
425250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
425350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next != null) {
425450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // ask watcher if this is allowed
425550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean moveOK = true;
425650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
425750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    moveOK = mService.mController.activityResuming(next.packageName);
425850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
425950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
426050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
426150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!moveOK) {
426250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return false;
426350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
426450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
426550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
426650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4267be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to back transition: task=" + task);
427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
427350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int bottom = 0;
427450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = 0;
427550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task down to the bottom
427750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
427850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos < N) {
42790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
428050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
428150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
428250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
428350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
428498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
428598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
428698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
428798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at "
428898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            + bottom, here);
428998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
429050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
429150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(bottom, r);
4292be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(r.appToken);
429350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                bottom++;
429450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
429550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos++;
429650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
429750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
429850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
429950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
43007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
43017da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
430250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
430350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
430450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
430550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
430650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
43077da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
43087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
430950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
431050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToBottom(moved);
431150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4312be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
431350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
431450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
431550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
431650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
431750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
431850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
43190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) {
43200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
43210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
43220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (resumed != null && resumed.thumbHolder == tr) {
43230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
43240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        } else {
43250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = tr.lastThumbnail;
43260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return info;
43280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
43290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43309da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn    public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex,
43319da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            boolean taskRequired) {
43320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false);
43330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (info.root == null) {
43349da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
43359da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId);
43369da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
43370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
43380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex < 0) {
43410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            // Just remove the entire task.
43420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            performClearTaskAtIndexLocked(taskId, info.rootIndex);
43430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return info.root;
43440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex >= info.subtasks.size()) {
43479da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
43489da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex);
43499da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
43500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
43510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Remove all of this task's activies starting at the sub task.
43540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex);
43550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        performClearTaskAtIndexLocked(taskId, subtask.index);
43560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return subtask.activity;
43570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
43580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) {
43600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
43610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final TaskAccessInfo thumbs = new TaskAccessInfo();
43620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // How many different sub-thumbnails?
43630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final int NA = mHistory.size();
43640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        int j = 0;
43650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ThumbnailHolder holder = null;
43660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
43670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
43680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!ar.finishing && ar.task.taskId == taskId) {
43690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
43700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
43710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
43730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (j >= NA) {
43760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return thumbs;
43770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.root = mHistory.get(j);
43800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.rootIndex = j;
43810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
43830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.subtasks = subtasks;
43840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord lastActivity = null;
43850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
43860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
43870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
43880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.finishing) {
43890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
43900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.task.taskId != taskId) {
43920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
43930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            lastActivity = ar;
43950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.thumbHolder != holder && holder != null) {
43960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                thumbs.numSubThumbbails++;
43970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
43980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask();
43990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = holder.lastThumbnail;
44000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.activity = ar;
44010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.index = j-1;
44020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                subtasks.add(sub);
44030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
44040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (lastActivity != null && subtasks.size() > 0) {
44060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (resumed == lastActivity) {
44070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1);
44080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity);
44090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
44100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (thumbs.numSubThumbbails > 0) {
44120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            thumbs.retriever = new IThumbnailRetriever.Stub() {
44130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                public Bitmap getThumbnail(int index) {
44140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (index < 0 || index >= thumbs.subtasks.size()) {
44150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        return null;
44160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
44170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return thumbs.subtasks.get(index).thumbnail;
44180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
44190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            };
44200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return thumbs;
44220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
44230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
442450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void logStartActivity(int tag, ActivityRecord r,
442550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TaskRecord task) {
442650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(tag,
442750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r), task.taskId,
442850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.shortComponentName, r.intent.getAction(),
442950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getType(), r.intent.getDataString(),
443050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getFlags());
443150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
443250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
443350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
443450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure the given activity matches the current configuration.  Returns
443550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * false if the activity had to be destroyed.  Returns true if the
443650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * configuration is the same, or the activity will remain running as-is
443750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for whatever reason.  Ensures the HistoryRecord is updated with the
443850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * correct configuration and all other bookkeeping is handled.
443950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
444050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean ensureActivityConfigurationLocked(ActivityRecord r,
444150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int globalChanges) {
444250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mConfigWillChange) {
444350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
444450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Skipping config check (will change): " + r);
444550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
444650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
444750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
444850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
444950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Ensuring correct configuration: " + r);
445050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
445150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Short circuit: if the two configurations are the exact same
445250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // object (the common case), then there is nothing to do.
445350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration newConfig = mService.mConfiguration;
4454e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (r.configuration == newConfig && !r.forceNewConfig) {
445550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
445650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration unchanged in " + r);
445750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
445850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
445950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
446050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We don't worry about activities that are finishing.
446150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
446250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
446350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter in finishing " + r);
446450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
446550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
446650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
446750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
446850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Okay we now are going to make this activity have the new config.
446950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // But then we need to figure out how it needs to deal with that.
447050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration oldConfig = r.configuration;
447150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configuration = newConfig;
447258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
447358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Determine what has changed.  May be nothing, if this is a config
447458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // that has come back from the app after going idle.  In that case
447558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // we just want to leave the official config object now in the
447658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // activity and do nothing else.
447758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        final int changes = oldConfig.diff(newConfig);
447858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        if (changes == 0 && !r.forceNewConfig) {
447958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
448058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    "Configuration no differences in " + r);
448158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            return true;
448258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        }
448358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
448450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the activity isn't currently running, just leave the new
448550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration and it will pick that up next time it starts.
448650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app == null || r.app.thread == null) {
448750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
448850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter not running " + r);
448950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
4490e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
449150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
449250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
449350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
449458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Figure out how to handle the changes between the configurations.
44953c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
44963c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
44973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + Integer.toHexString(changes) + ", handles=0x"
4498e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn                    + Integer.toHexString(r.info.getRealConfigChanged())
44993c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + ", newConfig=" + newConfig);
45003c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        }
4501e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn        if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) {
45023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // Aha, the activity isn't handling the change, so DIE DIE DIE.
45033c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.configChangeFlags |= changes;
45043c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.startFreezingScreenLocked(r.app, globalChanges);
4505e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
45063c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            if (r.app == null || r.app.thread == null) {
45073c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4508b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is destroying non-running " + r);
450928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "config");
45103c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.PAUSING) {
45113c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // A little annoying: we are waiting for this activity to
45123c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // finish pausing.  Let's not do anything now, but just
45133c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // flag that it needs to be restarted when done pausing.
45143c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4515b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is skipping already pausing " + r);
45163c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configDestroy = true;
45173c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                return true;
45183c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.RESUMED) {
45193c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Try to optimize this case: the configuration is changing
45203c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // and we need to restart the top, resumed activity.
45213c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Instead of doing the normal handshaking, just say
45223c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // "restart!".
45233c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4524b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching resumed " + r);
45253c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, true);
45263c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
45273c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else {
45283c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4529b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching non-resumed " + r);
45303c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, false);
45313c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
453250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
45333c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn
45343c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // All done...  tell the caller we weren't able to keep this
45353c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // activity around.
45363c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            return false;
453750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
453850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
453950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Default case: the activity can handle this new configuration, so
454050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // hand it over.  Note that we don't need to give it the new
454150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration, since we always send configuration changes to all
454250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // process when they happen so it can just use whatever configuration
454350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // it last got.
454450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app != null && r.app.thread != null) {
454550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
454650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
4547be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleActivityConfigurationChanged(r.appToken);
454850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
454950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If process died, whatever.
455050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
455150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
455250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.stopFreezingScreenLocked(false);
455350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
455450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
455550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
455650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
455750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean relaunchActivityLocked(ActivityRecord r,
455850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int changes, boolean andResume) {
455950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<ResultInfo> results = null;
456050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<Intent> newIntents = null;
456150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
456250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            results = r.results;
456350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newIntents = r.newIntents;
456450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
456550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
456650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " with results=" + results + " newIntents=" + newIntents
456750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " andResume=" + andResume);
456850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
456950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
457050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName);
457150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
457250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(r.app, 0);
457350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
457450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
4575b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG,
4576b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ")
4577b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    + r);
4578e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
4579be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents,
4580813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    changes, !andResume, new Configuration(mService.mConfiguration));
458150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: don't need to call pauseIfSleepingLocked() here, because
458250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the caller will only pass in 'andResume' if this activity is
458350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // currently resumed, which implies we aren't sleeping.
458450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
4585b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, "Relaunch failed", e);
458650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
458750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
458850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
458950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.results = null;
459050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.newIntents = null;
459150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
459250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.reportResumedActivityLocked(r);
459350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
4594b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.RESUMED;
4595b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        } else {
4596b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
4597b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.PAUSED;
459850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
459950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
460050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
460150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
460290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
460390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguardOnNextActivityLocked() {
460490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        mDismissKeyguardOnNextActivity = true;
460590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
460650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn}
4607