ActivityStack.java revision 599db5c85faa5733af538a712b870e1f507cd380
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;
58742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
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>();
21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when the system is going to sleep, until we have
21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * successfully paused the current activity and released our wake lock.
21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * At that point the system is allowed to actually sleep.
21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mGoingToSleep;
22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * We don't want to allow the device to go to sleep while in the process
22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of launching an activity.  This is primarily to allow alarm intent
22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * receivers to launch an activity and get that to run before the device
22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * goes back to sleep.
22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mLaunchingActivity;
22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * When we are in the process of pausing an activity, before starting the
23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * next one, this variable holds the activity that is currently being paused.
23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
234621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    ActivityRecord mPausingActivity = null;
23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is the last activity that we put into the paused state.  This is
23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * used to determine if we need to do an activity transition while sleeping,
23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * when we normally hold the top activity paused.
24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mLastPausedActivity = null;
24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Current activity that is resumed, or null if there is none.
24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mResumedActivity = null;
24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
2490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * This is the last activity that has been started.  It is only used to
2500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * identify when multiple activities are started at once so that the user
2510dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * can be warned they may not be in the activity they think they are.
2520dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     */
2530dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    ActivityRecord mLastStartedActivity = null;
2540dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
2550dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    /**
25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when we know we are going to be calling updateConfiguration()
25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * soon, so want to skip intermediate config checks.
25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mConfigWillChange;
26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set to indicate whether to issue an onUserLeaving callback when a
26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * newly launched activity is being brought in front of us.
26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mUserLeaving = false;
26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    long mInitialStartTime = 0;
26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
2704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * Set when we have taken too long waiting to go to sleep.
2714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
2724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    boolean mSleepTimeout = false;
2734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
27490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    /**
27590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     * Dismiss the keyguard after the next activity is displayed?
27690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     */
27790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    boolean mDismissKeyguardOnNextActivity = false;
27890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
2790aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailWidth = -1;
2800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailHeight = -1;
2810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
282742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private int mCurrentUser;
283742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG;
28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
29129ba7e66804e91cbd05fed74893061b4971ec52bDianne Hackborn    static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7;
292162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 8;
293755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 9;
294755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
295755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static class ScheduleDestroyArgs {
296755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final ProcessRecord mOwner;
297755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final boolean mOomAdj;
298755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final String mReason;
299755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        ScheduleDestroyArgs(ProcessRecord owner, boolean oomAdj, String reason) {
300755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOwner = owner;
301755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOomAdj = oomAdj;
302755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mReason = reason;
303755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        }
304755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
305755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Handler mHandler = new Handler() {
30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //public Handler() {
30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //}
31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        public void handleMessage(Message msg) {
31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            switch (msg.what) {
3134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                case SLEEP_TIMEOUT_MSG: {
3148e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    synchronized (mService) {
3158e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        if (mService.isSleeping()) {
3168e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
3178e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            mSleepTimeout = true;
3188e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            checkReadyForSleepLocked();
3198e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        }
3204eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    }
3214eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } break;
32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case PAUSE_TIMEOUT_MSG: {
323be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
326be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity pause timeout for " + r);
3272a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3282a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.app != null) {
3292a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.pauseTime,
3302a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "pausing " + r);
3312a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3322a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3332a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
334be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityPaused(r != null ? r.appToken : null, true);
33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_TIMEOUT_MSG: {
33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        nmsg.obj = msg.obj;
34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
346be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
347be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity idle timeout for " + r);
348be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, true, null);
34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
3502a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                case LAUNCH_TICK_MSG: {
3512a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
3522a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3532a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.continueLaunchTickingLocked()) {
3542a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.launchTickTime,
3552a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "launching " + r);
3562a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3572a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3582a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                } break;
35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case DESTROY_TIMEOUT_MSG: {
360be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
363be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity destroy timeout for " + r);
364be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityDestroyed(r != null ? r.appToken : null);
36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_NOW_MSG: {
367be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
368be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, false, null);
36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case LAUNCH_TIMEOUT_MSG: {
37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT);
37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mLaunchingActivity.isHeld()) {
37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mLaunchingActivity.release();
38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case RESUME_TOP_ACTIVITY_MSG: {
38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
389162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                case STOP_TIMEOUT_MSG: {
390162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
391162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
392162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // so we need to be conservative and assume it isn't.
393162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    Slog.w(TAG, "Activity stop timeout for " + r);
394162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    synchronized (mService) {
395162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        if (r.isInHistory()) {
396162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            activityStoppedLocked(r, null, null, null);
397162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        }
398162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
399162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } break;
400755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                case DESTROY_ACTIVITIES_MSG: {
401755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj;
402755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    synchronized (mService) {
403755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        destroyActivitiesLocked(args.mOwner, args.mOomAdj, args.mReason);
404755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    }
405755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                }
40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    };
40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService = service;
41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mContext = context;
41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mMainStack = mainStack;
41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PowerManager pm =
41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            (PowerManager)context.getSystemService(Context.POWER_SERVICE);
41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity.setReferenceCounted(false);
41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
422742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && r != notTop) {
42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
435742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && !r.delayedResume && r != notTop) {
44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is a simplified version of topRunningActivityLocked that provides a number of
44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param token If non-null, any history records matching this token will be skipped.
45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns the HistoryRecord of the next activity on the stack.
45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
457742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: the taskId check depends on real taskId fields being non-zero
462be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) {
46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int indexOfTokenLocked(IBinder token) {
471be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(ActivityRecord.forToken(token));
472be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
473be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
474be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final int indexOfActivityLocked(ActivityRecord r) {
475be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(r);
476ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
478ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final ActivityRecord isInStackLocked(IBinder token) {
479be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ActivityRecord r = ActivityRecord.forToken(token);
480be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        if (mHistory.contains(r)) {
481be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return r;
482ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
483ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        return null;
48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean updateLRUListLocked(ActivityRecord r) {
48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadit = mLRUActivities.remove(r);
48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLRUActivities.add(r);
48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return hadit;
49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the top activity in any existing task matching the given
49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Intent.  Returns null if no such task is found.
49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        TaskRecord cp = null;
50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
504742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
508742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (!r.finishing && r.task != cp && r.userId == userId
50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                cp = r.task;
51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + "/aff=" + r.task.affinity + " to new cls="
51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.task.affinity != null) {
51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.task.affinity.equals(info.taskAffinity)) {
51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        //Slog.i(TAG, "Found matching affinity!");
51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return r;
51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.intent != null
52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.intent.getComponent().equals(cls)) {
52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.affinityIntent != null
52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.affinityIntent.getComponent().equals(cls)) {
52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the first activity (starting from the top of the stack) that
54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is the same as the given activity.  Returns null if no such activity
54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is found.
54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
548742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
554742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.intent.getComponent().equals(cls) && r.userId == userId) {
55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    final void showAskCompatModeDialogLocked(ActivityRecord r) {
56736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        Message msg = Message.obtain();
56836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
56936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.obj = r.task.askedCompatMode ? null : r;
57036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        mService.mHandler.sendMessage(msg);
57136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    }
57236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn
573742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /*
574742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * Move the activities around in the stack to bring a user to the foreground.
575742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * @return whether there are any activities for the specified user.
576742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     */
577742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    final boolean switchUser(int userId) {
578742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        synchronized (mService) {
579742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mCurrentUser = userId;
580742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
581742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Only one activity? Nothing to do...
582742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (mHistory.size() < 2)
583742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return false;
584742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
585742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            boolean haveActivities = false;
586742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Check if the top activity is from the new user.
587742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ActivityRecord top = mHistory.get(mHistory.size() - 1);
588742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (top.userId == userId) return true;
589742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Otherwise, move the user's activities to the top.
590742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int N = mHistory.size();
591742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int i = 0;
592742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            while (i < N) {
593742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                ActivityRecord r = mHistory.get(i);
594742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.userId == userId) {
595742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    ActivityRecord moveToTop = mHistory.remove(i);
596742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mHistory.add(moveToTop);
597742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // No need to check the top one now
598742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    N--;
599742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    haveActivities = true;
600742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                } else {
601742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    i++;
602742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                }
603742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
604742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Transition from the old top to the new top
605742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            resumeTopActivityLocked(top);
606742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return haveActivities;
607742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
608742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
609742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean realStartActivityLocked(ActivityRecord r,
61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord app, boolean andResume, boolean checkConfig)
61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throws RemoteException {
61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(app, 0);
615be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.setAppVisibility(r.appToken, true);
61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6172a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        // schedule launch ticks to collect information about slow apps.
6182a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.startLaunchTickingLocked();
6192a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Have the window manager re-evaluate the orientation of
62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the screen based on the new activity order.  Note that
62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // as a result of this, it can call back into the activity
62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // manager with a new orientation.  We don't care about that,
62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because the activity is not currently running so we are
62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // just restarting it anyway.
62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (checkConfig) {
62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mConfiguration,
629be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
630813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn            mService.updateConfigurationLocked(config, r, false, false);
63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.app = app;
6340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        app.waitingToKill = null;
63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Launching: " + r);
63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int idx = app.activities.indexOf(r);
63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (idx < 0) {
64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.add(r);
64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateLruProcessLocked(app, true, true);
64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (app.thread == null) {
64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                throw new RemoteException();
64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<ResultInfo> results = null;
64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<Intent> newIntents = null;
65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                results = r.results;
65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                newIntents = r.newIntents;
65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " icicle=" + r.icicle
65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " with results=" + results + " newIntents=" + newIntents
65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " andResume=" + andResume);
65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(r),
66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.task.taskId, r.shortComponentName);
66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.isHomeActivity) {
66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mHomeProcess = app;
66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
6674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.sleeping = false;
668e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
66936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn            showAskCompatModeDialogLocked(r);
6708ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
67162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile = null;
67262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            ParcelFileDescriptor profileFd = null;
67362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean profileAutoStop = false;
67462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
67562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (mService.mProfileProc == null || mService.mProfileProc == app) {
67662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.mProfileProc = app;
67762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFile = mService.mProfileFile;
67862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = mService.mProfileFd;
67962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop = mService.mAutoStopProfiler;
68062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
68162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
682f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn            app.hasShownUi = true;
683c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            app.pendingUiClean = true;
68462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFd != null) {
68562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                try {
68662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = profileFd.dup();
68762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                } catch (IOException e) {
68862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = null;
68962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
69062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
691be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
692813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    System.identityHashCode(r), r.info,
693813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    new Configuration(mService.mConfiguration),
69458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    r.compat, r.icicle, results, newIntents, !andResume,
69562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.isNextTransitionForward(), profileFile, profileFd,
69662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop);
69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
69854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Note that the package
70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // manager will ensure that only activity can run in the main
70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // process of the .apk, which is the only thing that will be
70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // considered heavy-weight.
70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (app.processName.equals(app.info.packageName)) {
70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null
70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && mService.mHeavyWeightProcess != app) {
70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Log.w(TAG, "Starting new heavy weight process " + app
70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " when already running "
70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + mService.mHeavyWeightProcess);
70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = app;
71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Message msg = mService.mHandler.obtainMessage(
71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    msg.obj = r;
71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendMessage(msg);
71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.launchFailed) {
72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second time we failed -- finish activity
72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and give up.
72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.e(TAG, "Second failure launching "
72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + r.intent.getComponent().flattenToShortString()
72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + ", giving up", e);
72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.appDiedLocked(app, app.pid, app.thread);
726be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "2nd-crash");
72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return false;
72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This is the first time we failed -- restart process and
73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // retry.
73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.remove(r);
73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw e;
73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.launchFailed = false;
73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (updateLRUListLocked(r)) {
73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r
74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                  + " being launched, but already in LRU list");
74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // As part of the process of launching, ActivityThread also performs
74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // a resume.
74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.RESUMED;
747ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r
748ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting new instance)");
74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = false;
75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = r;
75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.task.touchActiveTime();
75288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
75388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(r.task);
75488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            completeResumeLocked(r);
7564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
75798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
75898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.icicle = null;
75998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.haveState = false;
76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not starting in the resumed state... which
76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should look like we asked it to pause+stop (but remain visible),
76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and it has done so and reported back the current icicle and
76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // other state.
765ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
766ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting in stopped state)");
76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPED;
76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = true;
76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Launch the new version setup screen if needed.  We do this -after-
77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // launching the initial activity (that is, home), so that it can have
77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a chance to initialize itself while in the background, making the
77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // switch back to it faster and look better.
77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.startSetupActivityLocked();
77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startSpecificActivityLocked(ActivityRecord r,
78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean andResume, boolean checkConfig) {
78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Is this activity's application already running?
78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.info.applicationInfo.uid);
78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7880dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        if (r.launchTime == 0) {
7890dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            r.launchTime = SystemClock.uptimeMillis();
79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mInitialStartTime == 0) {
7910dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mInitialStartTime = r.launchTime;
79250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mInitialStartTime == 0) {
79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mInitialStartTime = SystemClock.uptimeMillis();
79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (app != null && app.thread != null) {
79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
7996c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                app.addPackage(r.info.packageName);
80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                realStartActivityLocked(r, app, andResume, checkConfig);
80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
80250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception when starting activity "
80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + r.intent.getComponent().flattenToShortString(), e);
80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If a dead object exception was thrown -- fall through to
80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // restart the application.
80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
812a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn                "activity", r.intent.getComponent(), false, false);
81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void stopIfSleepingLocked() {
8164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.isSleeping()) {
81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mGoingToSleep.isHeld()) {
81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mGoingToSleep.acquire();
81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mLaunchingActivity.isHeld()) {
82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
8244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG);
8264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT);
8274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void awakeFromSleepingLocked() {
8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mSleepTimeout = false;
8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
8354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        // Ensure activities are no longer sleeping.
8384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
8390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
8404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.setSleeping(false);
8414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.clear();
8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void activitySleptLocked(ActivityRecord r) {
8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        checkReadyForSleepLocked();
8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void checkReadyForSleepLocked() {
8514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mService.isSleeping()) {
8524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Do not care.
8534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            return;
8544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mSleepTimeout) {
8574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mResumedActivity != null) {
8584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still have something resumed; can't sleep until it is paused.
8594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity);
86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, true);
8624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
864621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity != null) {
8654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still waiting for something to pause; can't sleep yet.
866621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity);
8674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mStoppingActivities.size() > 0) {
8714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to stop; can't sleep yet.
8724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
8734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mStoppingActivities.size() + " activities");
87480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                scheduleIdleLocked();
8754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            ensureActivitiesVisibleLocked(null, 0);
8794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Make sure any stopped but visible activities are now sleeping.
8814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // This ensures that the activity's onStop() is called.
8824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            for (int i=mHistory.size()-1; i>=0; i--) {
8830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord r = mHistory.get(i);
8844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
8854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
8864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
8874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mGoingToSleepActivities.size() > 0) {
8904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to sleep; can't sleep yet.
8914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
8924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mGoingToSleepActivities.size() + " activities");
8934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
8964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
9004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
9014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
9024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.mShuttingDown) {
9034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mService.notifyAll();
9044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
90659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
907d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public final Bitmap screenshotActivities(ActivityRecord who) {
908ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        if (who.noDisplay) {
909ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn            return null;
910ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        }
911ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn
9120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Resources res = mService.mContext.getResources();
9130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int w = mThumbnailWidth;
9140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int h = mThumbnailHeight;
9150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w < 0) {
9160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailWidth = w =
9170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
9180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailHeight = h =
9190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
9200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
9220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w > 0) {
92359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            return mService.mWindowManager.screenshotApplications(who.appToken,
92459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                    Display.DEFAULT_DISPLAY, w, h);
9250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return null;
9270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
9280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
930621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
931621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            RuntimeException e = new RuntimeException();
932621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            Slog.e(TAG, "Trying to pause when pause is already pending for "
933621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                  + mPausingActivity, e);
934621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord prev = mResumedActivity;
93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev == null) {
93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            RuntimeException e = new RuntimeException();
93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
942ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);
943ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mResumedActivity = null;
945621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        mPausingActivity = prev;
94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLastPausedActivity = prev;
94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.state = ActivityState.PAUSING;
94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.task.touchActiveTime();
949f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        prev.updateThumbnail(screenshotActivities(prev), null);
95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateCpuStats();
95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.app.thread != null) {
95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(prev),
95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        prev.shortComponentName);
959be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
960be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        userLeaving, prev.configChangeFlags);
96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.updateUsageStats(prev, false);
96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Ignore exception, if process died other code will cleanup.
96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
967621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                mPausingActivity = null;
96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mLastPausedActivity = null;
96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
971621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLastPausedActivity = null;
97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not going to sleep, we want to ensure the device is
97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // awake until the next activity is started.
97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mService.mSleeping && !mService.mShuttingDown) {
97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLaunchingActivity.acquire();
97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // To be safe, don't allow the wake lock to be held for too long.
98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT);
98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
986621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
987621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager pause its key dispatching until the new
98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity has started.  If we're pausing the activity just because
99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen is being turned off and the UI is sleeping, don't interrupt
99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // key dispatch; the same activity will pick it up again on wakeup.
99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!uiSleeping) {
993621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev.pauseKeyDispatchingLocked();
99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Schedule a pause timeout in case the app doesn't respond.
99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We don't give it much time because this directly impacts the
100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // responsiveness seen by the user.
100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = prev;
10032a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            prev.pauseTime = SystemClock.uptimeMillis();
100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity failed to schedule the
100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // pause, so just treat it as being paused now.
100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
1010621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(null);
101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
10140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    final void activityPaused(IBinder token, boolean timeout) {
101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(
10160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = null;
101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(token);
102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
10230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                r = mHistory.get(index);
102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
1025621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (mPausingActivity == r) {
1026ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
1027ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                            + (timeout ? " (due to timeout)" : " (pause complete)"));
102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.state = ActivityState.PAUSED;
1029621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    completePauseLocked();
103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            System.identityHashCode(r), r.shortComponentName,
1033621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            mPausingActivity != null
1034621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                                ? mPausingActivity.shortComponentName : "(none)");
103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1040ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail,
1041ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            CharSequence description) {
1042b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        if (r.state != ActivityState.STOPPING) {
1043b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            Slog.i(TAG, "Activity reported stop, but no longer stopping: " + r);
1044b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1045b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            return;
1046b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        }
104798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle);
1048162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (icicle != null) {
1049162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // If icicle is null, this is happening due to a timeout, so we
1050162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // haven't really saved the state.
1051162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.icicle = icicle;
1052162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.haveState = true;
1053162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.updateThumbnail(thumbnail, description);
1054162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        }
1055162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (!r.stopped) {
1056162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
1057162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1058162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.stopped = true;
1059162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.state = ActivityState.STOPPED;
10606e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            if (r.finishing) {
10616e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn                r.clearOptionsLocked();
10626e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            } else {
1063162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                if (r.configDestroy) {
1064162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    destroyActivityLocked(r, true, false, "stop-config");
1065162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    resumeTopActivityLocked(null);
1066162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } else {
1067162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // Now that this process has stopped, we may want to consider
1068162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // it to be the previous app to try to keep around in case
1069162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // the user wants to return to it.
1070162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ProcessRecord fgApp = null;
1071162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (mResumedActivity != null) {
1072162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mResumedActivity.app;
1073162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    } else if (mPausingActivity != null) {
1074162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mPausingActivity.app;
1075162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
1076162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (r.app != null && fgApp != null && r.app != fgApp
1077162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
1078162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.app != mService.mHomeProcess) {
1079162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcess = r.app;
1080162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
1081162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
108250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
1083ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1084ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
1085ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
1086ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
1087621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    private final void completePauseLocked() {
1088621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        ActivityRecord prev = mPausingActivity;
108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1091621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1092621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (prev.finishing) {
1093621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
1094621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
1095621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else if (prev.app != null) {
1096621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
1097621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.waitingVisible) {
1098621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    prev.waitingVisible = false;
1099621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mWaitingVisibleActivities.remove(prev);
1100621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
1101621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            TAG, "Complete pause, no longer waiting: " + prev);
1102621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                }
1103621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.configDestroy) {
1104621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // The previous is being paused because the configuration
1105621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // is changing, which means it is actually stopping...
1106621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // To juggle the fact that we are also starting a new
1107621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // instance right now, we need to first completely stop
1108621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // the current instance before starting the new one.
1109621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
1110621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    destroyActivityLocked(prev, true, false, "pause-config");
111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
1112621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mStoppingActivities.add(prev);
1113621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (mStoppingActivities.size() > 3) {
1114621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // If we already have a few activities waiting to stop,
1115621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // then give up on things going idle and start clearing
1116621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // them out.
1117621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
1118621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        scheduleIdleLocked();
1119621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    } else {
1120621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        checkReadyForSleepLocked();
1121621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    }
112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1123621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else {
1124621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
1125621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = null;
112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
1127621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1130621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (!mService.isSleeping()) {
1131621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(prev);
1132621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        } else {
11334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
113442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            if (topRunningActivityLocked(null) == null) {
113542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                // If there are no more activities available to run, then
113642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                // do resume anyway to start something.
113742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
113842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1140621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
1141621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1142621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            prev.resumeKeyDispatchingLocked();
1143621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.cpuTimeAtResume > 0
114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mService.mBatteryStatsService.isOnBattery()) {
114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long diff = 0;
114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid)
115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        - prev.cpuTimeAtResume;
115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (diff > 0) {
115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (bsi) {
115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    BatteryStatsImpl.Uid.Proc ps =
115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            prev.info.packageName);
115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (ps != null) {
115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ps.addForegroundTimeLocked(diff);
116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.cpuTimeAtResume = 0; // reset it
116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Once we know that we have asked an application to put an activity in
116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the resumed state (either by launching it or explicitly telling it),
117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * this function updates the rest of our state to match that fact.
117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void completeResumeLocked(ActivityRecord next) {
117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.idle = false;
117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.results = null;
117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.newIntents = null;
117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // schedule an idle timeout in case the app doesn't do it for us.
117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        msg.obj = next;
118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (false) {
118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity was never told to pause, so just keep
118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // things going as-is.  To maintain our own state,
118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we need to emulate it coming back and saying it is
118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // idle.
118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg = mHandler.obtainMessage(IDLE_NOW_MSG);
118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = next;
118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessage(msg);
119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.reportResumedActivityLocked(next);
119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1196f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        next.clearThumbnail();
119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.setFocusedActivityLocked(next);
119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1200621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        next.resumeKeyDispatchingLocked();
120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ensureActivitiesVisibleLocked(null, 0);
120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.executeAppTransition();
120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mNoAnimActivities.clear();
120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Mark the point when the activity is resuming
120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // TODO: To be more accurate, the mark should be before the onCreate,
120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //       not after the onResume. But for subsequent starts, onResume is fine.
120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null) {
120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process
121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure that all activities that need to be visible (that is, they
121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * currently can be seen by the user) actually are.
122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord top,
122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord starting, String onlyThisProcess, int configChanges) {
122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_VISBILITY) Slog.v(
122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "ensureActivitiesVisible behind " + top
122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " configChanges=0x" + Integer.toHexString(configChanges));
122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is not fullscreen, then we need to
122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure any activities under it are now visible.
122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int count = mHistory.size();
123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = count-1;
123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (mHistory.get(i) != top) {
123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r;
123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean behindFullscreen = false;
123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (; i>=0; i--) {
12370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make visible? " + r + " finishing=" + r.finishing
124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state);
124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean doThisProcess = onlyThisProcess == null
124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || onlyThisProcess.equals(r.processName);
124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // First: if this is not the current activity being started, make
124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // sure it matches the current configuration.
125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != starting && doThisProcess) {
125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivityConfigurationLocked(r, 0);
125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == null || r.app.thread == null) {
125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (onlyThisProcess == null
125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        || onlyThisProcess.equals(r.processName)) {
125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // This activity needs to be visible, but isn't even
125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // running...  get it started, but don't resume it
125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // at this point.
126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Start and freeze screen for " + r);
126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.startFreezingScreenLocked(r.app, configChanges);
126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!r.visible) {
126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Starting and making visible: " + r);
1268be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        startSpecificActivityLocked(r, false, false);
127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (r.visible) {
127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is already visible, then there is nothing
127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // else to do here.
127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Skipping: already visible at " + r);
128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopFreezingScreenLocked(false);
128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (onlyThisProcess == null) {
128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This activity is not currently visible, but is running.
128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Tell it to become visible.
128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.visible = true;
128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state != ActivityState.RESUMED && r != starting) {
128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is paused, tell it
128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to now show its window.
128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Making visible and scheduling visibility: " + r);
129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    try {
1292be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
12934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        r.sleeping = false;
1294905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                        r.app.pendingUiClean = true;
1295be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.app.thread.scheduleWindowVisibility(r.appToken, true);
129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.stopFreezingScreenLocked(false);
129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } catch (Exception e) {
129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Just skip on any failure; we'll make it
129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // visible when it next restarts.
130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Slog.w(TAG, "Exception thrown making visibile: "
130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + r.intent.getComponent(), e);
130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Aggregate current change flags.
130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            configChanges |= r.configChangeFlags;
130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.fullscreen) {
131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // At this point, nothing else needs to be shown
131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping: fullscreen at " + r);
131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                behindFullscreen = true;
131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now for any activities that aren't visible to the user, make
132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // sure they no longer are keeping the screen frozen.
132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
13220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state
132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " behindFullscreen=" + behindFullscreen);
132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (behindFullscreen) {
132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.visible) {
133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Making invisible: " + r);
133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.visible = false;
133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
1334be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppVisibility(r.appToken, false);
133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if ((r.state == ActivityState.STOPPING
133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    || r.state == ActivityState.STOPPED)
133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    && r.app != null && r.app.thread != null) {
133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (DEBUG_VISBILITY) Slog.v(
133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        TAG, "Scheduling invisibility: " + r);
1340be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                r.app.thread.scheduleWindowVisibility(r.appToken, false);
134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (Exception e) {
134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Just skip on any failure; we'll make it
134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // visible when it next restarts.
134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Exception thrown making hidden: "
134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + r.intent.getComponent(), e);
134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Already invisible: " + r);
135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.fullscreen) {
135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Now behindFullscreen: " + r);
135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    behindFullscreen = true;
135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Version of ensureActivitiesVisible that can easily be called anywhere.
136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord starting,
136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int configChanges) {
136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = topRunningActivityLocked(null);
136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r != null) {
136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ensureActivitiesVisibleLocked(r, starting, null, configChanges);
137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Ensure that the top activity in the stack is resumed.
137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param prev The previously resumed activity, for when in the process
137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of pausing; can be null to call from elsewhere.
137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if something is being resumed, or false if
138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * nothing happened.
138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev) {
138384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        return resumeTopActivityLocked(prev, null);
138484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    }
138584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
138684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Find the first activity that is not finishing.
138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord next = topRunningActivityLocked(null);
138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remember how we'll process this pause/resume situation, and ensure
139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the state is reset however we wind up proceeding.
139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean userLeaving = mUserLeaving;
139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = false;
139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next == null) {
139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are no more activities!  Let's just start up the
139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Launcher...
139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
139984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                ActivityOptions.abort(options);
1400742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return mService.startHomeActivityLocked(0);
140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.delayedResume = false;
140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is the resumed one, nothing to do.
140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == next && next.state == ActivityState.RESUMED) {
140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
141284375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are sleeping, and there is no resumed activity, and the top
141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity is paused, well that is the state we want.
141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((mService.mSleeping || mService.mShuttingDown)
1419dbad287b62966399d0d5029f3b10932895010337p                && mLastPausedActivity == next
1420dbad287b62966399d0d5029f3b10932895010337p                && (next.state == ActivityState.PAUSED
1421dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPED
1422dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPING)) {
142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
142784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // The activity may be waiting for stop, but that is no longer
143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // appropriate for it.
143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(next);
14344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(next);
14354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        next.sleeping = false;
143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(next);
143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
143884375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        next.updateOptionsLocked(options);
143984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1442621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // If we are currently pausing an activity, then don't do anything
1443621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // until that is done.
1444621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
1445621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity);
1446621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            return false;
1447621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
1448621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
14490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // Okay we are now going to start a switch, to 'next'.  We may first
14500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // have to pause the current activity, but this is an important point
14510dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // where we have decided to go to 'next' so keep track of that.
1452034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // XXX "App Redirected" dialog is getting too many false positives
1453034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // at this point, so turn off for now.
1454034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        if (false) {
1455034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn            if (mLastStartedActivity != null && !mLastStartedActivity.finishing) {
1456034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                long now = SystemClock.uptimeMillis();
1457034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final boolean inTime = mLastStartedActivity.startTime != 0
1458034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && (mLastStartedActivity.startTime + START_WARN_TIME) >= now;
1459034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int lastUid = mLastStartedActivity.info.applicationInfo.uid;
1460034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int nextUid = next.info.applicationInfo.uid;
1461034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                if (inTime && lastUid != nextUid
1462034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && lastUid != next.launchedFromUid
1463034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && mService.checkPermission(
1464034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                android.Manifest.permission.STOP_APP_SWITCHES,
1465034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                -1, next.launchedFromUid)
1466034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
1467034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mService.showLaunchWarningLocked(mLastStartedActivity, next);
1468034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                } else {
1469034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    next.startTime = now;
1470034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mLastStartedActivity = next;
1471034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                }
14720dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            } else {
1473034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                next.startTime = SystemClock.uptimeMillis();
14740dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mLastStartedActivity = next;
14750dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            }
14760dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        }
14770dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We need to start pausing the current activity so the top one
147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can be resumed...
148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity != null) {
148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startPausingLocked(userLeaving, false);
148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1486d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // If the most recent activity was noHistory but was only stopped rather
1487d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // than stopped+finished because the device went to sleep, we need to make
1488d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // sure to finish it as we're making a new activity topmost.
1489d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        final ActivityRecord last = mLastPausedActivity;
1490d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (mService.mSleeping && last != null && !last.finishing) {
1491d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            if ((last.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
1492d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    || (last.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
1493d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (DEBUG_STATES) {
1494d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    Slog.d(TAG, "no-history finish of " + last + " on new resume");
1495d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
1496d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null,
1497d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                "no-history");
1498d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            }
1499d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        }
1500d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate
150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null && prev != next) {
150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!prev.waitingVisible && next != null && !next.nowVisible) {
150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                prev.waitingVisible = true;
150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.add(prev);
150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(
150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Resuming top, waiting visible to hide: " + prev);
150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The next activity is already visible, so hide the previous
150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity's windows right now so we can show the new one ASAP.
151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We only do this if the previous is finishing, which should mean
151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it is on top of the one being resumed so hiding it quickly
151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is good.  Otherwise, we want to do the normal route of allowing
151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the resumed activity to be shown so we can decide if the
151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // previous should actually be hidden depending on whether the
151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // new one is found to be full-screen or not.
151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev.finishing) {
1517be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(prev.appToken, false);
151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + prev + ", waitingVisible="
152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + (prev != null ? prev.waitingVisible : null)
152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + ", nowVisible=" + next.nowVisible);
152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + prev + ", waitingVisible="
152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + (prev != null ? prev.waitingVisible : null)
152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", nowVisible=" + next.nowVisible);
152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1531e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Launching this app's activity, make sure the app is no longer
1532e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // considered stopped.
1533e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        try {
1534e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            AppGlobals.getPackageManager().setPackageStoppedState(
1535483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    next.packageName, false, next.userId); /* TODO: Verify if correct userid */
1536e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } catch (RemoteException e1) {
1537a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn        } catch (IllegalArgumentException e) {
1538a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn            Slog.w(TAG, "Failed trying to unstop package "
1539a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn                    + next.packageName + ": " + e);
1540e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
1541e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are starting up the next activity, so tell the window manager
154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the previous one will be hidden soon.  This way it can know
154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to ignore it when computing the desired screen orientation.
15457a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        boolean noAnim = false;
154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null) {
154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (prev.finishing) {
154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare close transition: prev=" + prev);
155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(prev)) {
15517da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
15527da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
15567da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1558be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1559be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare open transition: prev=" + prev);
156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(next)) {
15647a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    noAnim = true;
15657da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
15667da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
15707da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (false) {
1574be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1575be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mHistory.size() > 1) {
157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: no previous");
158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mNoAnimActivities.contains(next)) {
15817a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                noAnim = true;
15827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
15837da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, false);
158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
15857da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
15867da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
15897a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        if (!noAnim) {
15907a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.applyOptionsLocked();
15917a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        } else {
15927a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.clearOptionsLocked();
15937a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        }
159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null && next.app.thread != null) {
159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is now becoming visible.
1599be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(next.appToken, true);
160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16012a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            // schedule launch ticks to collect information about slow apps.
16022a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            next.startLaunchTickingLocked();
16032a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord lastResumedActivity = mResumedActivity;
160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityState lastState = next.state;
160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateCpuStats();
160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1609ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.state = ActivityState.RESUMED;
161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = next;
161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.task.touchActiveTime();
161388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
161488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(next.task);
161588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateLruProcessLocked(next.app, true, true);
161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            updateLRUListLocked(next);
161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager re-evaluate the orientation of
162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen based on the new activity order.
162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean updated = false;
162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (mService) {
162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mConfiguration,
1626be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null);
162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (config != null) {
162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.frozenBeforeDestroy = true;
162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
1630813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    updated = mService.updateConfigurationLocked(config, next, false, false);
163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!updated) {
163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The configuration update wasn't able to keep the existing
163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity, and instead started a new one.
163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We should be all done, but let's just make sure our activity
163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is still at the top and schedule another run if something
163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // weird happened.
163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord nextNext = topRunningActivityLocked(null);
164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG,
164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Activity config changed during resume: " + next
164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", new next: " + nextNext);
164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (nextNext != next) {
164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Do over!
164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(next);
164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.executeAppTransition();
165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.clear();
165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Deliver all pending results.
165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList a = next.results;
165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (a != null) {
166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final int N = a.size();
166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!next.finishing && N > 0) {
166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_RESULTS) Slog.v(
166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Delivering results to " + next
166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + ": " + a);
1665be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        next.app.thread.scheduleSendResult(next.appToken, a);
166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (next.newIntents != null) {
1670be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(next),
167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.task.taskId, next.shortComponentName);
167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                next.sleeping = false;
167836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn                showAskCompatModeDialogLocked(next);
1679905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                next.app.pendingUiClean = true;
1680be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                next.app.thread.scheduleResumeActivity(next.appToken,
168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.isNextTransitionForward());
168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                checkReadyForSleepLocked();
168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Whoops, need to restart this activity!
1687ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to "
1688ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + lastState + ": " + next);
168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.state = lastState;
169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mResumedActivity = lastResumedActivity;
169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.i(TAG, "Restarting because process died: " + next);
169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!next.hasBeenLaunched) {
169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.hasBeenLaunched = true;
169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (SHOW_APP_STARTING_PREVIEW && mMainStack) {
169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mWindowManager.setAppStartingWindow(
1697be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                next.appToken, next.packageName, next.theme,
16982f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                mService.compatibilityInfoForPackageLocked(
16992f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                        next.info.applicationInfo),
170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                next.nonLocalizedLabel,
17017eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                next.labelRes, next.icon, next.windowFlags,
17027eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                null, true);
170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startSpecificActivityLocked(next, true, false);
170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // From this point on, if something goes wrong there is no way
171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to recover the activity.
171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.visible = true;
171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                completeResumeLocked(next);
171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If any exception gets thrown, toss away this
171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity and try the next one.
171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during resume of " + next, e);
1718be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "resume-exception");
172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Didn't need to use the icicle, and it is now out of date.
172498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next);
172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.icicle = null;
172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.haveState = false;
172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.stopped = false;
172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Whoops, need to restart this activity!
173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!next.hasBeenLaunched) {
173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.hasBeenLaunched = true;
173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (SHOW_APP_STARTING_PREVIEW) {
173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.setAppStartingWindow(
1736be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.appToken, next.packageName, next.theme,
17372f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            mService.compatibilityInfoForPackageLocked(
17382f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                    next.info.applicationInfo),
173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            next.nonLocalizedLabel,
17407eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            next.labelRes, next.icon, next.windowFlags,
17417eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            null, true);
174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startSpecificActivityLocked(next, true, true);
174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startActivityLocked(ActivityRecord r, boolean newTask,
17527a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            boolean doResume, boolean keepCurTransition, Bundle options) {
175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int NH = mHistory.size();
175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int addPos = -1;
175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!newTask) {
175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If starting in an existing task, find where that is...
175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean startIt = true;
176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (int i = NH-1; i >= 0; i--) {
17610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord p = mHistory.get(i);
176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.finishing) {
176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    continue;
176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.task == r.task) {
176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Here it is!  Now, if this is not yet visible to the
176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // user, then just add it without starting; it will
176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // get started when the user navigates back to it.
176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    addPos = i+1;
177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!startIt) {
177198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
177298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
177398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
177498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos,
177598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    here);
177698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(addPos, r);
1778f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        r.putInHistory();
1779be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                r.info.screenOrientation, r.fullscreen);
178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
1782be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
17848078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        ActivityOptions.abort(options);
178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    break;
178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.fullscreen) {
179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    startIt = false;
179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Place a new activity at top of stack, so it is next to interact
179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // with the user.
179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < 0) {
17980dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            addPos = NH;
179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not placing the new activity frontmost, we do not want
180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to deliver the onUserLeaving callback to the actual frontmost
180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity
180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < NH) {
180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mUserLeaving = false;
180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Slot the activity into the history stack and proceed
181098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
181198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
181298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
181398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here);
181498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(addPos, r);
1816f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        r.putInHistory();
181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frontOfTask = newTask;
181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (NH > 0) {
181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We want to show the starting preview window if we are
182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // switching to a new task, or the next activity's process is
182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // not currently running.
182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean showStartingIcon = newTask;
182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord proc = r.app;
182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null) {
182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null || proc.thread == null) {
182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                showStartingIcon = true;
182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: starting " + r);
183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
18337da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
18347da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(newTask
183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? WindowManagerPolicy.TRANSIT_TASK_OPEN
18397da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
18427a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            r.updateOptionsLocked(options);
184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.addAppToken(
1844be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen);
184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean doShow = true;
184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (newTask) {
184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Even though this activity is starting fresh, we still need
184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to reset it to make sure we apply affinities to move any
184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // existing activities from other tasks in to it.
185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller has requested that the target task be
185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // reset, then do so.
185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()
185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resetTaskIfNeededLocked(r, r);
185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    doShow = topRunningNonDelayedActivityLocked(null) == r;
185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (SHOW_APP_STARTING_PREVIEW && doShow) {
185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Figure out if we are transitioning from another activity that is
186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // "has the same starting icon" as the next one.  This allows the
186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // window manager to keep the previous window it had previously
186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // created, if it still had one.
186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord prev = mResumedActivity;
186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev != null) {
186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't want to reuse the previous starting preview if:
186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (1) The current activity is in a different task.
186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (prev.task != r.task) prev = null;
186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (2) The current activity is already displayed.
186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    else if (prev.nowVisible) prev = null;
187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.setAppStartingWindow(
1872be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.appToken, r.packageName, r.theme,
18732f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                        mService.compatibilityInfoForPackageLocked(
18742f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                r.info.applicationInfo), r.nonLocalizedLabel,
1875be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.labelRes, r.icon, r.windowFlags,
1876be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        prev != null ? prev.appToken : null, showStartingIcon);
187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this is the first activity, don't do any fancy animations,
188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // because there is nothing for it to animate on top of.
1881be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.info.screenOrientation, r.fullscreen);
18838078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
1886be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (doResume) {
189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1894be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final void validateAppTokensLocked() {
1895be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.clear();
1896be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.ensureCapacity(mHistory.size());
1897be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        for (int i=0; i<mHistory.size(); i++) {
1898be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mValidateAppTokens.add(mHistory.get(i).appToken);
1899be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        }
1900be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.validateAppTokens(mValidateAppTokens);
1901be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
1902be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform a reset of the given task, if needed as part of launching it.
190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the new HistoryRecord at the top of the task.
190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord newActivity) {
190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean forceReset = (newActivity.info.flags
191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0;
1911621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (ACTIVITY_INACTIVE_RESET_TIME > 0
1912621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) {
191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((newActivity.info.flags
191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) {
191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                forceReset = true;
191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final TaskRecord task = taskTop.task;
192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are going to move through the history list so that we can look
192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // at each activity 'target' with 'below' either the interesting
192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity immediately below it in the stack or null.
192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord target = null;
192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int targetI = 0;
192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int taskTopI = -1;
192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int replyChainEnd = -1;
192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int lastReparentPos = -1;
192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mHistory.size()-1; i>=-1; i--) {
19300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (below != null && below.finishing) {
193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
193504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            // Don't check any lower in the stack if we're crossing a user boundary.
193604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            if (below != null && below.userId != taskTop.userId) {
193704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                break;
193804e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            }
193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target == null) {
194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                target = below;
194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                targetI = i;
194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If we were in the middle of a reply chain before this
194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, it doesn't appear like the root of the chain wants
194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // anything interesting, so drop it.
194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                replyChainEnd = -1;
194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int flags = target.info.flags;
195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean finishOnTaskLaunch =
195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean allowTaskReparenting =
195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0;
195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target.task == task) {
195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of the task being reset...  we'll either
195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // finish this activity, push it out for another task,
195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // or leave it as-is.  We only do this
196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for activities that are not the root of the task (since
196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // if we finish the root, we may no longer have the task!).
196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTopI < 0) {
196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    taskTopI = targetI;
196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (below != null && below.task == task) {
196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final boolean clearWhenTaskReset =
196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (target.intent.getFlags()
196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0;
196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) {
197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity is sending a reply to a previous
197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, we can't do anything with it now until
197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // we reach the start of the reply chain.
197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // XXX note that we are assuming the result is always
197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to the previous activity, which is almost always
197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the case but we really shouldn't count on.
197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting
198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && target.taskAffinity != null
198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && !target.taskAffinity.equals(task.affinity)) {
198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity has an affinity for another
198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // task, then we need to move it out of here.  We will
198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // move it as far out of the way as possible, to the
198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // bottom of the activity stack.  This also keeps it
198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // correctly ordered with any activities we previously
198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // moved.
19880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(0);
198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (target.taskAffinity != null
199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && target.taskAffinity.equals(p.task.affinity)) {
199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // If the activity currently at the bottom has the
199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // same task affinity as the one we are moving,
199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // then merge it into the same task.
1994f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(p.task, p.thumbHolder, false);
199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to bottom task " + p.task);
199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mCurTask++;
199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (mService.mCurTask <= 0) {
200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                mService.mCurTask = 1;
200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
2002f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(new TaskRecord(mService.mCurTask, target.info, null),
2003f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                                    null, false);
200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            target.task.affinityIntent = target.intent;
200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to new task " + target.task);
200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2008be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(target.appToken, task.taskId);
200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int dstPos = 0;
2013f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        ThumbnailHolder curThumbHolder = target.thumbHolder;
201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to target's task " + target.task);
2021f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            p.setTask(target.task, curThumbHolder, false);
2022f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            curThumbHolder = p.thumbHolder;
202398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            if (DEBUG_ADD_REMOVE) {
202498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                RuntimeException here = new RuntimeException("here");
202598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                here.fillInStackTrace();
202698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
202798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                        + dstPos, here);
202898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            }
202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.remove(srcPos);
203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.add(dstPos, p);
2031be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.moveAppToken(dstPos, p.appToken);
2032be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            dstPos++;
203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (VALIDATE_TOKENS) {
2035be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                validateAppTokensLocked();
203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            i++;
203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (forceReset || finishOnTaskLaunch
204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || clearWhenTaskReset) {
204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the activity should just be removed -- either
204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // because it asks for it, or the task should be
205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cleared -- then finish it and anything that is
205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // part of its reply chain.
205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (clearWhenTaskReset) {
205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case, we want to finish this activity
205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // and everything above it, so be sneaky and pretend
205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // like these are all in the reply chain.
205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI+1;
205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            while (replyChainEnd < mHistory.size() &&
20580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                                    (mHistory.get(
205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                                replyChainEnd)).task == task) {
206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd++;
206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (replyChainEnd < 0) {
206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord p = null;
206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (finishActivityLocked(p, srcPos,
207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    Activity.RESULT_CANCELED, null, "reset")) {
207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd--;
207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                srcPos--;
207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If we were in the middle of a chain, well the
208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity that started it all doesn't want anything
208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // special, so leave it all as-is.
208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Reached the bottom of the task -- any reply chain
209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // should be left as-is.
209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2096ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2097ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (target.resultTo != null && (below == null
2098ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    || below.task == target.task)) {
209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is sending a reply to a previous
210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity, we can't do anything with it now until
210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we reach the start of the reply chain.
210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // XXX note that we are assuming the result is always
210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to the previous activity, which is almost always
210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the case but we really shouldn't count on.
210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (replyChainEnd < 0) {
210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = targetI;
210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (taskTopI >= 0 && allowTaskReparenting
211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity != null
211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity.equals(target.taskAffinity)) {
211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of another task...  if this activity has
211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // an affinity for our task, then either remove it if we are
211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // clearing or move it over to our task.  Note that
211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we currently punt on the case where we are resetting a
211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task that is not at the top but who has activities above
211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // with an affinity to it...  this is really not a normal
211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // case, and we will need to later pull that task to the front
211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and usually at that point we will do the reset and pick
212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up those remaining activities.  (This only happens if
212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // someone starts an activity in a new task from an activity
212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in a task that is not currently on top.)
212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (forceReset || finishOnTaskLaunch) {
212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord p = null;
2128ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index "
2129ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
21310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        p = mHistory.get(srcPos);
213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (finishActivityLocked(p, srcPos,
213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Activity.RESULT_CANCELED, null, "reset")) {
213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI--;
213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            srcPos--;
214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
214350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2148ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index "
2149ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) {
21510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(srcPos);
215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (lastReparentPos < 0) {
215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos = taskTopI;
215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = p;
215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
216198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
216298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
216398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
216498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
216598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    + lastReparentPos, here);
216698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.remove(srcPos);
2168f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        p.setTask(task, null, false);
216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(lastReparentPos, p);
217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
2171ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                                + " from " + srcPos + " to " + lastReparentPos
217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " in to resetting task " + task);
2173be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken);
2174be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
2176be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Now we've moved it in to place...  but what if this is
218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // a singleTop activity and we have put it on top of another
218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // instance of the same activity?  Then we drop the instance
218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // below so it remains singleTop.
218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int j=lastReparentPos-1; j>=0; j--) {
21870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            ActivityRecord p = mHistory.get(j);
218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (finishActivityLocked(p, j,
219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        Activity.RESULT_CANCELED, null, "replace")) {
219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    taskTopI--;
219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    lastReparentPos--;
219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                }
219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2201ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2202ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (below != null && below.task != target.task) {
2203ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // We hit the botton of a task; the reply chain can't
2204ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // pass through it.
2205ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                replyChainEnd = -1;
220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            target = below;
220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            targetI = i;
221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return taskTop;
221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clear operation as requested by
221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the
221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * stack to the given task, then look for
221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * an instance of that activity in the stack and, if found, finish all
222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities on top of it and return the instance.
222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param newR Description of the new activity being started.
2223621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @return Returns the old activity that should be continued to be used,
222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * or null if none was found.
222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord performClearTaskLocked(int taskId,
2227621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            ActivityRecord newR, int launchFlags) {
222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First find the requested task.
223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == taskId) {
223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i++;
223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now clear it.
224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId != taskId) {
224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return null;
224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.realActivity.equals(newR.realActivity)) {
225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Here it is!  Now finish everything in front...
225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord ret = r;
2253621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                while (i < (mHistory.size()-1)) {
2254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    i++;
22550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    r = mHistory.get(i);
2256621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.task.taskId != taskId) {
2257621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
2258621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2259621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.finishing) {
2260621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
2261621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2262621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
2263621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            null, "clear")) {
2264621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        i--;
226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Finally, if this is a normal launch mode (that is, not
226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // expecting onNewIntent()), then we will finish the current
227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity so a new fresh one can be started.
227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!ret.finishing) {
2274be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        int index = indexOfTokenLocked(ret.appToken);
227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (index >= 0) {
227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    null, "clear");
227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return null;
228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return ret;
228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * Completely remove all activities associated with an existing
22920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * task starting at a specified index.
22930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     */
22940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private final void performClearTaskAtIndexLocked(int taskId, int i) {
2295eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn        while (i < mHistory.size()) {
22960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
22970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.task.taskId != taskId) {
22980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                // Whoops hit the end.
22990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return;
23000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.finishing) {
23020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
23040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
23060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    null, "clear")) {
23070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
23100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
23110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
23120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    /**
2313621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Completely remove all activities associated with an existing task.
2314621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
2315621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    private final void performClearTaskLocked(int taskId) {
2316621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int i = mHistory.size();
2317621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2318621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // First find the requested task.
2319621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2320621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
23210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2322621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId == taskId) {
2323621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                i++;
2324621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                break;
2325621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2326621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2327621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
23280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Now find the start and clear it.
2329621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2330621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
23310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2332621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.finishing) {
2333621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                continue;
2334621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2335621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId != taskId) {
2336621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // We hit the bottom.  Now finish it all...
23370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                performClearTaskAtIndexLocked(taskId, i+1);
2338621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                return;
2339621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2340621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2341621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2342621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2343621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Find the activity in the history stack within the given task.  Returns
234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the index within the history at which it's found, or < 0 if not found.
234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final int findActivityInHistoryLocked(ActivityRecord r, int task) {
234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
23510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord candidate = mHistory.get(i);
235245a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            if (candidate.finishing) {
235345a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                continue;
235445a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            }
235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.task.taskId != task) {
235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.realActivity.equals(r.realActivity)) {
235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return i;
236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return -1;
236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Reorder the history stack so that the activity at the given index is
236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * brought to the front.
236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord moveActivityToFrontLocked(int where) {
23710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord newTop = mHistory.remove(where);
237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size();
23730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord oldTop = mHistory.get(top-1);
237498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
237598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
237698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
237798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at "
237898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    + top, here);
237998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(top, newTop);
238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        oldTop.frontOfTask = false;
238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        newTop.frontOfTask = true;
238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return newTop;
238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityLocked(IApplicationThread caller,
2387a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode,
2389a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int callingPid, int callingUid, int startFlags, Bundle options,
2390621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity) {
2391efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2392a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        int err = ActivityManager.START_SUCCESS;
2393efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2394efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        ProcessRecord callerApp = null;
2395efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (caller != null) {
2396efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            callerApp = mService.getRecordForAppLocked(caller);
2397efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            if (callerApp != null) {
2398efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingPid = callerApp.pid;
2399efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingUid = callerApp.info.uid;
2400efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            } else {
2401efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                Slog.w(TAG, "Unable to find app for caller " + caller
2402efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + " (pid=" + callingPid + ") when starting: "
2403efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + intent.toString());
2404a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                err = ActivityManager.START_PERMISSION_DENIED;
2405efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            }
2406efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
2407efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2408a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS) {
2409a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani            final int userId = aInfo != null ? UserId.getUserId(aInfo.applicationInfo.uid) : 0;
241021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            Slog.i(TAG, "START {" + intent.toShortString(true, true, true, false)
2411a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani                    + " u=" + userId + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
2412efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord sourceRecord = null;
241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultRecord = null;
241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(resultTo);
241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(
241998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Will send result to " + resultTo + " (index " + index + ")");
242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
24210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sourceRecord = mHistory.get(index);
242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (requestCode >= 0 && !sourceRecord.finishing) {
242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord = sourceRecord;
242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && sourceRecord != null) {
243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Transfer the result target from the source activity to the new
243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // one being started, including any failures.
243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (requestCode >= 0) {
24358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                ActivityOptions.abort(options);
2436a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultRecord = sourceRecord.resultTo;
243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultWho = sourceRecord.resultWho;
244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            requestCode = sourceRecord.requestCode;
244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sourceRecord.resultTo = null;
244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord.removeResultsLocked(
244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sourceRecord, resultWho, requestCode);
244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2448a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find a class that can handle the given Intent.
245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // That's the end of that!
2451a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_INTENT_NOT_RESOLVED;
245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2454a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find the specific class specified in the Intent.
245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Also the end of the line.
2457a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_CLASS_NOT_FOUND;
245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2460a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err != ActivityManager.START_SUCCESS) {
246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
246690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
24678078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return err;
246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
247135be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int startAnyPerm = mService.checkPermission(
247235be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey                START_ANY_ACTIVITY, callingPid, callingUid);
247335be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
24746c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
247535be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
248190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
24826c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            String msg;
24836c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            if (!aInfo.exported) {
24846c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
24856c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
24866c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
24876c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " not exported from uid " + aInfo.applicationInfo.uid;
24886c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            } else {
24896c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
24906c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
24916c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
24926c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " requires " + aInfo.permission;
24936c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            }
249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, msg);
249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw new SecurityException(msg);
249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mController != null) {
250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean abort = false;
250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The Intent we give to the watcher has the extra data
250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // stripped off, since it can contain private information.
250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Intent watchIntent = intent.cloneFilter();
250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    abort = !mService.mController.activityStarting(watchIntent,
250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo.applicationInfo.packageName);
250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (abort) {
251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (resultRecord != null) {
251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sendActivityResultLocked(-1,
251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resultRecord, resultWho, requestCode,
251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Activity.RESULT_CANCELED, null);
251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We pretend to the caller that it was really started, but
251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // they will just get a cancel result.
251990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
25208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2521a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SUCCESS;
252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2525742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,
252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                intent, resolvedType, aInfo, mService.mConfiguration,
252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord, resultWho, requestCode, componentSpecified);
2529621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (outActivity != null) {
2530621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            outActivity[0] = r;
2531621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mResumedActivity == null
253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || mResumedActivity.info.applicationInfo.uid != callingUid) {
253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    PendingActivityLaunch pal = new PendingActivityLaunch();
253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.r = r;
253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.sourceRecord = sourceRecord;
2540a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    pal.startFlags = startFlags;
254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mPendingActivityLaunches.add(pal);
254290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
25438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2544a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SWITCHES_CANCELED;
254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mDidAppSwitch) {
254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second allowed switch since we stopped switches,
255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // so now just generally allow switches.  Use case: user presses
255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // home (switches disabled, switch to home, mDidAppSwitch now true);
255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // user taps a home icon (coming from home so allowed, we hit here
255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and now allow anyone to switch again).
255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mAppSwitchesAllowedTime = 0;
255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mDidAppSwitch = true;
255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.doPendingActivityLaunchesLocked(false);
256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
256290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord,
25637a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                startFlags, true, options);
2564621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
256590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // Someone asked to have the keyguard dismissed on the next
256690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // activity start, but we are not actually doing an activity
256790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // switch...  just dismiss the keyguard now, because we
256890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // probably want to see whatever is behind it.
256990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
257090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
257190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
257290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        return err;
257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2575621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
2576621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((launchFlags &
2577621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2578621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2579621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // Caller wants to appear on home activity, so before starting
2580621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // their own activity we will bring home to the front.
2581621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontLocked();
2582621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2583621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2584621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r,
25867a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            ActivityRecord sourceRecord, int startFlags, boolean doResume,
25877a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            Bundle options) {
258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final Intent intent = r.intent;
258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int callingUid = r.launchedFromUid;
2590742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = r.userId;
2591742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We'll invoke onUserLeaving before onPause only if the launching
259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity did not explicitly state that this is an automated launch.
259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_USER_LEAVING) Slog.v(TAG,
259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "startActivity() => mUserLeaving=" + mUserLeaving);
259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the caller has asked not to resume at this point, we make note
260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of this in the record so that we can skip it when trying to find
260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the top running activity.
260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!doResume) {
260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.delayedResume = true;
260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)
260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                != 0 ? r : null;
260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the onlyIfNeeded flag is set, then we can do this if the activity
261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // being launched is the same as the one making the call...  or, as
261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a special case, if we do not know the caller then we count the
261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current top activity as the caller.
2614a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord checkedCaller = sourceRecord;
261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (checkedCaller == null) {
261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                checkedCaller = topRunningNonDelayedActivityLocked(notTop);
261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!checkedCaller.realActivity.equals(r.realActivity)) {
262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Caller is not the same as launcher, so always needed.
2621a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sourceRecord == null) {
262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not being started from another...  in this
262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // case we -always- start a new task.
262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + intent);
263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The original activity who is starting us is running as a single
263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // instance...  this new activity it is starting must go on its
263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // own task.
263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity being started is a single instance...  it always
264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // gets launched into its own task.
264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // For whatever reason this activity is being launched into a new
264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // task...  yet the caller has requested a result back.  Well, that
264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // is pretty messed up, so instead immediately send back a cancel
264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and let the new task continue launched as normal without a
265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // dependency on its originator.
265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sendActivityResultLocked(-1,
265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.resultTo, r.resultWho, r.requestCode,
265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Activity.RESULT_CANCELED, null);
265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean addingToTask = false;
265903fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn        boolean movedHome = false;
2660621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord reuseTask = null;
266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If bring to front is requested, and no result is requested, and
266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we can find a task that was started with this same
266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // component, then instead of launching bring that one to the front.
266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo == null) {
266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // See if there is a task to bring to the front.  If this is
267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // a SINGLE_INSTANCE activity, there can be one and only one
267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of it in the history, and it is always in its own
267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // unique task, so we do a special search.
267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? findTaskLocked(intent, r.info)
267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        : findActivityLocked(intent, r.info);
267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTop != null) {
267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (taskTop.task.intent == null) {
267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // This task was started because of movement of
267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the activity based on affinity...  now that we
268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // are actually launching it, we can assign the
268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // base intent.
268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(intent, r.info);
268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the target task is not in the front, then we need
268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to bring it to the front...  except...  well, with
268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to have the same behavior as if a new instance was
268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // being started, which means not bringing it to the front
268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // if the caller is not itself in the front.
269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop);
269166a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru                    if (curTop != null && curTop.task != taskTop.task) {
269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        boolean callerAtFront = sourceRecord == null
269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                || curTop.task == sourceRecord.task;
269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (callerAtFront) {
269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // We really do want to push this one into the
269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // user's face, right now.
269803fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                            movedHome = true;
2699621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            moveHomeToFrontFromLaunchLocked(launchFlags);
27008078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            moveTaskToFrontLocked(taskTop.task, r, options);
270184375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            options = null;
270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller has requested that the target task be
270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // reset, then do so.
270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop = resetTaskIfNeededLocked(taskTop, r);
270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2709a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED)  != 0) {
271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We don't need to start a new activity, and
271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the client said not to do anything if that
271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is the case, so this is it!  And for paranoia, make
271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
271584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
271684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
271784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2719a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2721621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if ((launchFlags &
2722621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
2723621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
2724621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // The caller has requested to completely replace any
27257da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // existing task with its new activity.  Well that should
2726621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // not be too hard...
2727621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask = taskTop.task;
2728621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        performClearTaskLocked(taskTop.task.taskId);
2729621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask.setIntent(r.intent, r.info);
2730621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this situation we want to remove all activities
273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from the task up to the one being started.  In most
273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cases this means we are resetting the task to its
273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // initial state.
273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord top = performClearTaskLocked(
2738621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                taskTop.task.taskId, r, launchFlags);
273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (top != null) {
274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (top.frontOfTask) {
274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // Activity aliases may mean we use different
274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intents for the top activity, so make sure
274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the task now has the identity of the new
274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intent.
274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                top.task.setIntent(r.intent, r.info);
274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
274839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // A special case: we need to
275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // start the activity because it is not currently
275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // running, and the caller has asked to clear the
275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // current task to have this activity at the top.
275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Now pretend like this activity is being started
275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // by the top of its task, so it is put in the
275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // right place.
275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (r.realActivity.equals(taskTop.task.realActivity)) {
276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case the top activity on the task is the
276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // same as the one being launched, so we take that
276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // as a request to bring the task to the foreground.
276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the top activity in the task is the root
276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, deliver this new intent to it if it
276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // desires.
276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && taskTop.realActivity.equals(r.realActivity)) {
276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (taskTop.frontOfTask) {
277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                taskTop.task.setIntent(r.intent, r.info);
277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
277339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            taskTop.deliverNewIntentLocked(callingUid, r.intent);
277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (!r.intent.filterEquals(taskTop.task.intent)) {
277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case we are launching the root activity
277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // of the task, but with a different intent.  We
277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // should start a new instance on top.
277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case an activity is being launched in to an
278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // existing task, without resetting that task.  This
278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is typically the situation of launching an activity
278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from a notification or shortcut.  We want to place
278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the new activity on top of the current task.
278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        addingToTask = true;
278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sourceRecord = taskTop;
278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!taskTop.task.rootWasReset) {
279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case we are launching in to an existing task
279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // that has not yet been started from its front door.
279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // The current task has been brought to the front.
279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Ideally, we'd probably like to place this new task
279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // at the bottom of its stack, but that's a little hard
279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to do with the current organization of the code so
279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // for now we'll just drop it.
279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(r.intent, r.info);
279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2799621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (!addingToTask && reuseTask == null) {
280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We didn't do anything...  but it was needed (a.k.a., client
280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // don't use that intent!)  And for paranoia, make
280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
280484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
280584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
280684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2808a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_TASK_TO_FRONT;
280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //String uri = r.intent.toURI();
281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Intent intent2 = new Intent(uri);
281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "Given intent: " + r.intent);
281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "URI is: " + uri);
281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "To intent: " + intent2);
281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.packageName != null) {
282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity being launched is the same as the one currently
282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // at the top, then we need to check if it should only be launched
282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // once.
282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (top != null && r.resultTo == null) {
2826742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (top.app != null && top.app.thread != null) {
282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // For paranoia, make sure we have correctly
283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // resumed the top activity.
283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (doResume) {
283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                resumeTopActivityLocked(null);
283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
28378078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            ActivityOptions.abort(options);
2838a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // We don't need to start a new activity, and
284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the client said not to do anything if that
284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // is the case, so this is it!
2842a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
284439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
2845a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            return ActivityManager.START_DELIVERED_TO_TOP;
284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo != null) {
285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.resultTo, r.resultWho, r.requestCode,
285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
28578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
2858a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            return ActivityManager.START_CLASS_NOT_FOUND;
285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean newTask = false;
28627da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        boolean keepCurTransition = false;
286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Should this be considered a new task?
286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo == null && !addingToTask
286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2867621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (reuseTask == null) {
2868621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // todo: should do better management of integers.
2869621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mService.mCurTask++;
2870621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (mService.mCurTask <= 0) {
2871621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    mService.mCurTask = 1;
2872621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
2873f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true);
2874621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
2875621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        + " in new task " + r.task);
2876621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else {
2877f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(reuseTask, reuseTask, true);
287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newTask = true;
288003fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            if (!movedHome) {
288103fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                moveHomeToFrontFromLaunchLocked(launchFlags);
288203fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            }
288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord != null) {
288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!addingToTask &&
288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are adding the activity to an existing
288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, but the caller has asked to clear that task if the
288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity is already running.
289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord top = performClearTaskLocked(
2891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        sourceRecord.task.taskId, r, launchFlags);
28927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                keepCurTransition = true;
289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (top != null) {
289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
289539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // For paranoia, make sure we have correctly
289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // resumed the top activity.
289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
29018078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2902a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (!addingToTask &&
290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are launching an activity in our own task
290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // that may already be running somewhere in the history, and
290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we want to shuffle it to the front of the stack if so.
290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (where >= 0) {
291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord top = moveActivityToFrontLocked(where);
291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
29137a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    top.updateOptionsLocked(options);
291439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2918a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // An existing activity is starting this new activity, so we want
292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to keep the new one in the same task as the one that is starting
292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it.
2924f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in existing task " + r.task);
292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This not being started from an existing activity, and not part
293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // of a new task...  just put it in the top task, though these days
293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this case should never happen.
293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int N = mHistory.size();
293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord prev =
29340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                N > 0 ? mHistory.get(N-1) : null;
2935f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(prev != null
2936621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    ? prev.task
2937f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                    : new TaskRecord(mService.mCurTask, r.info, intent), null, true);
293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in new guessed " + r.task);
294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
294139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
294239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
29437e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                intent, r.getUriPermissionsLocked());
294439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (newTask) {
294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId);
294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
29497a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        startActivityLocked(r, newTask, doResume, keepCurTransition, options);
2950a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2953a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
2954483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            String profileFile, ParcelFileDescriptor profileFd, int userId) {
295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Collect information about the target of the Intent.
295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityInfo aInfo;
295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ResolveInfo rInfo =
295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                AppGlobals.getPackageManager().resolveIntent(
296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent, resolvedType,
296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        PackageManager.MATCH_DEFAULT_ONLY
2962483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = rInfo != null ? rInfo.activityInfo : null;
296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = null;
296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (aInfo != null) {
296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Store the found target back into the intent, because now that
297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we have it we never want to do this again.  For example, if the
297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // user navigates back to this point in the history, we should
297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // always restart the exact same activity.
297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            intent.setComponent(new ComponentName(
297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    aInfo.applicationInfo.packageName, aInfo.name));
297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Don't debug things in the system process
2977a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setDebugApp(aInfo.processName, true, false);
298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
298262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
2983a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
298492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                if (!aInfo.processName.equals("system")) {
298592a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
298692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                }
298792a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy            }
298892a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
298962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFile != null) {
299062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
299162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
2992a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            profileFile, profileFd,
2993a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
299462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
299562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2997621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return aInfo;
2998621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2999621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3000621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivityMayWait(IApplicationThread caller, int callingUid,
3001a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, IBinder resultTo,
3002a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            String resultWho, int requestCode, int startFlags, String profileFile,
3003a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
3004a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3005621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Refuse possible leaked file descriptors
3006621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intent != null && intent.hasFileDescriptors()) {
3007621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("File descriptors passed in Intent");
3008621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3009621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        boolean componentSpecified = intent.getComponent() != null;
3010621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3011621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Don't modify the client's object!
3012621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        intent = new Intent(intent);
3013621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3014621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Collect information about the target of the Intent.
3015a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
3016483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                profileFile, profileFd, userId);
301795a6a96e1cfb79b1960bb2a9e6bc22d9d8e5a238Amith Yamasani        if (aInfo != null && mService.isSingleton(aInfo.processName, aInfo.applicationInfo)) {
3018a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani            userId = 0;
3019a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani        }
3020742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        aInfo = mService.getActivityInfoForUser(aInfo, userId);
302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid;
3024621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (callingUid >= 0) {
3025621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                callingPid = -1;
3026621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else if (caller == null) {
302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = Binder.getCallingPid();
302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingUid = Binder.getCallingUid();
302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = callingUid = -1;
303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mConfigWillChange = config != null
303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && mService.mConfiguration.diff(config) != 0;
303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_CONFIGURATION) Slog.v(TAG,
303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Starting activity when config will change = " + mConfigWillChange);
303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final long origId = Binder.clearCallingIdentity();
303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack && aInfo != null &&
304154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Check to see if we already
304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // have another, different heavy-weight process running.
304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null &&
304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingPid = callingPid;
304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingUid = callingUid;
305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (caller != null) {
305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (callerApp != null) {
305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingPid = callerApp.pid;
305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingUid = callerApp.info.uid;
305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } else {
305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Slog.w(TAG, "Unable to find app for caller " + caller
305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + " (pid=" + realCallingPid + ") when starting: "
305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + intent.toString());
30598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                                ActivityOptions.abort(options);
3060a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_PERMISSION_DENIED;
306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        IIntentSender target = mService.getIntentSenderLocked(
3065a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
3066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                realCallingUid, null, null, 0, new Intent[] { intent },
3067621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
30687a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                                | PendingIntent.FLAG_ONE_SHOT, null);
306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Intent newIntent = new Intent();
307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (requestCode >= 0) {
307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Caller is requesting a result.
307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                new IntentSender(target));
307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.packageName);
308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.task.taskId);
308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                aInfo.packageName);
308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setFlags(intent.getFlags());
308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setClassName("android",
308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                HeavyWeightSwitcherActivity.class.getName());
308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent = newIntent;
309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resolvedType = null;
309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        caller = null;
309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingUid = Binder.getCallingUid();
309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingPid = Binder.getCallingPid();
309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        componentSpecified = true;
309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ResolveInfo rInfo =
309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                AppGlobals.getPackageManager().resolveIntent(
309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        intent, null,
309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        PackageManager.MATCH_DEFAULT_ONLY
3100483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = rInfo != null ? rInfo.activityInfo : null;
3102742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (RemoteException e) {
310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = null;
310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType,
3111a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
3112a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    startFlags, options, componentSpecified, null);
311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mConfigWillChange && mMainStack) {
311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller also wants to switch to a new configuration,
311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // do so now.  This allows a clean switch, as we are waiting
311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for the current activity to pause (so we will not destroy
311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it), and have not yet started the next activity.
311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "updateConfiguration()");
312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mConfigWillChange = false;
312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG,
312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Updating to new configuration after starting activity.");
3124813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                mService.updateConfigurationLocked(config, null, false, false);
312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Binder.restoreCallingIdentity(origId);
312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (outResult != null) {
313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                outResult.result = res;
3131a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                if (res == ActivityManager.START_SUCCESS) {
313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mWaitingActivityLaunched.add(outResult);
313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    do {
313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
3135ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                            mService.wait();
313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (InterruptedException e) {
313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } while (!outResult.timeout && outResult.who == null);
3139a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord r = this.topRunningActivityLocked(null);
314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.nowVisible) {
314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.timeout = false;
314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.totalTime = 0;
314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = 0;
314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = SystemClock.uptimeMillis();
314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mWaitingActivityVisible.add(outResult);
314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        do {
315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            try {
3151ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                                mService.wait();
315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } catch (InterruptedException e) {
315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } while (!outResult.timeout && outResult.who == null);
315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return res;
316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3163621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivities(IApplicationThread caller, int callingUid,
3164a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
3165a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3166621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents == null) {
3167621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("intents is null");
3168621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3169621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (resolvedTypes == null) {
3170621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("resolvedTypes is null");
3171621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3172621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents.length != resolvedTypes.length) {
3173621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("intents are length different than resolvedTypes");
3174621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3175621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3176621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        ActivityRecord[] outActivity = new ActivityRecord[1];
3177621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3178621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int callingPid;
3179621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (callingUid >= 0) {
3180621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = -1;
3181621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else if (caller == null) {
3182621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = Binder.getCallingPid();
3183621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingUid = Binder.getCallingUid();
3184621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else {
3185621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = callingUid = -1;
3186621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3187621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        final long origId = Binder.clearCallingIdentity();
3188621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
3189621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mService) {
3190621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3191621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<intents.length; i++) {
3192621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    Intent intent = intents[i];
3193621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent == null) {
3194621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
3195621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3196621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3197621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Refuse possible leaked file descriptors
3198621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent != null && intent.hasFileDescriptors()) {
3199621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException("File descriptors passed in Intent");
3200621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3201621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3202621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    boolean componentSpecified = intent.getComponent() != null;
3203621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3204621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Don't modify the client's object!
3205621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    intent = new Intent(intent);
3206621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3207621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Collect information about the target of the Intent.
3208a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
3209483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            0, null, null, userId);
3210742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // TODO: New, check if this is correct
3211742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
3212621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3213621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags
3214621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
3215621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException(
3216621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                "FLAG_CANT_SAVE_STATE not supported here");
3217621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3218621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
32197a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    Bundle theseOptions;
32207a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    if (options != null && i == intents.length-1) {
32217a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = options;
32227a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    } else {
32237a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = null;
32247a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    }
3225621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
3226a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            aInfo, resultTo, null, -1, callingPid, callingUid,
32277a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                            0, theseOptions, componentSpecified, outActivity);
3228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (res < 0) {
3229621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        return res;
3230621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3231621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3232be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
3233621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
3234621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3235621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } finally {
3236621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Binder.restoreCallingIdentity(origId);
3237621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3239a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
3240621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3241621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long thisTime, long totalTime) {
324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityLaunched.get(i);
324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = timeout;
324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = thisTime;
325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = totalTime;
325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3255621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityVisibleLocked(ActivityRecord r) {
325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityVisible.get(i);
325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = false;
326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = w.totalTime;
326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
326790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
326890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mDismissKeyguardOnNextActivity) {
326990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
327090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
327190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void sendActivityResultLocked(int callingUid, ActivityRecord r,
327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode, int resultCode, Intent data) {
327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (callingUid > 0) {
327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
32797e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                    data, r.getUriPermissionsLocked());
328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " : who=" + resultWho + " req=" + requestCode
328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " res=" + resultCode + " data=" + data);
328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r && r.app != null && r.app.thread != null) {
328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.add(new ResultInfo(resultWho, requestCode,
328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resultCode, data));
3290be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleSendResult(r.appToken, list);
329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown sending result to " + r, e);
329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void stopActivityLocked(ActivityRecord r) {
330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
3305d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (!mService.mSleeping) {
3306d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) {
3307d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                        Slog.d(TAG, "no-history finish of " + r);
3308d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    }
3309d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
3310d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                            "no-history");
3311d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                } else {
3312d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r
3313d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                            + " on stop because we're just sleeping");
3314d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
33165007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        }
33175007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate
33185007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        if (r.app != null && r.app.thread != null) {
331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mFocusedActivity == r) {
332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(topRunningActivityLocked(null));
332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3324621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            r.resumeKeyDispatchingLocked();
332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = false;
3327ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3328ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (stop requested)");
332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPING;
333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping visible=" + r.visible + " for " + r);
333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!r.visible) {
3333be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(r.appToken, false);
333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
3335be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
33364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (mService.isSleeping()) {
33374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
33384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
3339162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG);
3340162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                msg.obj = r;
3341162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                mHandler.sendMessageDelayed(msg, STOP_TIMEOUT);
334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Maybe just ignore exceptions here...  if the process
334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Just in case, assume it to be stopped.
334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = true;
3349ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);
335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPED;
335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.configDestroy) {
335228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                    destroyActivityLocked(r, true, false, "stop-except");
335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(
335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean remove) {
336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int N = mStoppingActivities.size();
336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (N <= 0) return null;
336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean nowVisible = mResumedActivity != null
336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mResumedActivity.nowVisible
336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && !mResumedActivity.waitingVisible;
336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=0; i<N; i++) {
336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord s = mStoppingActivities.get(i);
337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + nowVisible + " waitingVisible=" + s.waitingVisible
337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " finishing=" + s.finishing);
337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (s.waitingVisible && nowVisible) {
337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.remove(s);
337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                s.waitingVisible = false;
337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (s.finishing) {
337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is finishing, it is sitting on top of
337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // everyone else but we now know it is no longer needed...
337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so get rid of it.  Otherwise, we need to go through the
338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // normal flow and hide it once we determine that it is
338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // hidden by the activities in front of it.
338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3383be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(s.appToken, false);
338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
33864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if ((!s.waitingVisible || mService.isSleeping()) && remove) {
338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (stops == null) {
338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stops = new ArrayList<ActivityRecord>();
339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                stops.add(s);
339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.remove(i);
339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                N--;
339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return stops;
339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
340180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    final void scheduleIdleLocked() {
340280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        Message msg = Message.obtain();
340380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        msg.what = IDLE_NOW_MSG;
340480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        mHandler.sendMessage(msg);
340580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    }
340680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn
340762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config) {
340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityRecord res = null;
341262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> finishes = null;
341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> thumbnails = null;
341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NS = 0;
341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NF = 0;
341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NT = 0;
341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        IApplicationThread sendThumbnail = null;
342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean booting = false;
342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean enableScreen = false;
342242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3425be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3426be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3427be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
34282a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                r.finishLaunchTickingLocked();
342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Get the activity record.
3432be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
343462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                res = r;
343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (fromTimeout) {
343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is a hack to semi-deal with a race condition
344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in the client where it can be constructed with a
344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // newer configuration from when we asked it to launch.
344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We'll update with whatever configuration it now says
344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it used to launch.
344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (config != null) {
344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.configuration = config;
344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // No longer need to keep the device awake.
345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mResumedActivity == r && mLaunchingActivity.isHeld()) {
345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are now idle.  If someone is waiting for a thumbnail from
345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // us, we can now deliver.
345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.idle = true;
345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.scheduleAppGcsLocked();
345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sendThumbnail = r.app.thread;
346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.thumbnailNeeded = false;
346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is fullscreen, set up to hide those under it.
346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
347129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (!mService.mBooted) {
347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mBooted = true;
347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        enableScreen = true;
347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (fromTimeout) {
347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Atomically retrieve all of the other things to do.
348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            stops = processStoppingActivitiesLocked(true);
348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            NS = stops != null ? stops.size() : 0;
348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NF=mFinishingActivities.size()) > 0) {
348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mFinishingActivities.clear();
348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NT=mService.mCancelledThumbnails.size()) > 0) {
348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails);
349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mCancelledThumbnails.clear();
349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                booting = mService.mBooting;
349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mBooting = false;
349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i;
350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Send thumbnail if requested.
350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sendThumbnail != null) {
350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendThumbnail.requestThumbnail(token);
350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.sendPendingThumbnail(null, token, null, null, true);
350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Stop any activities that are scheduled to do so but have been
351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NS; i++) {
351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)stops.get(i);
351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stopActivityLocked(r);
352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Finish any activities that are scheduled to do so but have been
352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NF; i++) {
352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)finishes.get(i);
352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
352942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                activityRemoved = destroyActivityLocked(r, true, false, "finish-idle");
353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Report back to any thumbnail receivers.
353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NT; i++) {
353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)thumbnails.get(i);
353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.sendPendingThumbnail(r, null, null, null, true);
353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (booting) {
354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.finishBooting();
354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.trimApplications();
354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //dump();
354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //mWindowManager.dump();
354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (enableScreen) {
354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.enableScreenAfterBoot();
354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
355062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
355142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
355242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
355342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
355442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
355562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        return res;
355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the activity is being finished, false if for
356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * some reason it is being left as-is.
356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Intent resultData, String reason) {
356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int index = indexOfTokenLocked(token);
3565d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(
356698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Finishing activity @" + index + ": token=" + token
3567d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", result=" + resultCode + ", data=" + resultData
3568d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", reason=" + reason);
356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
35720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord r = mHistory.get(index);
357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishActivityLocked(r, index, resultCode, resultData, reason);
357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3578ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final void finishSubActivityLocked(IBinder token, String resultWho, int requestCode) {
3579ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord self = isInStackLocked(token);
3580ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (self == null) {
3581ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return;
3582ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3583ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3584ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int i;
3585ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        for (i=mHistory.size()-1; i>=0; i--) {
3586ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord r = (ActivityRecord)mHistory.get(i);
3587ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (r.resultTo == self && r.requestCode == requestCode) {
3588ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                if ((r.resultWho == null && resultWho == null) ||
3589ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    (r.resultWho != null && r.resultWho.equals(resultWho))) {
3590ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    finishActivityLocked(r, i,
3591ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                            Activity.RESULT_CANCELED, null, "request-sub");
3592ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                }
3593ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3594ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3595ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3596ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3597ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final boolean finishActivityAffinityLocked(IBinder token) {
3598ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int index = indexOfTokenLocked(token);
3599ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(
3600ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                TAG, "Finishing activity affinity @" + index + ": token=" + token);
3601ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (index < 0) {
3602ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return false;
3603ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3604ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord r = mHistory.get(index);
3605ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3606bfc1be1101b87f193b043b62edd1722b8c4eb23cAmith Yamasani        while (index >= 0) {
3607ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord cur = mHistory.get(index);
3608ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.task != r.task) {
3609ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3610ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3611ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity == null && r.taskAffinity != null) {
3612ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3613ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3614ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
3615ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3616ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3617ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity");
3618ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            index--;
3619ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3620ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        return true;
3621ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3622ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
36235c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
36245c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // send the result
36255c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        ActivityRecord resultTo = r.resultTo;
36265c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        if (resultTo != null) {
36275c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
36285c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " who=" + r.resultWho + " req=" + r.requestCode
36295c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " res=" + resultCode + " data=" + resultData);
36305c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (r.info.applicationInfo.uid > 0) {
36315c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
36325c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.packageName, resultData,
36335c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.getUriPermissionsLocked());
36345c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            }
36355c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
36365c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                                     resultData);
36375c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            r.resultTo = null;
36385c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        }
36395c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
36405c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
36415c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // Make sure this HistoryRecord is not holding on to other resources,
36425c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // because clients have remote IPC references to this object so we
36435c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // can't assume that will go away and want to avoid circular IPC refs.
36445c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.results = null;
36455c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.pendingResults = null;
36465c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.newIntents = null;
36475c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.icicle = null;
36485c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    }
36495c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if this activity has been removed from the history
365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * list, or false if it is still in the list and will be removed later.
365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
365450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int resultCode, Intent resultData, String reason) {
36568078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        return finishActivityLocked(r, index, resultCode, resultData, reason, false);
36578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
36588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
36598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
36608078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @return Returns true if this activity has been removed from the history
36618078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * list, or false if it is still in the list and will be removed later.
36628078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
36638078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
36648078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            int resultCode, Intent resultData, String reason, boolean immediate) {
366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Duplicate finish request for " + r);
366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
366850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
367094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        r.makeFinishing();
367150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
367250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
367350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName, reason);
367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < (mHistory.size()-1)) {
36750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord next = mHistory.get(index+1);
367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next.task == r.task) {
367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.frontOfTask) {
367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The next activity is now the front of the task.
367950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.frontOfTask = true;
368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
368150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
368250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller asked that this activity (and all above it)
368350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // be cleared when the task is reset, don't lose that information,
368450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // but propagate it up to the next activity.
368550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
368650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
368750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
368950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
369050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pauseKeyDispatchingLocked();
369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mFocusedActivity == r) {
369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.setFocusedActivityLocked(topRunningActivityLocked(null));
369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
36975c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        finishActivityResultsLocked(r, resultCode, resultData);
369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (immediate) {
37078078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            return finishCurrentActivityLocked(r, index,
37088078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    FINISH_IMMEDIATELY) == null;
37098078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        } else if (mResumedActivity == r) {
371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean endTask = index <= 0
37110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    || (mHistory.get(index-1)).task != r.task;
371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare close transition: finishing " + r);
371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.prepareAppTransition(endTask
371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
37167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Tell window manager to prepare for this one to be removed.
3719be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(r.appToken, false);
372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3721621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity == null) {
372250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
372350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, false);
372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.state != ActivityState.PAUSING) {
372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity is PAUSING, we will complete the finish once
372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it is done pausing; else we can just directly finish it here.
373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return finishCurrentActivityLocked(r, index,
373250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    FINISH_AFTER_PAUSE) == null;
373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return false;
373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_IMMEDIATELY = 0;
374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_PAUSE = 1;
374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_VISIBLE = 2;
374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int mode) {
3746be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        final int index = indexOfActivityLocked(r);
374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return null;
374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return finishCurrentActivityLocked(r, index, mode);
375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index, int mode) {
375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First things first: if this activity is currently visible,
375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // and the resumed activity is not yet visible, then hold off on
375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // finishing until the resumed one becomes visible.
375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mStoppingActivities.contains(r)) {
376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.add(r);
376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mStoppingActivities.size() > 3) {
376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If we already have a few activities waiting to stop,
376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // then give up on things going idle and start clearing
376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // them out.
376680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                    scheduleIdleLocked();
37674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } else {
37684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    checkReadyForSleepLocked();
376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3771ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3772ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (finish requested)");
377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPING;
377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateOomAdjLocked();
377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return r;
377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure the record is cleaned out of other places.
377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(r);
37804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final ActivityState prevState = r.state;
3786ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r);
378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.state = ActivityState.FINISHING;
378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_IMMEDIATELY
379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.STOPPED
379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.INITIALIZING) {
379250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this activity is already stopped, we can just finish
379350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it right now.
379442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            boolean activityRemoved = destroyActivityLocked(r, true, true, "finish-imm");
379542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            if (activityRemoved) {
379642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
379742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
379842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            return activityRemoved ? null : r;
379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Need to go through the full pause cycle to get this
380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity into the stopped state and then finish it.
380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mFinishingActivities.add(r);
380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return r;
380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform the common clean-up of an activity record.  This is called both
381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * as part of destroyActivityLocked() (when destroying the client-side
381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * representation) and cleaning things up as a result of its hosting
381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * processing going away, in which case there is no remaining client-side
381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * state to destroy so only the cleanup here is needed.
381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
3816ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
3817ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            boolean setState) {
381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mFocusedActivity == r) {
382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mFocusedActivity = null;
382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configDestroy = false;
382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frozenBeforeDestroy = false;
382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3828ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (setState) {
3829ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
3830ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            r.state = ActivityState.DESTROYED;
3831ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3832ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this record is no longer in the pending finishes list.
383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // This could happen, for example, if we are trimming activities
383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // down to the max limit while they are still waiting to finish.
383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mFinishingActivities.remove(r);
383750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
383850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remove any pending results.
384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing && r.pendingResults != null) {
384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
384250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                PendingIntentRecord rec = apr.get();
384350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (rec != null) {
384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.cancelIntentSenderLocked(rec, false);
384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.pendingResults = null;
384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (cleanServices) {
385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
385250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Get rid of any pending idle timeouts.
386242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        removeTimeoutsForActivityLocked(r);
386342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    }
386442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
386542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    private void removeTimeoutsForActivityLocked(ActivityRecord r) {
386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
3867162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
38690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
38702a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.finishLaunchTickingLocked();
387150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void removeActivityFromHistoryLocked(ActivityRecord r) {
387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.state != ActivityState.DESTROYED) {
38755c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
387694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            r.makeFinishing();
387798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_ADD_REMOVE) {
387898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                RuntimeException here = new RuntimeException("here");
387998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                here.fillInStackTrace();
388098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                Slog.i(TAG, "Removing activity " + r + " from stack");
388198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            }
388250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHistory.remove(r);
3883f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.takeFromHistory();
3884ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3885ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (removed from history)");
388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.DESTROYED;
3887be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.removeAppToken(r.appToken);
388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (VALIDATE_TOKENS) {
3889be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                validateAppTokensLocked();
389050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
389150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.removeUriPermissionsLocked();
389350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
389550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
389650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clean-up of service connections in an activity record.
389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
389950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void cleanUpActivityServicesLocked(ActivityRecord r) {
390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Throw away any services that have been bound by this activity.
390150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.connections != null) {
390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Iterator<ConnectionRecord> it = r.connections.iterator();
390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            while (it.hasNext()) {
390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ConnectionRecord c = it.next();
3905599db5c85faa5733af538a712b870e1f507cd380Dianne Hackborn                mService.mServices.removeConnectionLocked(c, null, r);
390650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
390750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.connections = null;
390850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
390950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3910755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
3911755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    final void scheduleDestroyActivities(ProcessRecord owner, boolean oomAdj, String reason) {
3912755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        Message msg = mHandler.obtainMessage(DESTROY_ACTIVITIES_MSG);
3913755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        msg.obj = new ScheduleDestroyArgs(owner, oomAdj, reason);
3914755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        mHandler.sendMessage(msg);
3915755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
3916755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
391728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
3918755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        boolean lastIsOpaque = false;
391942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
3920ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
3921ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            ActivityRecord r = mHistory.get(i);
3922755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.finishing) {
3923755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
3924755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3925755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.fullscreen) {
3926755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                lastIsOpaque = true;
3927755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3928ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (owner != null && r.app != owner) {
3929ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                continue;
3930ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3931755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (!lastIsOpaque) {
3932755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
3933755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
3934ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // We can destroy this one if we have its icicle saved and
3935ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it is not in the process of pausing/stopping/finishing.
3936755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.app != null && r != mResumedActivity && r != mPausingActivity
3937755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    && r.haveState && !r.visible && r.stopped
3938ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYING
3939ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYED) {
3940755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Destroying " + r + " in state " + r.state
3941755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " resumed=" + mResumedActivity
3942755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " pausing=" + mPausingActivity);
394342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (destroyActivityLocked(r, true, oomAdj, reason)) {
394442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    activityRemoved = true;
394542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
3946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3947ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
394842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
394942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
395042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
3951ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
3952ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
395350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Destroy the current CLIENT SIDE instance of an activity.  This may be
395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * called both when actually finishing an activity, or when performing
395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * a configuration switch where we destroy the current client-side object
395750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * but then create a new client-side object for this same HistoryRecord.
395850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
395950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean destroyActivityLocked(ActivityRecord r,
396028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            boolean removeFromApp, boolean oomAdj, String reason) {
396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(
3962755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            TAG, "Removing activity from " + reason + ": token=" + r
396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn              + ", app=" + (r.app != null ? r.app.processName : "(null)"));
396450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
396550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
396628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                r.task.taskId, r.shortComponentName, reason);
396750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
396850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean removedFromHistory = false;
396950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3970ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        cleanUpActivityLocked(r, false, false);
397150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
397250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadApp = r.app != null;
397350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (hadApp) {
397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (removeFromApp) {
397650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int idx = r.app.activities.indexOf(r);
397750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (idx >= 0) {
397850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.app.activities.remove(idx);
397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = null;
398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendEmptyMessage(
398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.app.activities.size() == 0) {
398650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // No longer have activities, so update location in
398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // LRU list.
3988ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    mService.updateLruProcessLocked(r.app, oomAdj, false);
398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
399250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean skipDestroy = false;
399350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
399450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
3996be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.configChangeFlags);
399850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
399950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We can just ignore exceptions here...  if the process
400050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.w(TAG, "Exception thrown during finish", e);
400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
400450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removedFromHistory = true;
400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    skipDestroy = true;
400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
401050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.app = null;
401150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.nowVisible = false;
401250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4013ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // If the activity is finishing, we need to wait on removing it
4014ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // from the list to give it a chance to do its cleanup.  During
4015ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // that time it may make calls back with its token so we need to
4016ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // be able to find it on the list and so we don't want to remove
4017ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it from the list yet.  Otherwise, we can just immediately put
4018ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it in the destroyed state since we are not removing it from the
4019ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // list.
402050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing && !skipDestroy) {
4021ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r
4022ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy requested)");
402350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYING;
402450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
402550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                msg.obj = r;
402650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
402750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4028ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4029ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy skipped)");
403050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
403150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
403250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // remove this record from the history.
403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removeActivityFromHistoryLocked(r);
403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removedFromHistory = true;
403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4038ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4039ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (no app)");
404050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
404150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
404250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
404350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configChangeFlags = 0;
404550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mLRUActivities.remove(r) && hadApp) {
404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
404950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
405050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return removedFromHistory;
405150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
405250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
405350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void activityDestroyed(IBinder token) {
405450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
405542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            final long origId = Binder.clearCallingIdentity();
405642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            try {
405742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                ActivityRecord r = ActivityRecord.forToken(token);
405842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (r != null) {
405942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
406042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
406142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
406242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                int index = indexOfActivityLocked(r);
406342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (index >= 0) {
406442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    if (r.state == ActivityState.DESTROYING) {
406545a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                        cleanUpActivityLocked(r, true, false);
406642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                        removeActivityFromHistoryLocked(r);
406742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    }
406850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
406942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
407042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            } finally {
407142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                Binder.restoreCallingIdentity(origId);
407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
407450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
407550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    private void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = list.size();
407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(
407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing app " + app + " from list " + list
408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            + " with " + i + " entries");
408150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
408250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
408350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)list.get(i);
408450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
408550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "Record #" + i + " " + r + ": app=" + r.app);
408650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == app) {
408750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing this entry!");
408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.remove(i);
408942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                removeTimeoutsForActivityLocked(r);
409050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
409150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
409250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
409350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
409450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void removeHistoryRecordsForAppLocked(ProcessRecord app) {
409550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mLRUActivities, app);
409650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mStoppingActivities, app);
40974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app);
409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app);
409950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mFinishingActivities, app);
410050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
410150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4102621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
4103621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Move the current home activity's task (if one exists) to the front
4104621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * of the stack.
4105621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
4106621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontLocked() {
4107621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord homeTask = null;
4108621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
41090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord hr = mHistory.get(i);
4110621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (hr.isHomeActivity) {
4111621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                homeTask = hr.task;
411294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                break;
4113621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
4114621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4115621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (homeTask != null) {
41168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            moveTaskToFrontLocked(homeTask, null, null);
4117621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4118621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
4119621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
41207f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    final void updateTransitLocked(int transit, Bundle options) {
41217f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        if (options != null) {
41227f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
41237f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (r != null && r.state != ActivityState.RESUMED) {
41247f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                r.updateOptionsLocked(options);
41257f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
41267f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
41277f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
41287f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        }
41297f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        mService.mWindowManager.prepareAppTransition(transit, false);
41307f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    }
4131621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
41328078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason, Bundle options) {
413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
413450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
413550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int task = tr.taskId;
413650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size()-1;
413750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (top < 0 || (mHistory.get(top)).task.taskId == task) {
413950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // nothing to do!
41407f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (reason != null &&
41417f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                    (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
41427f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
41437f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
41447f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
41457f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
414650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
414750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
414850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4149be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
415050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
415150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Applying the affinities may have removed entries from the history,
415250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // so get the size again.
415350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        top = mHistory.size()-1;
415450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = top;
415550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
415650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task up to the top
415750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
415850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos >= 0) {
41590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
416050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
416150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
416250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
416350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
416498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
416598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
416698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
416798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here);
416898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
416950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
417050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(top, r);
4171be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(0, r.appToken);
417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                top--;
417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
417450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos--;
417550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
417650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
417750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to front transition: task=" + tr);
417950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
418050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
41817da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
41827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
418350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
418450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
418550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
418650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
41878078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
418850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
41897f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
419050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
419150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
419250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToTop(moved);
419350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4194be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
419550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
419650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
419750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
419850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task);
419950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
420050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
420150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void finishTaskMoveLocked(int task) {
420250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        resumeTopActivityLocked(null);
420350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
420450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
420550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
420650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Worker method for rearranging history stack.  Implements the function of moving all
420750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities for a specific task (gathering them if disjoint) into a single group at the
420850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * bottom of the stack.
420950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
421050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * If a watcher is installed, the action is preflighted and the watcher has an opportunity
421150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to premeptively cancel the move.
421250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
421350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param task The taskId to collect and move to the bottom.
421450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the move completed, false if not.
421550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
421650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean moveTaskToBackLocked(int task, ActivityRecord reason) {
421750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Slog.i(TAG, "moveTaskToBack: " + task);
421850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we have a watcher, preflight the move before committing to it.  First check
422050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // for *other* available tasks, but if none are available, then try again allowing the
422150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current task to be selected.
422250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack && mService.mController != null) {
422350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord next = topRunningActivityLocked(null, task);
422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next == null) {
422550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next = topRunningActivityLocked(null, 0);
422650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
422750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next != null) {
422850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // ask watcher if this is allowed
422950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean moveOK = true;
423050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
423150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    moveOK = mService.mController.activityResuming(next.packageName);
423250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
423350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
423450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!moveOK) {
423650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return false;
423750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
423850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
423950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
424050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4241be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
424250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
424350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
424450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to back transition: task=" + task);
424550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
424650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
424750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int bottom = 0;
424850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = 0;
424950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
425050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task down to the bottom
425150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
425250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos < N) {
42530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
425450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
425550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
425650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
425750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
425898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
425998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
426098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
426198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at "
426298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            + bottom, here);
426398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
426450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
426550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(bottom, r);
4266be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(r.appToken);
426750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                bottom++;
426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos++;
427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
427350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
42747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
42757da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
427650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
427750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
427850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
427950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
428050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
42817da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
42827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
428350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
428450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToBottom(moved);
428550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4286be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
428750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
428850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
428950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
429050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
429150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
429250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
42930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) {
42940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
42950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
42960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (resumed != null && resumed.thumbHolder == tr) {
42970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
42980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        } else {
42990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = tr.lastThumbnail;
43000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return info;
43020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
43030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43049da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn    public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex,
43059da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            boolean taskRequired) {
43060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false);
43070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (info.root == null) {
43089da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
43099da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId);
43109da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
43110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
43120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex < 0) {
43150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            // Just remove the entire task.
43160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            performClearTaskAtIndexLocked(taskId, info.rootIndex);
43170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return info.root;
43180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex >= info.subtasks.size()) {
43219da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
43229da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex);
43239da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
43240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
43250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Remove all of this task's activies starting at the sub task.
43280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex);
43290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        performClearTaskAtIndexLocked(taskId, subtask.index);
43300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return subtask.activity;
43310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
43320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) {
43340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
43350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final TaskAccessInfo thumbs = new TaskAccessInfo();
43360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // How many different sub-thumbnails?
43370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final int NA = mHistory.size();
43380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        int j = 0;
43390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ThumbnailHolder holder = null;
43400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
43410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
43420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!ar.finishing && ar.task.taskId == taskId) {
43430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
43440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
43450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
43470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (j >= NA) {
43500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return thumbs;
43510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.root = mHistory.get(j);
43540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.rootIndex = j;
43550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
43560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
43570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.subtasks = subtasks;
43580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord lastActivity = null;
43590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
43600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
43610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
43620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.finishing) {
43630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
43640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.task.taskId != taskId) {
43660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
43670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            lastActivity = ar;
43690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.thumbHolder != holder && holder != null) {
43700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                thumbs.numSubThumbbails++;
43710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
43720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask();
43730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = holder.lastThumbnail;
43740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.activity = ar;
43750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.index = j-1;
43760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                subtasks.add(sub);
43770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (lastActivity != null && subtasks.size() > 0) {
43800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (resumed == lastActivity) {
43810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1);
43820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity);
43830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
43840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (thumbs.numSubThumbbails > 0) {
43860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            thumbs.retriever = new IThumbnailRetriever.Stub() {
43870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                public Bitmap getThumbnail(int index) {
43880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (index < 0 || index >= thumbs.subtasks.size()) {
43890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        return null;
43900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
43910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return thumbs.subtasks.get(index).thumbnail;
43920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
43930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            };
43940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
43950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return thumbs;
43960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
43970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
439850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void logStartActivity(int tag, ActivityRecord r,
439950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TaskRecord task) {
440050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(tag,
440150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r), task.taskId,
440250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.shortComponentName, r.intent.getAction(),
440350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getType(), r.intent.getDataString(),
440450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getFlags());
440550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
440650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
440750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
440850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure the given activity matches the current configuration.  Returns
440950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * false if the activity had to be destroyed.  Returns true if the
441050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * configuration is the same, or the activity will remain running as-is
441150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for whatever reason.  Ensures the HistoryRecord is updated with the
441250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * correct configuration and all other bookkeeping is handled.
441350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
441450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean ensureActivityConfigurationLocked(ActivityRecord r,
441550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int globalChanges) {
441650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mConfigWillChange) {
441750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
441850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Skipping config check (will change): " + r);
441950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
442050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
442150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
442250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
442350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Ensuring correct configuration: " + r);
442450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
442550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Short circuit: if the two configurations are the exact same
442650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // object (the common case), then there is nothing to do.
442750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration newConfig = mService.mConfiguration;
4428e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (r.configuration == newConfig && !r.forceNewConfig) {
442950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
443050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration unchanged in " + r);
443150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
443250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
443350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
443450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We don't worry about activities that are finishing.
443550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
443650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
443750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter in finishing " + r);
443850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
443950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
444050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
444150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
444250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Okay we now are going to make this activity have the new config.
444350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // But then we need to figure out how it needs to deal with that.
444450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration oldConfig = r.configuration;
444550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configuration = newConfig;
444658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
444758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Determine what has changed.  May be nothing, if this is a config
444858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // that has come back from the app after going idle.  In that case
444958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // we just want to leave the official config object now in the
445058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // activity and do nothing else.
445158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        final int changes = oldConfig.diff(newConfig);
445258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        if (changes == 0 && !r.forceNewConfig) {
445358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
445458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    "Configuration no differences in " + r);
445558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            return true;
445658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        }
445758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
445850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the activity isn't currently running, just leave the new
445950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration and it will pick that up next time it starts.
446050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app == null || r.app.thread == null) {
446150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
446250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter not running " + r);
446350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
4464e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
446550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
446650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
446750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
446858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Figure out how to handle the changes between the configurations.
44693c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
44703c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
44713c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + Integer.toHexString(changes) + ", handles=0x"
4472e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn                    + Integer.toHexString(r.info.getRealConfigChanged())
44733c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + ", newConfig=" + newConfig);
44743c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        }
4475e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn        if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) {
44763c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // Aha, the activity isn't handling the change, so DIE DIE DIE.
44773c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.configChangeFlags |= changes;
44783c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.startFreezingScreenLocked(r.app, globalChanges);
4479e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
44803c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            if (r.app == null || r.app.thread == null) {
44813c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4482b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is destroying non-running " + r);
448328695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "config");
44843c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.PAUSING) {
44853c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // A little annoying: we are waiting for this activity to
44863c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // finish pausing.  Let's not do anything now, but just
44873c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // flag that it needs to be restarted when done pausing.
44883c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4489b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is skipping already pausing " + r);
44903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configDestroy = true;
44913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                return true;
44923c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.RESUMED) {
44933c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Try to optimize this case: the configuration is changing
44943c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // and we need to restart the top, resumed activity.
44953c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Instead of doing the normal handshaking, just say
44963c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // "restart!".
44973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4498b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching resumed " + r);
44993c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, true);
45003c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
45013c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else {
45023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4503b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching non-resumed " + r);
45043c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, false);
45053c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
450650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
45073c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn
45083c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // All done...  tell the caller we weren't able to keep this
45093c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // activity around.
45103c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            return false;
451150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
451250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
451350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Default case: the activity can handle this new configuration, so
451450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // hand it over.  Note that we don't need to give it the new
451550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration, since we always send configuration changes to all
451650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // process when they happen so it can just use whatever configuration
451750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // it last got.
451850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app != null && r.app.thread != null) {
451950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
452050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
4521be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleActivityConfigurationChanged(r.appToken);
452250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
452350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If process died, whatever.
452450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
452550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
452650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.stopFreezingScreenLocked(false);
452750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
452850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
452950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
453050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
453150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean relaunchActivityLocked(ActivityRecord r,
453250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int changes, boolean andResume) {
453350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<ResultInfo> results = null;
453450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<Intent> newIntents = null;
453550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
453650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            results = r.results;
453750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newIntents = r.newIntents;
453850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
453950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
454050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " with results=" + results + " newIntents=" + newIntents
454150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " andResume=" + andResume);
454250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
454350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
454450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName);
454550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
454650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(r.app, 0);
454750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
454850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
4549b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG,
4550b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ")
4551b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    + r);
4552e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
4553be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents,
4554813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    changes, !andResume, new Configuration(mService.mConfiguration));
455550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: don't need to call pauseIfSleepingLocked() here, because
455650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the caller will only pass in 'andResume' if this activity is
455750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // currently resumed, which implies we aren't sleeping.
455850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
4559b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, "Relaunch failed", e);
456050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
456150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
456250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
456350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.results = null;
456450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.newIntents = null;
456550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
456650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.reportResumedActivityLocked(r);
456750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
4568b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.RESUMED;
4569b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        } else {
4570b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
4571b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.PAUSED;
457250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
457350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
457450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
457550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
457690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
457790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguardOnNextActivityLocked() {
457890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        mDismissKeyguardOnNextActivity = true;
457990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
458050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn}
4581