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;
5550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException;
5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock;
57f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog;
5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log;
6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog;
6159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display;
6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy;
6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException;
6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference;
6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList;
6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator;
6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List;
6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/**
7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities.
7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */
730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack {
7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final String TAG = ActivityManagerService.TAG;
75b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn    static final boolean localLOGV = ActivityManagerService.localLOGV;
7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH;
7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE;
7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY;
7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING;
8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION;
8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS;
8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION;
8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS;
84cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn    static final boolean DEBUG_CLEANUP = ActivityManagerService.DEBUG_CLEANUP;
8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
86ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    static final boolean DEBUG_STATES = false;
8798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
8898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_SAVED_STATE = false;
89ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS;
9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity telling us it
9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is idle.
9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int IDLE_TIMEOUT = 10*1000;
952a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
962a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    // Ticks during which we check progress while waiting for an app to launch.
972a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    static final int LAUNCH_TICK = 500;
982a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity to pause.  This
10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is short because it directly impacts the responsiveness of starting the
10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // next activity.
10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int PAUSE_TIMEOUT = 500;
10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
104162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // How long we wait for the activity to tell us it has stopped before
105162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // giving up.  This is a good amount of time because we really need this
106162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    // from the application in order to get its saved state.
107162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    static final int STOP_TIMEOUT = 10*1000;
108162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn
1094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    // How long we can hold the sleep wake lock before giving up.
1104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    static final int SLEEP_TIMEOUT = 5*1000;
1114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we can hold the launch wake lock before giving up.
11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int LAUNCH_TIMEOUT = 10*1000;
11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on an activity telling us it has
11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // finished destroying itself.
11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int DESTROY_TIMEOUT = 10*1000;
11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long until we reset a task when the user returns to it.  Currently
120621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    // disabled.
121621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    static final long ACTIVITY_INACTIVE_RESET_TIME = 0;
12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // How long between activity launches that we consider safe to not warn
1240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // the user about an unexpected activity being launched on top.
1250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    static final long START_WARN_TIME = 5*1000;
1260dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // Set to false to disable the preview that is shown while a new activity
12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is being started.
12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean SHOW_APP_STARTING_PREVIEW = true;
13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    enum ActivityState {
13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        INITIALIZING,
13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        RESUMED,
13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSING,
13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSED,
13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPING,
13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPED,
13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        FINISHING,
13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYING,
14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYED
14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityManagerService mService;
14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean mMainStack;
14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Context mContext;
14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The back history of all previous (and possibly still
15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * running) activities.  It contains HistoryRecord objects.
15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();
153be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
154be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    /**
155be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     * Used for validating app tokens with window manager.
156be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     */
157be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>();
158be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of running activities, sorted by recent usage.
16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The first entry in the list is the least recently used.
16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * It contains HistoryRecord objects.
16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>();
16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are waiting for a new activity
16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to become visible before completing whatever operation they are
16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * supposed to do.
17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mWaitingVisibleActivities
17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be stopped, but waiting
17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the next activity to settle down before doing so.  It contains
17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mStoppingActivities
18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
1834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * List of activities that are in the process of going to sleep.
1844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
1854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    final ArrayList<ActivityRecord> mGoingToSleepActivities
1864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            = new ArrayList<ActivityRecord>();
1874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
1884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Animations that for the current transition have requested not to
19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * be considered for the transition animation.
19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mNoAnimActivities
19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be finished, but waiting
19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the previous activity to settle down before doing so.  It contains
19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mFinishingActivities
20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next launched activity.
20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched
20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next visible activity.
21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible
21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
21480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
21580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn    final ArrayList<UserStartedState> mStartingUsers
21680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            = new ArrayList<UserStartedState>();
21780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when the system is going to sleep, until we have
22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * successfully paused the current activity and released our wake lock.
22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * At that point the system is allowed to actually sleep.
22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mGoingToSleep;
22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * We don't want to allow the device to go to sleep while in the process
22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of launching an activity.  This is primarily to allow alarm intent
22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * receivers to launch an activity and get that to run before the device
22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * goes back to sleep.
23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mLaunchingActivity;
23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * When we are in the process of pausing an activity, before starting the
23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * next one, this variable holds the activity that is currently being paused.
23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
237621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    ActivityRecord mPausingActivity = null;
23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is the last activity that we put into the paused state.  This is
24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * used to determine if we need to do an activity transition while sleeping,
24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * when we normally hold the top activity paused.
24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mLastPausedActivity = null;
24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Current activity that is resumed, or null if there is none.
24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mResumedActivity = null;
25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
2520dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * This is the last activity that has been started.  It is only used to
2530dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * identify when multiple activities are started at once so that the user
2540dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * can be warned they may not be in the activity they think they are.
2550dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     */
2560dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    ActivityRecord mLastStartedActivity = null;
2570dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
2580dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    /**
25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when we know we are going to be calling updateConfiguration()
26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * soon, so want to skip intermediate config checks.
26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mConfigWillChange;
26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set to indicate whether to issue an onUserLeaving callback when a
26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * newly launched activity is being brought in front of us.
26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mUserLeaving = false;
26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    long mInitialStartTime = 0;
27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
2734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * Set when we have taken too long waiting to go to sleep.
2744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
2754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    boolean mSleepTimeout = false;
2764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
27790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    /**
27890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     * Dismiss the keyguard after the next activity is displayed?
27990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     */
28090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    boolean mDismissKeyguardOnNextActivity = false;
28190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
2820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailWidth = -1;
2830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailHeight = -1;
2840aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
285742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private int mCurrentUser;
286742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG;
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
29429ba7e66804e91cbd05fed74893061b4971ec52bDianne Hackborn    static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7;
295162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn    static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 8;
296755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 9;
297755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
298755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    static class ScheduleDestroyArgs {
299755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final ProcessRecord mOwner;
300755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final boolean mOomAdj;
301755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        final String mReason;
302755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        ScheduleDestroyArgs(ProcessRecord owner, boolean oomAdj, String reason) {
303755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOwner = owner;
304755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mOomAdj = oomAdj;
305755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            mReason = reason;
306755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        }
307755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
308755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Handler mHandler = new Handler() {
31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //public Handler() {
31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //}
31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        public void handleMessage(Message msg) {
31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            switch (msg.what) {
3164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                case SLEEP_TIMEOUT_MSG: {
3178e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    synchronized (mService) {
3188e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        if (mService.isSleeping()) {
3198e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
3208e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            mSleepTimeout = true;
3218e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            checkReadyForSleepLocked();
3228e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        }
3234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    }
3244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } break;
32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case PAUSE_TIMEOUT_MSG: {
326be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
329be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity pause timeout for " + r);
3302a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3312a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.app != null) {
3322a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.pauseTime,
3332a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "pausing " + r);
3342a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3352a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3362a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
337be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityPaused(r != null ? r.appToken : null, true);
33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_TIMEOUT_MSG: {
34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        nmsg.obj = msg.obj;
34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
349be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
350be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity idle timeout for " + r);
351be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, true, null);
35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
3532a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                case LAUNCH_TICK_MSG: {
3542a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
3552a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3562a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.continueLaunchTickingLocked()) {
3572a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.launchTickTime,
3582a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "launching " + r);
3592a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3602a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3612a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                } break;
36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case DESTROY_TIMEOUT_MSG: {
363be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
366be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity destroy timeout for " + r);
367be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityDestroyed(r != null ? r.appToken : null);
36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_NOW_MSG: {
370be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
371be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, false, null);
37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case LAUNCH_TIMEOUT_MSG: {
37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT);
37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mLaunchingActivity.isHeld()) {
38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mLaunchingActivity.release();
38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case RESUME_TOP_ACTIVITY_MSG: {
38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
392162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                case STOP_TIMEOUT_MSG: {
393162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
394162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
395162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // so we need to be conservative and assume it isn't.
396162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    Slog.w(TAG, "Activity stop timeout for " + r);
397162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    synchronized (mService) {
398162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        if (r.isInHistory()) {
399162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            activityStoppedLocked(r, null, null, null);
400162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        }
401162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
402162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } break;
403755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                case DESTROY_ACTIVITIES_MSG: {
404755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj;
405755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    synchronized (mService) {
406755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        destroyActivitiesLocked(args.mOwner, args.mOomAdj, args.mReason);
407755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    }
408755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                }
40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    };
41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService = service;
41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mContext = context;
41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mMainStack = mainStack;
41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PowerManager pm =
41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            (PowerManager)context.getSystemService(Context.POWER_SERVICE);
41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity.setReferenceCounted(false);
42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
4235962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner
4245962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner    private boolean okToShow(ActivityRecord r) {
4255962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner        return r.userId == mCurrentUser
4265962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                || (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0;
4275962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner    }
4285962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner
42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
4335962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner            if (!r.finishing && r != notTop && okToShow(r)) {
43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
4455962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner            if (!r.finishing && !r.delayedResume && r != notTop && okToShow(r)) {
44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is a simplified version of topRunningActivityLocked that provides a number of
45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param token If non-null, any history records matching this token will be skipped.
45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns the HistoryRecord of the next activity on the stack.
46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: the taskId check depends on real taskId fields being non-zero
467259d5e56a82d721ccb7e7f514c80de69acae309eAmith Yamasani            if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)
4685962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                    && okToShow(r)) {
46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int indexOfTokenLocked(IBinder token) {
477be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(ActivityRecord.forToken(token));
478be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
479be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
480be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final int indexOfActivityLocked(ActivityRecord r) {
481be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(r);
482ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
484ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final ActivityRecord isInStackLocked(IBinder token) {
485be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ActivityRecord r = ActivityRecord.forToken(token);
486be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        if (mHistory.contains(r)) {
487be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return r;
488ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
489ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        return null;
49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean updateLRUListLocked(ActivityRecord r) {
49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadit = mLRUActivities.remove(r);
49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLRUActivities.add(r);
49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return hadit;
49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the top activity in any existing task matching the given
50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Intent.  Returns null if no such task is found.
50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        TaskRecord cp = null;
50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
510f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        final int userId = UserHandle.getUserId(info.applicationInfo.uid);
51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
514742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (!r.finishing && r.task != cp && r.userId == userId
51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                cp = r.task;
51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + "/aff=" + r.task.affinity + " to new cls="
51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.task.affinity != null) {
52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.task.affinity.equals(info.taskAffinity)) {
52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        //Slog.i(TAG, "Found matching affinity!");
52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return r;
52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.intent != null
52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.intent.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                } else if (r.task.affinityIntent != null
53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.affinityIntent.getComponent().equals(cls)) {
53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the first activity (starting from the top of the stack) that
54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is the same as the given activity.  Returns null if no such activity
54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is found.
54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
554f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        final int userId = UserHandle.getUserId(info.applicationInfo.uid);
55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
560742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.intent.getComponent().equals(cls) && r.userId == userId) {
56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
57236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    final void showAskCompatModeDialogLocked(ActivityRecord r) {
57336cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        Message msg = Message.obtain();
57436cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
57536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.obj = r.task.askedCompatMode ? null : r;
57636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        mService.mHandler.sendMessage(msg);
57736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    }
57836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn
579742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /*
580742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * Move the activities around in the stack to bring a user to the foreground.
581742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * @return whether there are any activities for the specified user.
582742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     */
5835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    final boolean switchUserLocked(int userId, UserStartedState uss) {
5845dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        mCurrentUser = userId;
5855dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        mStartingUsers.add(uss);
586742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
5875dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        // Only one activity? Nothing to do...
5885dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        if (mHistory.size() < 2)
5895dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            return false;
590742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
5915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        boolean haveActivities = false;
5925dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        // Check if the top activity is from the new user.
5935dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        ActivityRecord top = mHistory.get(mHistory.size() - 1);
5945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        if (top.userId == userId) return true;
5955dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        // Otherwise, move the user's activities to the top.
5965dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        int N = mHistory.size();
5975dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        int i = 0;
5985dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        while (i < N) {
5995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            ActivityRecord r = mHistory.get(i);
6005dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (r.userId == userId) {
6015dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                ActivityRecord moveToTop = mHistory.remove(i);
6025dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                mHistory.add(moveToTop);
6035dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                // No need to check the top one now
6045dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                N--;
6055dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                haveActivities = true;
6065dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            } else {
6075dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                i++;
608742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
609742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
6105dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        // Transition from the old top to the new top
6115dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        resumeTopActivityLocked(top);
6125dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        return haveActivities;
613742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
614742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean realStartActivityLocked(ActivityRecord r,
61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord app, boolean andResume, boolean checkConfig)
61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throws RemoteException {
61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(app, 0);
620be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.setAppVisibility(r.appToken, true);
62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6222a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        // schedule launch ticks to collect information about slow apps.
6232a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.startLaunchTickingLocked();
6242a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Have the window manager re-evaluate the orientation of
62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the screen based on the new activity order.  Note that
62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // as a result of this, it can call back into the activity
62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // manager with a new orientation.  We don't care about that,
62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because the activity is not currently running so we are
63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // just restarting it anyway.
63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (checkConfig) {
63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mConfiguration,
634be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
635813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn            mService.updateConfigurationLocked(config, r, false, false);
63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.app = app;
6390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        app.waitingToKill = null;
64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Launching: " + r);
64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int idx = app.activities.indexOf(r);
64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (idx < 0) {
64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.add(r);
64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
647b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        mService.updateLruProcessLocked(app, true);
64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (app.thread == null) {
65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                throw new RemoteException();
65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<ResultInfo> results = null;
65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<Intent> newIntents = null;
65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                results = r.results;
65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                newIntents = r.newIntents;
65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " icicle=" + r.icicle
66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " with results=" + results + " newIntents=" + newIntents
66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " andResume=" + andResume);
66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
665b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        r.userId, System.identityHashCode(r),
66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.task.taskId, r.shortComponentName);
66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.isHomeActivity) {
66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mHomeProcess = app;
67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
6724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.sleeping = false;
673e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
67436cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn            showAskCompatModeDialogLocked(r);
6758ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
67662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile = null;
67762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            ParcelFileDescriptor profileFd = null;
67862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean profileAutoStop = false;
67962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
68062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (mService.mProfileProc == null || mService.mProfileProc == app) {
68162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.mProfileProc = app;
68262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFile = mService.mProfileFile;
68362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = mService.mProfileFd;
68462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop = mService.mAutoStopProfiler;
68562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
68662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
687f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn            app.hasShownUi = true;
688c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            app.pendingUiClean = true;
68962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFd != null) {
69062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                try {
69162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = profileFd.dup();
69262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                } catch (IOException e) {
69362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = null;
69462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
69562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
696be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
697813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    System.identityHashCode(r), r.info,
698813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    new Configuration(mService.mConfiguration),
69958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    r.compat, r.icicle, results, newIntents, !andResume,
70062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.isNextTransitionForward(), profileFile, profileFd,
70162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop);
70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
70354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Note that the package
70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // manager will ensure that only activity can run in the main
70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // process of the .apk, which is the only thing that will be
70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // considered heavy-weight.
70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (app.processName.equals(app.info.packageName)) {
70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null
71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && mService.mHeavyWeightProcess != app) {
71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Log.w(TAG, "Starting new heavy weight process " + app
71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " when already running "
71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + mService.mHeavyWeightProcess);
71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = app;
71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Message msg = mService.mHandler.obtainMessage(
71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    msg.obj = r;
71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendMessage(msg);
72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.launchFailed) {
72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second time we failed -- finish activity
72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and give up.
72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.e(TAG, "Second failure launching "
72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + r.intent.getComponent().flattenToShortString()
72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + ", giving up", e);
73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.appDiedLocked(app, app.pid, app.thread);
731be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
7322d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                        "2nd-crash", false);
73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return false;
73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This is the first time we failed -- restart process and
73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // retry.
73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.remove(r);
73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw e;
74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.launchFailed = false;
74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (updateLRUListLocked(r)) {
74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r
74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                  + " being launched, but already in LRU list");
74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // As part of the process of launching, ActivityThread also performs
75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // a resume.
75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.RESUMED;
752ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r
753ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting new instance)");
75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = false;
75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = r;
75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.task.touchActiveTime();
75788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
75888819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(r.task);
75988819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            completeResumeLocked(r);
7614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
76298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not starting in the resumed state... which
76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should look like we asked it to pause+stop (but remain visible),
76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and it has done so and reported back the current icicle and
76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // other state.
768ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
769ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting in stopped state)");
77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPED;
77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = true;
77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Launch the new version setup screen if needed.  We do this -after-
77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // launching the initial activity (that is, home), so that it can have
77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a chance to initialize itself while in the background, making the
77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // switch back to it faster and look better.
77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.startSetupActivityLocked();
78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startSpecificActivityLocked(ActivityRecord r,
78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean andResume, boolean checkConfig) {
78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Is this activity's application already running?
78850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.info.applicationInfo.uid);
79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7910dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        if (r.launchTime == 0) {
7920dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            r.launchTime = SystemClock.uptimeMillis();
79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mInitialStartTime == 0) {
7940dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mInitialStartTime = r.launchTime;
79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mInitialStartTime == 0) {
79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mInitialStartTime = SystemClock.uptimeMillis();
79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (app != null && app.thread != null) {
80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
8026c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                app.addPackage(r.info.packageName);
80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                realStartActivityLocked(r, app, andResume, checkConfig);
80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception when starting activity "
80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + r.intent.getComponent().flattenToShortString(), e);
80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If a dead object exception was thrown -- fall through to
81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // restart the application.
81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
815a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn                "activity", r.intent.getComponent(), false, false);
81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void stopIfSleepingLocked() {
8194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.isSleeping()) {
82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mGoingToSleep.isHeld()) {
82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mGoingToSleep.acquire();
82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mLaunchingActivity.isHeld()) {
82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
8274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG);
8294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT);
8304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void awakeFromSleepingLocked() {
8354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mSleepTimeout = false;
8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
8384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
8394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        // Ensure activities are no longer sleeping.
8414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
8420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.setSleeping(false);
8444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.clear();
8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void activitySleptLocked(ActivityRecord r) {
8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        checkReadyForSleepLocked();
8514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void checkReadyForSleepLocked() {
8544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mService.isSleeping()) {
8554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Do not care.
8564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            return;
8574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mSleepTimeout) {
8604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mResumedActivity != null) {
8614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still have something resumed; can't sleep until it is paused.
8624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity);
86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, true);
8654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
867621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity != null) {
8684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still waiting for something to pause; can't sleep yet.
869621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity);
8704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mStoppingActivities.size() > 0) {
8744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to stop; can't sleep yet.
8754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
8764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mStoppingActivities.size() + " activities");
87780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                scheduleIdleLocked();
8784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            ensureActivitiesVisibleLocked(null, 0);
8824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Make sure any stopped but visible activities are now sleeping.
8844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // This ensures that the activity's onStop() is called.
8854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            for (int i=mHistory.size()-1; i>=0; i--) {
8860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord r = mHistory.get(i);
8874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
8884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
8894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
8904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mGoingToSleepActivities.size() > 0) {
8934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to sleep; can't sleep yet.
8944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
8954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mGoingToSleepActivities.size() + " activities");
8964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
8994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
9004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
9014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
9024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
9034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
9044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
9054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.mShuttingDown) {
9064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mService.notifyAll();
9074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
90959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
910d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public final Bitmap screenshotActivities(ActivityRecord who) {
911ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        if (who.noDisplay) {
912ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn            return null;
913ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        }
914ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn
9150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Resources res = mService.mContext.getResources();
9160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int w = mThumbnailWidth;
9170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int h = mThumbnailHeight;
9180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w < 0) {
9190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailWidth = w =
9200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
9210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailHeight = h =
9220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
9230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
9250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w > 0) {
92659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            return mService.mWindowManager.screenshotApplications(who.appToken,
92759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                    Display.DEFAULT_DISPLAY, w, h);
9280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
9290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return null;
9300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
9310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
933621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
934621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            RuntimeException e = new RuntimeException();
935621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            Slog.e(TAG, "Trying to pause when pause is already pending for "
936621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                  + mPausingActivity, e);
937621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord prev = mResumedActivity;
93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev == null) {
94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            RuntimeException e = new RuntimeException();
94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
945ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);
946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mResumedActivity = null;
948621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        mPausingActivity = prev;
94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLastPausedActivity = prev;
95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.state = ActivityState.PAUSING;
95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.task.touchActiveTime();
952f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        prev.updateThumbnail(screenshotActivities(prev), null);
95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateCpuStats();
95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.app.thread != null) {
95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
960b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        prev.userId, System.identityHashCode(prev),
96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        prev.shortComponentName);
962be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
963be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        userLeaving, prev.configChangeFlags);
96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.updateUsageStats(prev, false);
96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Ignore exception, if process died other code will cleanup.
96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
970621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                mPausingActivity = null;
97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mLastPausedActivity = null;
97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
974621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLastPausedActivity = null;
97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not going to sleep, we want to ensure the device is
97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // awake until the next activity is started.
98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mService.mSleeping && !mService.mShuttingDown) {
98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLaunchingActivity.acquire();
98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // To be safe, don't allow the wake lock to be held for too long.
98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT);
98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
989621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
990621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager pause its key dispatching until the new
99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity has started.  If we're pausing the activity just because
99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen is being turned off and the UI is sleeping, don't interrupt
99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // key dispatch; the same activity will pick it up again on wakeup.
99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!uiSleeping) {
996621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev.pauseKeyDispatchingLocked();
99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Schedule a pause timeout in case the app doesn't respond.
100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We don't give it much time because this directly impacts the
100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // responsiveness seen by the user.
100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = prev;
10062a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            prev.pauseTime = SystemClock.uptimeMillis();
100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity failed to schedule the
101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // pause, so just treat it as being paused now.
101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
1013621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(null);
101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
1016ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn
1017ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn    final void activityResumed(IBinder token) {
1018ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn        ActivityRecord r = null;
1019ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn
1020ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn        synchronized (mService) {
1021ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            int index = indexOfTokenLocked(token);
1022ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            if (index >= 0) {
1023ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                r = mHistory.get(index);
1024ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; dropping state of: " + r);
1025ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                r.icicle = null;
1026ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                r.haveState = false;
1027ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            }
1028ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn        }
1029ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn    }
1030ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn
10310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    final void activityPaused(IBinder token, boolean timeout) {
103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(
10330aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = null;
103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(token);
103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
10400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                r = mHistory.get(index);
104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
1042621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (mPausingActivity == r) {
1043ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
1044ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                            + (timeout ? " (due to timeout)" : " (pause complete)"));
104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.state = ActivityState.PAUSED;
1046621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    completePauseLocked();
104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
1049b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                            r.userId, System.identityHashCode(r), r.shortComponentName,
1050621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            mPausingActivity != null
1051621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                                ? mPausingActivity.shortComponentName : "(none)");
105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1057ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail,
1058ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            CharSequence description) {
1059b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        if (r.state != ActivityState.STOPPING) {
1060b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            Slog.i(TAG, "Activity reported stop, but no longer stopping: " + r);
1061b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1062b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            return;
1063b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        }
106498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle);
1065162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (icicle != null) {
1066162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // If icicle is null, this is happening due to a timeout, so we
1067162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            // haven't really saved the state.
1068162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.icicle = icicle;
1069162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.haveState = true;
1070162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.updateThumbnail(thumbnail, description);
1071162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        }
1072162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        if (!r.stopped) {
1073162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
1074162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
1075162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.stopped = true;
1076162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn            r.state = ActivityState.STOPPED;
10776e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            if (r.finishing) {
10786e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn                r.clearOptionsLocked();
10796e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn            } else {
1080162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                if (r.configDestroy) {
1081162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    destroyActivityLocked(r, true, false, "stop-config");
1082162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    resumeTopActivityLocked(null);
1083162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                } else {
1084162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // Now that this process has stopped, we may want to consider
1085162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // it to be the previous app to try to keep around in case
1086162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    // the user wants to return to it.
1087162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    ProcessRecord fgApp = null;
1088162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (mResumedActivity != null) {
1089162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mResumedActivity.app;
1090162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    } else if (mPausingActivity != null) {
1091162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        fgApp = mPausingActivity.app;
1092162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
1093162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    if (r.app != null && fgApp != null && r.app != fgApp
1094162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
1095162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                            && r.app != mService.mHomeProcess) {
1096162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcess = r.app;
1097162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                        mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
1098162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                    }
109950685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
1100ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1101ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
1102ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
1103ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
1104621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    private final void completePauseLocked() {
1105621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        ActivityRecord prev = mPausingActivity;
110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1108621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1109621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (prev.finishing) {
1110621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
11112d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false);
1112621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else if (prev.app != null) {
1113621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
1114621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.waitingVisible) {
1115621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    prev.waitingVisible = false;
1116621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mWaitingVisibleActivities.remove(prev);
1117621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
1118621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            TAG, "Complete pause, no longer waiting: " + prev);
1119621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                }
1120621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.configDestroy) {
1121621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // The previous is being paused because the configuration
1122621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // is changing, which means it is actually stopping...
1123621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // To juggle the fact that we are also starting a new
1124621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // instance right now, we need to first completely stop
1125621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // the current instance before starting the new one.
1126621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
1127621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    destroyActivityLocked(prev, true, false, "pause-config");
112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
1129621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mStoppingActivities.add(prev);
1130621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (mStoppingActivities.size() > 3) {
1131621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // If we already have a few activities waiting to stop,
1132621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // then give up on things going idle and start clearing
1133621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // them out.
1134621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
1135621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        scheduleIdleLocked();
1136621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    } else {
1137621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        checkReadyForSleepLocked();
1138621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    }
113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1140621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else {
1141621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
1142621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = null;
114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
1144621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1147621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (!mService.isSleeping()) {
1148621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(prev);
1149621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        } else {
11504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
1151cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            ActivityRecord top = topRunningActivityLocked(null);
1152cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            if (top == null || (prev != null && top != prev)) {
1153cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                // If there are no more activities available to run,
1154cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                // do resume anyway to start something.  Also if the top
1155cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                // activity on the stack is not the just paused activity,
1156cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                // we need to go ahead and resume it to ensure we complete
1157cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                // an in-flight app switch.
115842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
115942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1161621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
1162621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1163621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            prev.resumeKeyDispatchingLocked();
1164621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.cpuTimeAtResume > 0
116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mService.mBatteryStatsService.isOnBattery()) {
116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long diff = 0;
116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid)
117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        - prev.cpuTimeAtResume;
117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (diff > 0) {
117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (bsi) {
117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    BatteryStatsImpl.Uid.Proc ps =
117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            prev.info.packageName);
117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (ps != null) {
118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ps.addForegroundTimeLocked(diff);
118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.cpuTimeAtResume = 0; // reset it
118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Once we know that we have asked an application to put an activity in
119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the resumed state (either by launching it or explicitly telling it),
119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * this function updates the rest of our state to match that fact.
119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void completeResumeLocked(ActivityRecord next) {
119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.idle = false;
119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.results = null;
119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.newIntents = null;
119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // schedule an idle timeout in case the app doesn't do it for us.
119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        msg.obj = next;
120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (false) {
120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity was never told to pause, so just keep
120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // things going as-is.  To maintain our own state,
120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we need to emulate it coming back and saying it is
120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // idle.
120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg = mHandler.obtainMessage(IDLE_NOW_MSG);
120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = next;
121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessage(msg);
121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.reportResumedActivityLocked(next);
121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
121615491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn
121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.setFocusedActivityLocked(next);
121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1220621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        next.resumeKeyDispatchingLocked();
122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ensureActivitiesVisibleLocked(null, 0);
122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.executeAppTransition();
122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mNoAnimActivities.clear();
122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Mark the point when the activity is resuming
122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // TODO: To be more accurate, the mark should be before the onCreate,
122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //       not after the onResume. But for subsequent starts, onResume is fine.
122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null) {
122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process
123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure that all activities that need to be visible (that is, they
123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * currently can be seen by the user) actually are.
124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord top,
124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord starting, String onlyThisProcess, int configChanges) {
124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_VISBILITY) Slog.v(
124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "ensureActivitiesVisible behind " + top
124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " configChanges=0x" + Integer.toHexString(configChanges));
124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is not fullscreen, then we need to
124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure any activities under it are now visible.
124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int count = mHistory.size();
125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = count-1;
125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (mHistory.get(i) != top) {
125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r;
125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean behindFullscreen = false;
125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (; i>=0; i--) {
12570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make visible? " + r + " finishing=" + r.finishing
126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state);
126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean doThisProcess = onlyThisProcess == null
126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || onlyThisProcess.equals(r.processName);
126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // First: if this is not the current activity being started, make
126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // sure it matches the current configuration.
127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != starting && doThisProcess) {
127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivityConfigurationLocked(r, 0);
127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == null || r.app.thread == null) {
127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (onlyThisProcess == null
127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        || onlyThisProcess.equals(r.processName)) {
127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // This activity needs to be visible, but isn't even
127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // running...  get it started, but don't resume it
127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // at this point.
128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Start and freeze screen for " + r);
128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.startFreezingScreenLocked(r.app, configChanges);
128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!r.visible) {
128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Starting and making visible: " + r);
1288be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        startSpecificActivityLocked(r, false, false);
129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (r.visible) {
129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is already visible, then there is nothing
129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // else to do here.
129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Skipping: already visible at " + r);
130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopFreezingScreenLocked(false);
130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (onlyThisProcess == null) {
130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This activity is not currently visible, but is running.
130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Tell it to become visible.
130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.visible = true;
130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state != ActivityState.RESUMED && r != starting) {
130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is paused, tell it
130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to now show its window.
130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Making visible and scheduling visibility: " + r);
131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    try {
1312be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
13134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        r.sleeping = false;
1314905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                        r.app.pendingUiClean = true;
1315be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.app.thread.scheduleWindowVisibility(r.appToken, true);
131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.stopFreezingScreenLocked(false);
131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } catch (Exception e) {
131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Just skip on any failure; we'll make it
131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // visible when it next restarts.
132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Slog.w(TAG, "Exception thrown making visibile: "
132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + r.intent.getComponent(), e);
132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Aggregate current change flags.
132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            configChanges |= r.configChangeFlags;
132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.fullscreen) {
133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // At this point, nothing else needs to be shown
133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping: fullscreen at " + r);
133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                behindFullscreen = true;
133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now for any activities that aren't visible to the user, make
134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // sure they no longer are keeping the screen frozen.
134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
13420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state
134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " behindFullscreen=" + behindFullscreen);
134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (behindFullscreen) {
134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.visible) {
135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Making invisible: " + r);
135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.visible = false;
135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
1354be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppVisibility(r.appToken, false);
135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if ((r.state == ActivityState.STOPPING
135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    || r.state == ActivityState.STOPPED)
135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    && r.app != null && r.app.thread != null) {
135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (DEBUG_VISBILITY) Slog.v(
135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        TAG, "Scheduling invisibility: " + r);
1360be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                r.app.thread.scheduleWindowVisibility(r.appToken, false);
136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (Exception e) {
136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Just skip on any failure; we'll make it
136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // visible when it next restarts.
136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Exception thrown making hidden: "
136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + r.intent.getComponent(), e);
136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Already invisible: " + r);
137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.fullscreen) {
137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Now behindFullscreen: " + r);
137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    behindFullscreen = true;
137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Version of ensureActivitiesVisible that can easily be called anywhere.
138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord starting,
138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int configChanges) {
138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = topRunningActivityLocked(null);
138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r != null) {
138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ensureActivitiesVisibleLocked(r, starting, null, configChanges);
139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Ensure that the top activity in the stack is resumed.
139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param prev The previously resumed activity, for when in the process
139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of pausing; can be null to call from elsewhere.
139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if something is being resumed, or false if
140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * nothing happened.
140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev) {
140384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        return resumeTopActivityLocked(prev, null);
140484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    }
140584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
140684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Find the first activity that is not finishing.
140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord next = topRunningActivityLocked(null);
140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remember how we'll process this pause/resume situation, and ensure
141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the state is reset however we wind up proceeding.
141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean userLeaving = mUserLeaving;
141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = false;
141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next == null) {
141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are no more activities!  Let's just start up the
141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Launcher...
141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
141984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                ActivityOptions.abort(options);
14205dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                return mService.startHomeActivityLocked(mCurrentUser);
142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.delayedResume = false;
142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is the resumed one, nothing to do.
142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == next && next.state == ActivityState.RESUMED) {
142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
143284375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are sleeping, and there is no resumed activity, and the top
143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity is paused, well that is the state we want.
143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((mService.mSleeping || mService.mShuttingDown)
1439dbad287b62966399d0d5029f3b10932895010337p                && mLastPausedActivity == next
1440dbad287b62966399d0d5029f3b10932895010337p                && (next.state == ActivityState.PAUSED
1441dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPED
1442dbad287b62966399d0d5029f3b10932895010337p                    || next.state == ActivityState.STOPPING)) {
144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
144784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn            ActivityOptions.abort(options);
144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
145080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
145180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // Make sure that the user who owns this activity is started.  If not,
145280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // we will just leave it as is because someone should be bringing
145380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        // another user's activities to the top of the stack.
145480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        if (mService.mStartedUsers.get(next.userId) == null) {
145580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            Slog.w(TAG, "Skipping resume of top activity " + next
145680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                    + ": user " + next.userId + " is stopped");
145780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            return false;
145880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        }
145980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn
146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // The activity may be waiting for stop, but that is no longer
146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // appropriate for it.
146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(next);
14634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(next);
14644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        next.sleeping = false;
146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(next);
146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
146784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn        next.updateOptionsLocked(options);
146884375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn
146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1471621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // If we are currently pausing an activity, then don't do anything
1472621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // until that is done.
1473621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
1474cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG,
1475cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    "Skip resume: pausing=" + mPausingActivity);
1476621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            return false;
1477621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
1478621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
14790dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // Okay we are now going to start a switch, to 'next'.  We may first
14800dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // have to pause the current activity, but this is an important point
14810dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // where we have decided to go to 'next' so keep track of that.
1482034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // XXX "App Redirected" dialog is getting too many false positives
1483034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // at this point, so turn off for now.
1484034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        if (false) {
1485034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn            if (mLastStartedActivity != null && !mLastStartedActivity.finishing) {
1486034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                long now = SystemClock.uptimeMillis();
1487034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final boolean inTime = mLastStartedActivity.startTime != 0
1488034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && (mLastStartedActivity.startTime + START_WARN_TIME) >= now;
1489034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int lastUid = mLastStartedActivity.info.applicationInfo.uid;
1490034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int nextUid = next.info.applicationInfo.uid;
1491034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                if (inTime && lastUid != nextUid
1492034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && lastUid != next.launchedFromUid
1493034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && mService.checkPermission(
1494034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                android.Manifest.permission.STOP_APP_SWITCHES,
1495034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                -1, next.launchedFromUid)
1496034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
1497034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mService.showLaunchWarningLocked(mLastStartedActivity, next);
1498034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                } else {
1499034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    next.startTime = now;
1500034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mLastStartedActivity = next;
1501034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                }
15020dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            } else {
1503034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                next.startTime = SystemClock.uptimeMillis();
15040dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mLastStartedActivity = next;
15050dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            }
15060dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        }
15070dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We need to start pausing the current activity so the top one
150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can be resumed...
151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity != null) {
151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
1512ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            // At this point we want to put the upcoming activity's process
1513ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            // at the top of the LRU list, since we know we will be needing it
1514ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            // very soon and it would be a waste to let it get killed if it
1515ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            // happens to be sitting towards the end.
1516ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            if (next.app != null && next.app.thread != null) {
1517ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                // No reason to do full oom adj update here; we'll let that
1518ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn                // happen whenever it needs to later.
1519b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                mService.updateLruProcessLocked(next.app, false);
1520ad9b32115bf8c84a93ab30e6f30f8c46e86d7244Dianne Hackborn            }
152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startPausingLocked(userLeaving, false);
152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1525d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // If the most recent activity was noHistory but was only stopped rather
1526d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // than stopped+finished because the device went to sleep, we need to make
1527d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        // sure to finish it as we're making a new activity topmost.
1528d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        final ActivityRecord last = mLastPausedActivity;
1529d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (mService.mSleeping && last != null && !last.finishing) {
1530d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            if ((last.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
1531d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    || (last.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
1532d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (DEBUG_STATES) {
1533d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    Slog.d(TAG, "no-history finish of " + last + " on new resume");
1534d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
1535d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null,
15362d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                        "no-history", false);
1537d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate            }
1538d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        }
1539d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate
154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null && prev != next) {
154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!prev.waitingVisible && next != null && !next.nowVisible) {
154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                prev.waitingVisible = true;
154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.add(prev);
154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(
154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Resuming top, waiting visible to hide: " + prev);
154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The next activity is already visible, so hide the previous
154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity's windows right now so we can show the new one ASAP.
154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We only do this if the previous is finishing, which should mean
155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it is on top of the one being resumed so hiding it quickly
155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is good.  Otherwise, we want to do the normal route of allowing
155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the resumed activity to be shown so we can decide if the
155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // previous should actually be hidden depending on whether the
155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // new one is found to be full-screen or not.
155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev.finishing) {
1556be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(prev.appToken, false);
155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + prev + ", waitingVisible="
155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + (prev != null ? prev.waitingVisible : null)
156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + ", nowVisible=" + next.nowVisible);
156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + prev + ", waitingVisible="
156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + (prev != null ? prev.waitingVisible : null)
156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", nowVisible=" + next.nowVisible);
156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1570e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Launching this app's activity, make sure the app is no longer
1571e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // considered stopped.
1572e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        try {
1573e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            AppGlobals.getPackageManager().setPackageStoppedState(
1574483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    next.packageName, false, next.userId); /* TODO: Verify if correct userid */
1575e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } catch (RemoteException e1) {
1576a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn        } catch (IllegalArgumentException e) {
1577a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn            Slog.w(TAG, "Failed trying to unstop package "
1578a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn                    + next.packageName + ": " + e);
1579e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
1580e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are starting up the next activity, so tell the window manager
158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the previous one will be hidden soon.  This way it can know
158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to ignore it when computing the desired screen orientation.
15847a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        boolean noAnim = false;
158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null) {
158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (prev.finishing) {
158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare close transition: prev=" + prev);
158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(prev)) {
15907da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
15917da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
15957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1597be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1598be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare open transition: prev=" + prev);
160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(next)) {
16037a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    noAnim = true;
16047da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
16057da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
16097da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (false) {
1613be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1614be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mHistory.size() > 1) {
161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: no previous");
161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mNoAnimActivities.contains(next)) {
16207a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                noAnim = true;
16217da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
16227da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, false);
162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
16247da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
16257da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
16287a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        if (!noAnim) {
16297a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.applyOptionsLocked();
16307a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        } else {
16317a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.clearOptionsLocked();
16327a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        }
163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null && next.app.thread != null) {
163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is now becoming visible.
1638be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(next.appToken, true);
163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16402a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            // schedule launch ticks to collect information about slow apps.
16412a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            next.startLaunchTickingLocked();
16422a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord lastResumedActivity = mResumedActivity;
164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityState lastState = next.state;
164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateCpuStats();
164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1648ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.state = ActivityState.RESUMED;
165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = next;
165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.task.touchActiveTime();
165288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
165388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(next.task);
165488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
1655b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn            mService.updateLruProcessLocked(next.app, true);
165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            updateLRUListLocked(next);
165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager re-evaluate the orientation of
165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen based on the new activity order.
166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean updated = false;
166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (mService) {
166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mConfiguration,
1665be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null);
166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (config != null) {
166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.frozenBeforeDestroy = true;
166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
1669813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    updated = mService.updateConfigurationLocked(config, next, false, false);
167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!updated) {
167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The configuration update wasn't able to keep the existing
167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity, and instead started a new one.
167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We should be all done, but let's just make sure our activity
167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is still at the top and schedule another run if something
167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // weird happened.
167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord nextNext = topRunningActivityLocked(null);
167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG,
168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Activity config changed during resume: " + next
168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", new next: " + nextNext);
168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (nextNext != next) {
168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Do over!
168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(next);
168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.executeAppTransition();
169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.clear();
169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Deliver all pending results.
169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList a = next.results;
169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (a != null) {
169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final int N = a.size();
170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!next.finishing && N > 0) {
170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_RESULTS) Slog.v(
170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Delivering results to " + next
170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + ": " + a);
1704be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        next.app.thread.scheduleSendResult(next.appToken, a);
170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (next.newIntents != null) {
1709be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
1713b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        next.userId, System.identityHashCode(next),
171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.task.taskId, next.shortComponentName);
171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                next.sleeping = false;
171736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn                showAskCompatModeDialogLocked(next);
1718905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                next.app.pendingUiClean = true;
1719be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                next.app.thread.scheduleResumeActivity(next.appToken,
172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.isNextTransitionForward());
172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17224eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                checkReadyForSleepLocked();
172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Whoops, need to restart this activity!
1726ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to "
1727ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + lastState + ": " + next);
172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.state = lastState;
172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mResumedActivity = lastResumedActivity;
173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.i(TAG, "Restarting because process died: " + next);
173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!next.hasBeenLaunched) {
173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.hasBeenLaunched = true;
173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (SHOW_APP_STARTING_PREVIEW && mMainStack) {
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                }
174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startSpecificActivityLocked(next, true, false);
174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // From this point on, if something goes wrong there is no way
174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to recover the activity.
175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.visible = true;
175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                completeResumeLocked(next);
175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If any exception gets thrown, toss away this
175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity and try the next one.
175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during resume of " + next, e);
1757be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
17582d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                        "resume-exception", true);
175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.stopped = false;
176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Whoops, need to restart this activity!
176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!next.hasBeenLaunched) {
176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.hasBeenLaunched = true;
176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (SHOW_APP_STARTING_PREVIEW) {
176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.setAppStartingWindow(
1770be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.appToken, next.packageName, next.theme,
17712f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            mService.compatibilityInfoForPackageLocked(
17722f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                    next.info.applicationInfo),
177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            next.nonLocalizedLabel,
17747eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            next.labelRes, next.icon, next.windowFlags,
17757eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            null, true);
177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startSpecificActivityLocked(next, true, true);
178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startActivityLocked(ActivityRecord r, boolean newTask,
17867a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            boolean doResume, boolean keepCurTransition, Bundle options) {
178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int NH = mHistory.size();
178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int addPos = -1;
179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!newTask) {
179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If starting in an existing task, find where that is...
179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean startIt = true;
179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (int i = NH-1; i >= 0; i--) {
17950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord p = mHistory.get(i);
179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.finishing) {
179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    continue;
179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.task == r.task) {
180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Here it is!  Now, if this is not yet visible to the
180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // user, then just add it without starting; it will
180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // get started when the user navigates back to it.
180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    addPos = i+1;
180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!startIt) {
180598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
180698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
180798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
180898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos,
180998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    here);
181098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(addPos, r);
1812f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        r.putInHistory();
1813be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
18145962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                                r.info.screenOrientation, r.fullscreen,
18155962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                                (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0);
181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
1817be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
18198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        ActivityOptions.abort(options);
182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    break;
182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.fullscreen) {
182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    startIt = false;
182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Place a new activity at top of stack, so it is next to interact
183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // with the user.
183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < 0) {
18330dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            addPos = NH;
183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not placing the new activity frontmost, we do not want
183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to deliver the onUserLeaving callback to the actual frontmost
183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity
183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < NH) {
184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mUserLeaving = false;
184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Slot the activity into the history stack and proceed
184598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
184698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
184798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
184898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here);
184998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(addPos, r);
1851f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        r.putInHistory();
185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frontOfTask = newTask;
185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (NH > 0) {
185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We want to show the starting preview window if we are
185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // switching to a new task, or the next activity's process is
185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // not currently running.
185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean showStartingIcon = newTask;
185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord proc = r.app;
185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null) {
186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null || proc.thread == null) {
186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                showStartingIcon = true;
186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: starting " + r);
186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
18687da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
18697da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(newTask
187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? WindowManagerPolicy.TRANSIT_TASK_OPEN
18747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
18777a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            r.updateOptionsLocked(options);
187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.addAppToken(
18795962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                    addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen,
18805962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                    (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0);
188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean doShow = true;
188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (newTask) {
188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Even though this activity is starting fresh, we still need
188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to reset it to make sure we apply affinities to move any
188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // existing activities from other tasks in to it.
188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller has requested that the target task be
188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // reset, then do so.
188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()
188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resetTaskIfNeededLocked(r, r);
189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    doShow = topRunningNonDelayedActivityLocked(null) == r;
189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (SHOW_APP_STARTING_PREVIEW && doShow) {
189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Figure out if we are transitioning from another activity that is
189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // "has the same starting icon" as the next one.  This allows the
189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // window manager to keep the previous window it had previously
189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // created, if it still had one.
189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord prev = mResumedActivity;
190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev != null) {
190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't want to reuse the previous starting preview if:
190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (1) The current activity is in a different task.
190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (prev.task != r.task) prev = null;
190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (2) The current activity is already displayed.
190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    else if (prev.nowVisible) prev = null;
190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.setAppStartingWindow(
1908be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.appToken, r.packageName, r.theme,
19092f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                        mService.compatibilityInfoForPackageLocked(
19102f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                r.info.applicationInfo), r.nonLocalizedLabel,
1911be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.labelRes, r.icon, r.windowFlags,
1912be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        prev != null ? prev.appToken : null, showStartingIcon);
191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this is the first activity, don't do any fancy animations,
191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // because there is nothing for it to animate on top of.
1917be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
19185962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                    r.info.screenOrientation, r.fullscreen,
19195962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner                    (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0);
19208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
1923be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (doResume) {
192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1931be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final void validateAppTokensLocked() {
1932be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.clear();
1933be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.ensureCapacity(mHistory.size());
1934be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        for (int i=0; i<mHistory.size(); i++) {
1935be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mValidateAppTokens.add(mHistory.get(i).appToken);
1936be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        }
1937be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.validateAppTokens(mValidateAppTokens);
1938be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
1939be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform a reset of the given task, if needed as part of launching it.
194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the new HistoryRecord at the top of the task.
194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord newActivity) {
194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean forceReset = (newActivity.info.flags
194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0;
1948621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (ACTIVITY_INACTIVE_RESET_TIME > 0
1949621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) {
195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((newActivity.info.flags
195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) {
195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                forceReset = true;
195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final TaskRecord task = taskTop.task;
195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are going to move through the history list so that we can look
195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // at each activity 'target' with 'below' either the interesting
196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity immediately below it in the stack or null.
196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord target = null;
196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int targetI = 0;
196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int taskTopI = -1;
196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int replyChainEnd = -1;
196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int lastReparentPos = -1;
19669622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn        ActivityOptions topOptions = null;
19679622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn        boolean canMoveOptions = true;
196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mHistory.size()-1; i>=-1; i--) {
19690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (below != null && below.finishing) {
197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
197404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            // Don't check any lower in the stack if we're crossing a user boundary.
197504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            if (below != null && below.userId != taskTop.userId) {
197604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                break;
197704e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            }
197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target == null) {
197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                target = below;
198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                targetI = i;
198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If we were in the middle of a reply chain before this
198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, it doesn't appear like the root of the chain wants
198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // anything interesting, so drop it.
198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                replyChainEnd = -1;
198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int flags = target.info.flags;
198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean finishOnTaskLaunch =
199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean allowTaskReparenting =
199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0;
199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target.task == task) {
199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of the task being reset...  we'll either
199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // finish this activity, push it out for another task,
199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // or leave it as-is.  We only do this
199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for activities that are not the root of the task (since
200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // if we finish the root, we may no longer have the task!).
200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTopI < 0) {
200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    taskTopI = targetI;
200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (below != null && below.task == task) {
200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final boolean clearWhenTaskReset =
200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (target.intent.getFlags()
200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0;
200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) {
200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity is sending a reply to a previous
201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, we can't do anything with it now until
201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // we reach the start of the reply chain.
201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // XXX note that we are assuming the result is always
201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to the previous activity, which is almost always
201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the case but we really shouldn't count on.
201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting
201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && target.taskAffinity != null
202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && !target.taskAffinity.equals(task.affinity)) {
202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity has an affinity for another
202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // task, then we need to move it out of here.  We will
202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // move it as far out of the way as possible, to the
202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // bottom of the activity stack.  This also keeps it
202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // correctly ordered with any activities we previously
202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // moved.
20270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(0);
202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (target.taskAffinity != null
202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && target.taskAffinity.equals(p.task.affinity)) {
203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // If the activity currently at the bottom has the
203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // same task affinity as the one we are moving,
203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // then merge it into the same task.
2033f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(p.task, p.thumbHolder, false);
203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to bottom task " + p.task);
203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mCurTask++;
203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (mService.mCurTask <= 0) {
203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                mService.mCurTask = 1;
204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
2041f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(new TaskRecord(mService.mCurTask, target.info, null),
2042f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                                    null, false);
204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            target.task.affinityIntent = target.intent;
204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to new task " + target.task);
204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2047be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(target.appToken, task.taskId);
204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int dstPos = 0;
2052f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        ThumbnailHolder curThumbHolder = target.thumbHolder;
20539622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                        boolean gotOptions = !canMoveOptions;
205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to target's task " + target.task);
2061f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            p.setTask(target.task, curThumbHolder, false);
2062f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            curThumbHolder = p.thumbHolder;
20639622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            canMoveOptions = false;
20649622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            if (!gotOptions && topOptions == null) {
20659622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                topOptions = p.takeOptionsLocked();
20669622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                if (topOptions != null) {
20679622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                    gotOptions = true;
20689622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                }
20699622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            }
207098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            if (DEBUG_ADD_REMOVE) {
207198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                RuntimeException here = new RuntimeException("here");
207298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                here.fillInStackTrace();
207398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
207498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                        + dstPos, here);
207598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            }
207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.remove(srcPos);
207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.add(dstPos, p);
2078be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.moveAppToken(dstPos, p.appToken);
2079be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            dstPos++;
208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (VALIDATE_TOKENS) {
2082be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                validateAppTokensLocked();
208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            i++;
208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (forceReset || finishOnTaskLaunch
209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || clearWhenTaskReset) {
209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the activity should just be removed -- either
209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // because it asks for it, or the task should be
209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cleared -- then finish it and anything that is
209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // part of its reply chain.
209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (clearWhenTaskReset) {
210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case, we want to finish this activity
210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // and everything above it, so be sneaky and pretend
210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // like these are all in the reply chain.
210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI+1;
210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            while (replyChainEnd < mHistory.size() &&
21050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                                    (mHistory.get(
210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                                replyChainEnd)).task == task) {
210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd++;
210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (replyChainEnd < 0) {
211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord p = null;
21149622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                        boolean gotOptions = !canMoveOptions;
211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
21160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
21209622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            canMoveOptions = false;
21219622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            if (!gotOptions && topOptions == null) {
21229622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                topOptions = p.takeOptionsLocked();
21239622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                if (topOptions != null) {
21249622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                    gotOptions = true;
21259622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                                }
21269622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                            }
212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (finishActivityLocked(p, srcPos,
21282d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                                    Activity.RESULT_CANCELED, null, "reset", false)) {
212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd--;
213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                srcPos--;
213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If we were in the middle of a chain, well the
214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity that started it all doesn't want anything
214350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // special, so leave it all as-is.
214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Reached the bottom of the task -- any reply chain
214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // should be left as-is.
214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2151ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2152ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (target.resultTo != null && (below == null
2153ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    || below.task == target.task)) {
215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is sending a reply to a previous
215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity, we can't do anything with it now until
215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we reach the start of the reply chain.
215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // XXX note that we are assuming the result is always
215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to the previous activity, which is almost always
215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the case but we really shouldn't count on.
216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (replyChainEnd < 0) {
216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = targetI;
216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (taskTopI >= 0 && allowTaskReparenting
216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity != null
216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity.equals(target.taskAffinity)) {
216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of another task...  if this activity has
216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // an affinity for our task, then either remove it if we are
216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // clearing or move it over to our task.  Note that
217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we currently punt on the case where we are resetting a
217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task that is not at the top but who has activities above
217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // with an affinity to it...  this is really not a normal
217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // case, and we will need to later pull that task to the front
217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and usually at that point we will do the reset and pick
217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up those remaining activities.  (This only happens if
217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // someone starts an activity in a new task from an activity
217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in a task that is not currently on top.)
217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (forceReset || finishOnTaskLaunch) {
217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord p = null;
2183ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index "
2184ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
21860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        p = mHistory.get(srcPos);
218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (finishActivityLocked(p, srcPos,
21912d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                                Activity.RESULT_CANCELED, null, "reset", false)) {
219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI--;
219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            srcPos--;
219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2203ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index "
2204ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) {
22060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(srcPos);
220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (lastReparentPos < 0) {
221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos = taskTopI;
221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = p;
221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
221698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
221798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
221898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
221998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
222098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    + lastReparentPos, here);
222198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.remove(srcPos);
2223f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        p.setTask(task, null, false);
222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(lastReparentPos, p);
222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
2226ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                                + " from " + srcPos + " to " + lastReparentPos
222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " in to resetting task " + task);
2228be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken);
2229be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
2231be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Now we've moved it in to place...  but what if this is
223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // a singleTop activity and we have put it on top of another
223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // instance of the same activity?  Then we drop the instance
223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // below so it remains singleTop.
224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int j=lastReparentPos-1; j>=0; j--) {
22420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            ActivityRecord p = mHistory.get(j);
224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (finishActivityLocked(p, j,
22482d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                                        Activity.RESULT_CANCELED, null, "replace", false)) {
224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    taskTopI--;
225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    lastReparentPos--;
225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                }
225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2256ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2257ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (below != null && below.task != target.task) {
2258ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // We hit the botton of a task; the reply chain can't
2259ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // pass through it.
2260ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                replyChainEnd = -1;
226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            target = below;
226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            targetI = i;
226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
22669622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn
22679622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn        if (topOptions != null) {
22689622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn            // If we got some ActivityOptions from an activity on top that
22699622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn            // was removed from the task, propagate them to the new real top.
22709622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn            if (taskTop != null) {
22719622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                taskTop.updateOptionsLocked(topOptions);
22729622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn            } else {
22739622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                topOptions.abort();
22749622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn            }
22759622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn        }
22769622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn
227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return taskTop;
227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clear operation as requested by
228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the
228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * stack to the given task, then look for
228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * an instance of that activity in the stack and, if found, finish all
228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities on top of it and return the instance.
228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param newR Description of the new activity being started.
2288621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @return Returns the old activity that should be continued to be used,
228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * or null if none was found.
229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord performClearTaskLocked(int taskId,
2292621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            ActivityRecord newR, int launchFlags) {
229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First find the requested task.
229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == taskId) {
230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i++;
230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now clear it.
230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
23080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId != taskId) {
231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return null;
231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.realActivity.equals(newR.realActivity)) {
231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Here it is!  Now finish everything in front...
231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord ret = r;
2318621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                while (i < (mHistory.size()-1)) {
2319621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    i++;
23200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    r = mHistory.get(i);
2321621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.task.taskId != taskId) {
2322621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
2323621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2324621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.finishing) {
2325621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
2326621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
23279622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                    ActivityOptions opts = r.takeOptionsLocked();
23289622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                    if (opts != null) {
23299622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                        ret.updateOptionsLocked(opts);
23309622ca4f8870f4e66ecb3ad771410620c950bb5cDianne Hackborn                    }
2331621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
23322d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                            null, "clear", false)) {
2333621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        i--;
233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Finally, if this is a normal launch mode (that is, not
233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // expecting onNewIntent()), then we will finish the current
233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity so a new fresh one can be started.
234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!ret.finishing) {
2343be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        int index = indexOfTokenLocked(ret.appToken);
234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (index >= 0) {
234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
23462d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                                    null, "clear", false);
234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return null;
234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return ret;
235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * Completely remove all activities associated with an existing
23610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * task starting at a specified index.
23620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     */
23630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private final void performClearTaskAtIndexLocked(int taskId, int i) {
2364eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn        while (i < mHistory.size()) {
23650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
23660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.task.taskId != taskId) {
23670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                // Whoops hit the end.
23680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return;
23690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.finishing) {
23710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
23730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
23752d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    null, "clear", false)) {
23760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
23770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
23780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
23790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
23800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
23810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    /**
2382621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Completely remove all activities associated with an existing task.
2383621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
2384621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    private final void performClearTaskLocked(int taskId) {
2385621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int i = mHistory.size();
2386621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2387621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // First find the requested task.
2388621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2389621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
23900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2391621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId == taskId) {
2392621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                i++;
2393621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                break;
2394621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2395621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2396621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
23970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Now find the start and clear it.
2398621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2399621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
24000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2401621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.finishing) {
2402621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                continue;
2403621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2404621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId != taskId) {
2405621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // We hit the bottom.  Now finish it all...
24060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                performClearTaskAtIndexLocked(taskId, i+1);
2407621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                return;
2408621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2409621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2410621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2411621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2412621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Find the activity in the history stack within the given task.  Returns
241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the index within the history at which it's found, or < 0 if not found.
241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final int findActivityInHistoryLocked(ActivityRecord r, int task) {
241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
24200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord candidate = mHistory.get(i);
242145a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            if (candidate.finishing) {
242245a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                continue;
242345a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn            }
242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.task.taskId != task) {
242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.realActivity.equals(r.realActivity)) {
242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return i;
242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return -1;
243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Reorder the history stack so that the activity at the given index is
243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * brought to the front.
243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord moveActivityToFrontLocked(int where) {
24400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord newTop = mHistory.remove(where);
244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size();
24420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord oldTop = mHistory.get(top-1);
244398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
244498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
244598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
244698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at "
244798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    + top, here);
244898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(top, newTop);
245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        oldTop.frontOfTask = false;
245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        newTop.frontOfTask = true;
245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return newTop;
245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityLocked(IApplicationThread caller,
2456a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode,
2458a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int callingPid, int callingUid, int startFlags, Bundle options,
2459621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity) {
2460efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2461a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        int err = ActivityManager.START_SUCCESS;
2462efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2463efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        ProcessRecord callerApp = null;
2464efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (caller != null) {
2465efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            callerApp = mService.getRecordForAppLocked(caller);
2466efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            if (callerApp != null) {
2467efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingPid = callerApp.pid;
2468efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingUid = callerApp.info.uid;
2469efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            } else {
2470efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                Slog.w(TAG, "Unable to find app for caller " + caller
2471efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + " (pid=" + callingPid + ") when starting: "
2472efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + intent.toString());
2473a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                err = ActivityManager.START_PERMISSION_DENIED;
2474efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            }
2475efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
2476efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2477a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS) {
2478f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
24795fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
24805fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
2481efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord sourceRecord = null;
248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultRecord = null;
248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(resultTo);
248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(
248898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Will send result to " + resultTo + " (index " + index + ")");
248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
24900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sourceRecord = mHistory.get(index);
249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (requestCode >= 0 && !sourceRecord.finishing) {
249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord = sourceRecord;
249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && sourceRecord != null) {
250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Transfer the result target from the source activity to the new
250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // one being started, including any failures.
250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (requestCode >= 0) {
25048078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                ActivityOptions.abort(options);
2505a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultRecord = sourceRecord.resultTo;
250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultWho = sourceRecord.resultWho;
250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            requestCode = sourceRecord.requestCode;
251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sourceRecord.resultTo = null;
251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord.removeResultsLocked(
251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sourceRecord, resultWho, requestCode);
251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2517a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find a class that can handle the given Intent.
251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // That's the end of that!
2520a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_INTENT_NOT_RESOLVED;
252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2523a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find the specific class specified in the Intent.
252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Also the end of the line.
2526a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_CLASS_NOT_FOUND;
252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2529a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err != ActivityManager.START_SUCCESS) {
253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
253590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
25368078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return err;
253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
254035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int startAnyPerm = mService.checkPermission(
254135be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey                START_ANY_ACTIVITY, callingPid, callingUid);
254235be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
25436c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
254435be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
255090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
25516c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            String msg;
25526c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            if (!aInfo.exported) {
25536c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
25546c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
25556c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
25566c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " not exported from uid " + aInfo.applicationInfo.uid;
25576c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            } else {
25586c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
25596c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
25606c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
25616c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " requires " + aInfo.permission;
25626c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            }
256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, msg);
256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw new SecurityException(msg);
256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mController != null) {
256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean abort = false;
257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The Intent we give to the watcher has the extra data
257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // stripped off, since it can contain private information.
257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Intent watchIntent = intent.cloneFilter();
257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    abort = !mService.mController.activityStarting(watchIntent,
257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo.applicationInfo.packageName);
257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (abort) {
258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (resultRecord != null) {
258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sendActivityResultLocked(-1,
258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resultRecord, resultWho, requestCode,
258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Activity.RESULT_CANCELED, null);
258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We pretend to the caller that it was really started, but
258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // they will just get a cancel result.
258890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
25898078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2590a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SUCCESS;
259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2594742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,
259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                intent, resolvedType, aInfo, mService.mConfiguration,
259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord, resultWho, requestCode, componentSpecified);
2598621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (outActivity != null) {
2599621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            outActivity[0] = r;
2600621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mResumedActivity == null
260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || mResumedActivity.info.applicationInfo.uid != callingUid) {
260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    PendingActivityLaunch pal = new PendingActivityLaunch();
260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.r = r;
260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.sourceRecord = sourceRecord;
2609a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    pal.startFlags = startFlags;
261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mPendingActivityLaunches.add(pal);
261190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
26128078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2613a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SWITCHES_CANCELED;
261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mDidAppSwitch) {
261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second allowed switch since we stopped switches,
261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // so now just generally allow switches.  Use case: user presses
262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // home (switches disabled, switch to home, mDidAppSwitch now true);
262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // user taps a home icon (coming from home so allowed, we hit here
262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and now allow anyone to switch again).
262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mAppSwitchesAllowedTime = 0;
262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mDidAppSwitch = true;
262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.doPendingActivityLaunchesLocked(false);
262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
263190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord,
26327a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                startFlags, true, options);
2633621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
263490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // Someone asked to have the keyguard dismissed on the next
263590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // activity start, but we are not actually doing an activity
263690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // switch...  just dismiss the keyguard now, because we
263790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // probably want to see whatever is behind it.
263890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
263990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
264090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
264190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        return err;
264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2644621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
2645621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((launchFlags &
2646621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2647621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2648621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // Caller wants to appear on home activity, so before starting
2649621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // their own activity we will bring home to the front.
2650621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontLocked();
2651621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2652621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2653621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r,
26557a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            ActivityRecord sourceRecord, int startFlags, boolean doResume,
26567a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            Bundle options) {
265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final Intent intent = r.intent;
265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int callingUid = r.launchedFromUid;
2659742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We'll invoke onUserLeaving before onPause only if the launching
266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity did not explicitly state that this is an automated launch.
266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_USER_LEAVING) Slog.v(TAG,
266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "startActivity() => mUserLeaving=" + mUserLeaving);
266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the caller has asked not to resume at this point, we make note
266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of this in the record so that we can skip it when trying to find
267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the top running activity.
267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!doResume) {
267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.delayedResume = true;
267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)
267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                != 0 ? r : null;
267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the onlyIfNeeded flag is set, then we can do this if the activity
267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // being launched is the same as the one making the call...  or, as
268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a special case, if we do not know the caller then we count the
268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current top activity as the caller.
2682a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord checkedCaller = sourceRecord;
268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (checkedCaller == null) {
268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                checkedCaller = topRunningNonDelayedActivityLocked(notTop);
268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!checkedCaller.realActivity.equals(r.realActivity)) {
268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Caller is not the same as launcher, so always needed.
2689a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sourceRecord == null) {
269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not being started from another...  in this
269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // case we -always- start a new task.
269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + intent);
269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The original activity who is starting us is running as a single
270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // instance...  this new activity it is starting must go on its
270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // own task.
270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity being started is a single instance...  it always
270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // gets launched into its own task.
271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // For whatever reason this activity is being launched into a new
271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // task...  yet the caller has requested a result back.  Well, that
271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // is pretty messed up, so instead immediately send back a cancel
271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and let the new task continue launched as normal without a
271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // dependency on its originator.
271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sendActivityResultLocked(-1,
272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.resultTo, r.resultWho, r.requestCode,
272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Activity.RESULT_CANCELED, null);
272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean addingToTask = false;
272703fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn        boolean movedHome = false;
2728621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord reuseTask = null;
272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If bring to front is requested, and no result is requested, and
273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we can find a task that was started with this same
273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // component, then instead of launching bring that one to the front.
273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo == null) {
273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // See if there is a task to bring to the front.  If this is
273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // a SINGLE_INSTANCE activity, there can be one and only one
273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of it in the history, and it is always in its own
274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // unique task, so we do a special search.
274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? findTaskLocked(intent, r.info)
274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        : findActivityLocked(intent, r.info);
274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTop != null) {
274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (taskTop.task.intent == null) {
274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // This task was started because of movement of
274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the activity based on affinity...  now that we
274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // are actually launching it, we can assign the
274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // base intent.
275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(intent, r.info);
275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the target task is not in the front, then we need
275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to bring it to the front...  except...  well, with
275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to have the same behavior as if a new instance was
275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // being started, which means not bringing it to the front
275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // if the caller is not itself in the front.
275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop);
275966a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru                    if (curTop != null && curTop.task != taskTop.task) {
276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        boolean callerAtFront = sourceRecord == null
276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                || curTop.task == sourceRecord.task;
276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (callerAtFront) {
276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // We really do want to push this one into the
276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // user's face, right now.
276603fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                            movedHome = true;
2767621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            moveHomeToFrontFromLaunchLocked(launchFlags);
27688078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            moveTaskToFrontLocked(taskTop.task, r, options);
276984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            options = null;
277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller has requested that the target task be
277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // reset, then do so.
277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop = resetTaskIfNeededLocked(taskTop, r);
277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2777a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED)  != 0) {
277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We don't need to start a new activity, and
277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the client said not to do anything if that
278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is the case, so this is it!  And for paranoia, make
278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
278384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
278484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
278584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2787a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2789621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if ((launchFlags &
2790621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
2791621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
2792621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // The caller has requested to completely replace any
27937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // existing task with its new activity.  Well that should
2794621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // not be too hard...
2795621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask = taskTop.task;
2796621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        performClearTaskLocked(taskTop.task.taskId);
2797621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask.setIntent(r.intent, r.info);
2798621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this situation we want to remove all activities
280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from the task up to the one being started.  In most
280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cases this means we are resetting the task to its
280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // initial state.
280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord top = performClearTaskLocked(
2806621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                taskTop.task.taskId, r, launchFlags);
280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (top != null) {
280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (top.frontOfTask) {
280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // Activity aliases may mean we use different
281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intents for the top activity, so make sure
281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the task now has the identity of the new
281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intent.
281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                top.task.setIntent(r.intent, r.info);
281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
281639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // A special case: we need to
281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // start the activity because it is not currently
282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // running, and the caller has asked to clear the
282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // current task to have this activity at the top.
282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Now pretend like this activity is being started
282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // by the top of its task, so it is put in the
282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // right place.
282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (r.realActivity.equals(taskTop.task.realActivity)) {
282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case the top activity on the task is the
283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // same as the one being launched, so we take that
283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // as a request to bring the task to the foreground.
283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the top activity in the task is the root
283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, deliver this new intent to it if it
283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // desires.
2835f363dfd26c304bca33f12065a9ed3de291193962Johan Viktorsson                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
2836f363dfd26c304bca33f12065a9ed3de291193962Johan Viktorsson                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && taskTop.realActivity.equals(r.realActivity)) {
283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (taskTop.frontOfTask) {
284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                taskTop.task.setIntent(r.intent, r.info);
284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
284239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            taskTop.deliverNewIntentLocked(callingUid, r.intent);
284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (!r.intent.filterEquals(taskTop.task.intent)) {
284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case we are launching the root activity
284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // of the task, but with a different intent.  We
284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // should start a new instance on top.
284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case an activity is being launched in to an
285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // existing task, without resetting that task.  This
285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is typically the situation of launching an activity
285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from a notification or shortcut.  We want to place
285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the new activity on top of the current task.
285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        addingToTask = true;
285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sourceRecord = taskTop;
285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!taskTop.task.rootWasReset) {
285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case we are launching in to an existing task
286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // that has not yet been started from its front door.
286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // The current task has been brought to the front.
286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Ideally, we'd probably like to place this new task
286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // at the bottom of its stack, but that's a little hard
286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to do with the current organization of the code so
286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // for now we'll just drop it.
286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(r.intent, r.info);
286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2868621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (!addingToTask && reuseTask == null) {
286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We didn't do anything...  but it was needed (a.k.a., client
287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // don't use that intent!)  And for paranoia, make
287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
287384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            resumeTopActivityLocked(null, options);
287484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                        } else {
287584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn                            ActivityOptions.abort(options);
287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2877a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_TASK_TO_FRONT;
287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //String uri = r.intent.toURI();
288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Intent intent2 = new Intent(uri);
288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "Given intent: " + r.intent);
288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "URI is: " + uri);
288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "To intent: " + intent2);
288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.packageName != null) {
289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity being launched is the same as the one currently
289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // at the top, then we need to check if it should only be launched
289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // once.
289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (top != null && r.resultTo == null) {
2895742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (top.app != null && top.app.thread != null) {
289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // For paranoia, make sure we have correctly
290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // resumed the top activity.
290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (doResume) {
290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                resumeTopActivityLocked(null);
290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
29068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                            ActivityOptions.abort(options);
2907a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // We don't need to start a new activity, and
290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the client said not to do anything if that
291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // is the case, so this is it!
2911a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
291339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
2914a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            return ActivityManager.START_DELIVERED_TO_TOP;
291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo != null) {
292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.resultTo, r.resultWho, r.requestCode,
292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
29268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
2927a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            return ActivityManager.START_CLASS_NOT_FOUND;
292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean newTask = false;
29317da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        boolean keepCurTransition = false;
293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Should this be considered a new task?
293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo == null && !addingToTask
293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2936621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (reuseTask == null) {
2937621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // todo: should do better management of integers.
2938621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mService.mCurTask++;
2939621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (mService.mCurTask <= 0) {
2940621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    mService.mCurTask = 1;
2941621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
2942f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true);
2943621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
2944621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        + " in new task " + r.task);
2945621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else {
2946f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(reuseTask, reuseTask, true);
294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newTask = true;
294903fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            if (!movedHome) {
295003fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn                moveHomeToFrontFromLaunchLocked(launchFlags);
295103fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn            }
295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord != null) {
295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!addingToTask &&
295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are adding the activity to an existing
295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, but the caller has asked to clear that task if the
295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity is already running.
295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord top = performClearTaskLocked(
2960621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        sourceRecord.task.taskId, r, launchFlags);
29617da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                keepCurTransition = true;
296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (top != null) {
296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
296439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // For paranoia, make sure we have correctly
296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // resumed the top activity.
296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
29708078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    ActivityOptions.abort(options);
2971a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (!addingToTask &&
297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are launching an activity in our own task
297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // that may already be running somewhere in the history, and
297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we want to shuffle it to the front of the stack if so.
297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (where >= 0) {
298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord top = moveActivityToFrontLocked(where);
298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
29827a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    top.updateOptionsLocked(options);
298339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2987a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // An existing activity is starting this new activity, so we want
299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to keep the new one in the same task as the one that is starting
299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it.
2993f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in existing task " + r.task);
299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This not being started from an existing activity, and not part
299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // of a new task...  just put it in the top task, though these days
300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this case should never happen.
300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int N = mHistory.size();
300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord prev =
30030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                N > 0 ? mHistory.get(N-1) : null;
3004f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(prev != null
3005621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    ? prev.task
3006f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                    : new TaskRecord(mService.mCurTask, r.info, intent), null, true);
300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in new guessed " + r.task);
300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
301039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
301139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
30127e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                intent, r.getUriPermissionsLocked());
301339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (newTask) {
3015b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
30187a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        startActivityLocked(r, newTask, doResume, keepCurTransition, options);
3019a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3022a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
3023483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            String profileFile, ParcelFileDescriptor profileFd, int userId) {
302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Collect information about the target of the Intent.
302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityInfo aInfo;
302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ResolveInfo rInfo =
302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                AppGlobals.getPackageManager().resolveIntent(
302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent, resolvedType,
303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        PackageManager.MATCH_DEFAULT_ONLY
3031483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = rInfo != null ? rInfo.activityInfo : null;
303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = null;
303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (aInfo != null) {
303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Store the found target back into the intent, because now that
303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we have it we never want to do this again.  For example, if the
304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // user navigates back to this point in the history, we should
304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // always restart the exact same activity.
304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            intent.setComponent(new ComponentName(
304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    aInfo.applicationInfo.packageName, aInfo.name));
304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Don't debug things in the system process
3046a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setDebugApp(aInfo.processName, true, false);
304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
305162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
3052a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
305392a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                if (!aInfo.processName.equals("system")) {
305492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
305592a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                }
305692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy            }
305792a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
305862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFile != null) {
305962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
306062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
3061a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            profileFile, profileFd,
3062a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
306362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
306462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
3066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return aInfo;
3067621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3068621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3069621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivityMayWait(IApplicationThread caller, int callingUid,
3070a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, IBinder resultTo,
3071a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            String resultWho, int requestCode, int startFlags, String profileFile,
3072a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
3073a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3074621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Refuse possible leaked file descriptors
3075621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intent != null && intent.hasFileDescriptors()) {
3076621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("File descriptors passed in Intent");
3077621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3078621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        boolean componentSpecified = intent.getComponent() != null;
3079621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Don't modify the client's object!
3081621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        intent = new Intent(intent);
3082621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3083621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Collect information about the target of the Intent.
3084a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
3085483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                profileFile, profileFd, userId);
308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid;
3089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (callingUid >= 0) {
3090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                callingPid = -1;
3091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else if (caller == null) {
309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = Binder.getCallingPid();
309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingUid = Binder.getCallingUid();
309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = callingUid = -1;
309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mConfigWillChange = config != null
309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && mService.mConfiguration.diff(config) != 0;
310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_CONFIGURATION) Slog.v(TAG,
310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Starting activity when config will change = " + mConfigWillChange);
310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final long origId = Binder.clearCallingIdentity();
310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack && aInfo != null &&
310654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Check to see if we already
310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // have another, different heavy-weight process running.
310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null &&
311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingPid = callingPid;
311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingUid = callingUid;
311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (caller != null) {
311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (callerApp != null) {
311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingPid = callerApp.pid;
311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingUid = callerApp.info.uid;
312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } else {
312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Slog.w(TAG, "Unable to find app for caller " + caller
312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + " (pid=" + realCallingPid + ") when starting: "
312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + intent.toString());
31248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                                ActivityOptions.abort(options);
3125a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_PERMISSION_DENIED;
312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        IIntentSender target = mService.getIntentSenderLocked(
3130a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
31314120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
3132621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
31337a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                                | PendingIntent.FLAG_ONE_SHOT, null);
313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Intent newIntent = new Intent();
313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (requestCode >= 0) {
313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Caller is requesting a result.
313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                new IntentSender(target));
314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.packageName);
314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.task.taskId);
314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                aInfo.packageName);
315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setFlags(intent.getFlags());
315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setClassName("android",
315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                HeavyWeightSwitcherActivity.class.getName());
315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent = newIntent;
315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resolvedType = null;
315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        caller = null;
315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingUid = Binder.getCallingUid();
315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingPid = Binder.getCallingPid();
315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        componentSpecified = true;
316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ResolveInfo rInfo =
316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                AppGlobals.getPackageManager().resolveIntent(
316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        intent, null,
316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        PackageManager.MATCH_DEFAULT_ONLY
3165483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = rInfo != null ? rInfo.activityInfo : null;
3167742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (RemoteException e) {
316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = null;
317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType,
3176a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
3177a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    startFlags, options, componentSpecified, null);
317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mConfigWillChange && mMainStack) {
318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller also wants to switch to a new configuration,
318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // do so now.  This allows a clean switch, as we are waiting
318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for the current activity to pause (so we will not destroy
318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it), and have not yet started the next activity.
318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "updateConfiguration()");
318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mConfigWillChange = false;
318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG,
318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Updating to new configuration after starting activity.");
3189813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                mService.updateConfigurationLocked(config, null, false, false);
319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Binder.restoreCallingIdentity(origId);
319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (outResult != null) {
319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                outResult.result = res;
3196a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                if (res == ActivityManager.START_SUCCESS) {
319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mWaitingActivityLaunched.add(outResult);
319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    do {
319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
3200ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                            mService.wait();
320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (InterruptedException e) {
320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } while (!outResult.timeout && outResult.who == null);
3204a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord r = this.topRunningActivityLocked(null);
320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.nowVisible) {
320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.timeout = false;
320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.totalTime = 0;
321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = 0;
321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = SystemClock.uptimeMillis();
321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mWaitingActivityVisible.add(outResult);
321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        do {
321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            try {
3216ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                                mService.wait();
321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } catch (InterruptedException e) {
321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } while (!outResult.timeout && outResult.who == null);
322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return res;
322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivities(IApplicationThread caller, int callingUid,
3229a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
3230a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3231621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents == null) {
3232621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("intents is null");
3233621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3234621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (resolvedTypes == null) {
3235621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("resolvedTypes is null");
3236621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3237621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents.length != resolvedTypes.length) {
3238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("intents are length different than resolvedTypes");
3239621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3240621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3241621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        ActivityRecord[] outActivity = new ActivityRecord[1];
3242621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3243621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int callingPid;
3244621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (callingUid >= 0) {
3245621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = -1;
3246621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else if (caller == null) {
3247621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = Binder.getCallingPid();
3248621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingUid = Binder.getCallingUid();
3249621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else {
3250621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = callingUid = -1;
3251621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3252621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        final long origId = Binder.clearCallingIdentity();
3253621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
3254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mService) {
3255621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3256621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<intents.length; i++) {
3257621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    Intent intent = intents[i];
3258621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent == null) {
3259621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
3260621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3261621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3262621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Refuse possible leaked file descriptors
3263621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent != null && intent.hasFileDescriptors()) {
3264621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException("File descriptors passed in Intent");
3265621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3266621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3267621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    boolean componentSpecified = intent.getComponent() != null;
3268621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3269621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Don't modify the client's object!
3270621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    intent = new Intent(intent);
3271621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3272621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Collect information about the target of the Intent.
3273a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
3274483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            0, null, null, userId);
3275742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // TODO: New, check if this is correct
3276742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
3277621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3278621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags
3279621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
3280621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException(
3281621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                "FLAG_CANT_SAVE_STATE not supported here");
3282621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3283621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
32847a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    Bundle theseOptions;
32857a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    if (options != null && i == intents.length-1) {
32867a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = options;
32877a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    } else {
32887a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = null;
32897a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    }
3290621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
3291a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            aInfo, resultTo, null, -1, callingPid, callingUid,
32927a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                            0, theseOptions, componentSpecified, outActivity);
3293621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (res < 0) {
3294621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        return res;
3295621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3296621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3297be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
3298621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
3299621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3300621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } finally {
3301621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Binder.restoreCallingIdentity(origId);
3302621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3303621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3304a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
3305621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3306621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long thisTime, long totalTime) {
330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityLaunched.get(i);
331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = timeout;
331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = thisTime;
331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = totalTime;
331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3320621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityVisibleLocked(ActivityRecord r) {
332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityVisible.get(i);
332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = false;
332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = w.totalTime;
333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
333290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
333390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mDismissKeyguardOnNextActivity) {
333490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
333590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
333690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void sendActivityResultLocked(int callingUid, ActivityRecord r,
334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode, int resultCode, Intent data) {
334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (callingUid > 0) {
334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
33447e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                    data, r.getUriPermissionsLocked());
334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " : who=" + resultWho + " req=" + requestCode
334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " res=" + resultCode + " data=" + data);
335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r && r.app != null && r.app.thread != null) {
335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.add(new ResultInfo(resultWho, requestCode,
335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resultCode, data));
3355be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleSendResult(r.appToken, list);
335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown sending result to " + r, e);
335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void stopActivityLocked(ActivityRecord r) {
336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
3370d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                if (!mService.mSleeping) {
3371d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) {
3372d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                        Slog.d(TAG, "no-history finish of " + r);
3373d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    }
3374d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
33752d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                            "no-history", false);
3376d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                } else {
3377d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                    if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r
3378d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                            + " on stop because we're just sleeping");
3379d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                }
338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
33815007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        }
33825007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate
33835007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate        if (r.app != null && r.app.thread != null) {
338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mFocusedActivity == r) {
338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(topRunningActivityLocked(null));
338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3389621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            r.resumeKeyDispatchingLocked();
339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = false;
3392ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3393ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (stop requested)");
339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPING;
339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping visible=" + r.visible + " for " + r);
339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!r.visible) {
3398be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(r.appToken, false);
339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
3400be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
34014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (mService.isSleeping()) {
34024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
34034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
3404162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG);
3405162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                msg.obj = r;
3406162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn                mHandler.sendMessageDelayed(msg, STOP_TIMEOUT);
340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Maybe just ignore exceptions here...  if the process
340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Just in case, assume it to be stopped.
341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = true;
3414ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);
341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPED;
341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.configDestroy) {
341728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                    destroyActivityLocked(r, true, false, "stop-except");
341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(
342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean remove) {
342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int N = mStoppingActivities.size();
342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (N <= 0) return null;
342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean nowVisible = mResumedActivity != null
343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mResumedActivity.nowVisible
343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && !mResumedActivity.waitingVisible;
343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=0; i<N; i++) {
343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord s = mStoppingActivities.get(i);
343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + nowVisible + " waitingVisible=" + s.waitingVisible
343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " finishing=" + s.finishing);
343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (s.waitingVisible && nowVisible) {
343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.remove(s);
344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                s.waitingVisible = false;
344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (s.finishing) {
344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is finishing, it is sitting on top of
344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // everyone else but we now know it is no longer needed...
344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so get rid of it.  Otherwise, we need to go through the
344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // normal flow and hide it once we determine that it is
344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // hidden by the activities in front of it.
344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3448be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(s.appToken, false);
344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
34514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if ((!s.waitingVisible || mService.isSleeping()) && remove) {
345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (stops == null) {
345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stops = new ArrayList<ActivityRecord>();
345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                stops.add(s);
345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.remove(i);
345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                N--;
345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return stops;
346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
346680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    final void scheduleIdleLocked() {
346780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        Message msg = Message.obtain();
346880a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        msg.what = IDLE_NOW_MSG;
346980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        mHandler.sendMessage(msg);
347080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    }
347180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn
347262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config) {
347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
347662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityRecord res = null;
347762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> finishes = null;
348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> thumbnails = null;
348180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        ArrayList<UserStartedState> startingUsers = null;
348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NS = 0;
348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NF = 0;
348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NT = 0;
348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        IApplicationThread sendThumbnail = null;
348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean booting = false;
348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean enableScreen = false;
348842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3491be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3492be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3493be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
34942a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                r.finishLaunchTickingLocked();
349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Get the activity record.
3498be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
350062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                res = r;
350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (fromTimeout) {
350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is a hack to semi-deal with a race condition
350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in the client where it can be constructed with a
350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // newer configuration from when we asked it to launch.
350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We'll update with whatever configuration it now says
351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it used to launch.
351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (config != null) {
351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.configuration = config;
351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // No longer need to keep the device awake.
351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mResumedActivity == r && mLaunchingActivity.isHeld()) {
351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are now idle.  If someone is waiting for a thumbnail from
352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // us, we can now deliver.
352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.idle = true;
352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.scheduleAppGcsLocked();
352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sendThumbnail = r.app.thread;
352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.thumbnailNeeded = false;
352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is fullscreen, set up to hide those under it.
353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
353729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (!mService.mBooted) {
353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mBooted = true;
353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        enableScreen = true;
354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (fromTimeout) {
354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Atomically retrieve all of the other things to do.
354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            stops = processStoppingActivitiesLocked(true);
354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            NS = stops != null ? stops.size() : 0;
355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NF=mFinishingActivities.size()) > 0) {
355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mFinishingActivities.clear();
355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NT=mService.mCancelledThumbnails.size()) > 0) {
355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails);
355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mCancelledThumbnails.clear();
355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                booting = mService.mBooting;
356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mBooting = false;
356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
356380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            if (mStartingUsers.size() > 0) {
356480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
356580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                mStartingUsers.clear();
356680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            }
356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i;
357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Send thumbnail if requested.
357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sendThumbnail != null) {
357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendThumbnail.requestThumbnail(token);
357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.sendPendingThumbnail(null, token, null, null, true);
357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
358150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Stop any activities that are scheduled to do so but have been
358250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
358350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NS; i++) {
358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)stops.get(i);
358550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
358650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
35872d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, false);
358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stopActivityLocked(r);
359050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
359250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
359350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Finish any activities that are scheduled to do so but have been
359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NF; i++) {
359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)finishes.get(i);
359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
359942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                activityRemoved = destroyActivityLocked(r, true, false, "finish-idle");
360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
360350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Report back to any thumbnail receivers.
360450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NT; i++) {
360550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)thumbnails.get(i);
360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.sendPendingThumbnail(r, null, null, null, true);
360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
360950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (booting) {
361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.finishBooting();
361180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn        } else if (startingUsers != null) {
361280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            for (i=0; i<startingUsers.size(); i++) {
361380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn                mService.finishUserSwitch(startingUsers.get(i));
361480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn            }
361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.trimApplications();
361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //dump();
361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //mWindowManager.dump();
362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (enableScreen) {
362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.enableScreenAfterBoot();
362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
362462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
362542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
362642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
362742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
362842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
362962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        return res;
363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the activity is being finished, false if for
363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * some reason it is being left as-is.
363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
36372d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            Intent resultData, String reason, boolean oomAdj) {
363850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int index = indexOfTokenLocked(token);
3639d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate        if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(
364098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Finishing activity @" + index + ": token=" + token
3641d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", result=" + resultCode + ", data=" + resultData
3642d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate                + ", reason=" + reason);
364350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
364450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
364550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
36460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord r = mHistory.get(index);
364750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
36482d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        finishActivityLocked(r, index, resultCode, resultData, reason, oomAdj);
364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3652ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final void finishSubActivityLocked(IBinder token, String resultWho, int requestCode) {
3653ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord self = isInStackLocked(token);
3654ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (self == null) {
3655ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return;
3656ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3657ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3658ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int i;
3659ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        for (i=mHistory.size()-1; i>=0; i--) {
3660ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord r = (ActivityRecord)mHistory.get(i);
3661ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (r.resultTo == self && r.requestCode == requestCode) {
3662ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                if ((r.resultWho == null && resultWho == null) ||
3663ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    (r.resultWho != null && r.resultWho.equals(resultWho))) {
3664ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                    finishActivityLocked(r, i,
36652d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                            Activity.RESULT_CANCELED, null, "request-sub", false);
3666ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                }
3667ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3668ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
36692d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        mService.updateOomAdjLocked();
3670ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3671ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3672ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    final boolean finishActivityAffinityLocked(IBinder token) {
3673ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        int index = indexOfTokenLocked(token);
3674ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(
3675ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                TAG, "Finishing activity affinity @" + index + ": token=" + token);
3676ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        if (index < 0) {
3677ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            return false;
3678ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3679ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        ActivityRecord r = mHistory.get(index);
3680ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
3681bfc1be1101b87f193b043b62edd1722b8c4eb23cAmith Yamasani        while (index >= 0) {
3682ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            ActivityRecord cur = mHistory.get(index);
3683ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.task != r.task) {
3684ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3685ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3686ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity == null && r.taskAffinity != null) {
3687ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3688ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
3689ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
3690ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn                break;
3691ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            }
36922d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null,
36932d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    "request-affinity", true);
3694ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn            index--;
3695ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        }
3696ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn        return true;
3697ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn    }
3698ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn
36995c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
37005c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // send the result
37015c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        ActivityRecord resultTo = r.resultTo;
37025c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        if (resultTo != null) {
37035c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
37045c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " who=" + r.resultWho + " req=" + r.requestCode
37055c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " res=" + resultCode + " data=" + resultData);
37065c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (r.info.applicationInfo.uid > 0) {
37075c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
37085c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.packageName, resultData,
37095c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.getUriPermissionsLocked());
37105c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            }
37115c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
37125c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                                     resultData);
37135c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            r.resultTo = null;
37145c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        }
37155c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
37165c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
37175c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // Make sure this HistoryRecord is not holding on to other resources,
37185c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // because clients have remote IPC references to this object so we
37195c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // can't assume that will go away and want to avoid circular IPC refs.
37205c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.results = null;
37215c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.pendingResults = null;
37225c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.newIntents = null;
37235c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.icicle = null;
37245c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    }
37255c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if this activity has been removed from the history
372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * list, or false if it is still in the list and will be removed later.
372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
37312d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            int resultCode, Intent resultData, String reason, boolean oomAdj) {
37322d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        return finishActivityLocked(r, index, resultCode, resultData, reason, false, oomAdj);
37338078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
37348078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
37358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    /**
37368078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @return Returns true if this activity has been removed from the history
37378078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * list, or false if it is still in the list and will be removed later.
37388078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     */
37392d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index, int resultCode,
37402d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            Intent resultData, String reason, boolean immediate, boolean oomAdj) {
374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Duplicate finish request for " + r);
374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
374694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        r.makeFinishing();
374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
3748b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                r.userId, System.identityHashCode(r),
374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName, reason);
375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < (mHistory.size()-1)) {
37510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord next = mHistory.get(index+1);
375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next.task == r.task) {
375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.frontOfTask) {
375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The next activity is now the front of the task.
375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.frontOfTask = true;
375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller asked that this activity (and all above it)
375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // be cleared when the task is reset, don't lose that information,
376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // but propagate it up to the next activity.
376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pauseKeyDispatchingLocked();
376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mFocusedActivity == r) {
376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.setFocusedActivityLocked(topRunningActivityLocked(null));
377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        finishActivityResultsLocked(r, resultCode, resultData);
377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (immediate) {
37838078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            return finishCurrentActivityLocked(r, index,
37842d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    FINISH_IMMEDIATELY, oomAdj) == null;
37858078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        } else if (mResumedActivity == r) {
378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean endTask = index <= 0
37870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    || (mHistory.get(index-1)).task != r.task;
378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare close transition: finishing " + r);
379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.prepareAppTransition(endTask
379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
37927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
379350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
379450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Tell window manager to prepare for this one to be removed.
3795be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(r.appToken, false);
379650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3797621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity == null) {
379850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, false);
380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.state != ActivityState.PAUSING) {
380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity is PAUSING, we will complete the finish once
380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it is done pausing; else we can just directly finish it here.
380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return finishCurrentActivityLocked(r, index,
38082d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    FINISH_AFTER_PAUSE, oomAdj) == null;
380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return false;
381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_IMMEDIATELY = 0;
381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_PAUSE = 1;
381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_VISIBLE = 2;
381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
38212d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            int mode, boolean oomAdj) {
3822be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        final int index = indexOfActivityLocked(r);
382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return null;
382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38272d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        return finishCurrentActivityLocked(r, index, mode, oomAdj);
382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
383050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
38312d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            int index, int mode, boolean oomAdj) {
383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First things first: if this activity is currently visible,
383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // and the resumed activity is not yet visible, then hold off on
383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // finishing until the resumed one becomes visible.
383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mStoppingActivities.contains(r)) {
383750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.add(r);
383850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mStoppingActivities.size() > 3) {
383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If we already have a few activities waiting to stop,
384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // then give up on things going idle and start clearing
384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // them out.
384280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                    scheduleIdleLocked();
38434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } else {
38444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    checkReadyForSleepLocked();
384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3847ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3848ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (finish requested)");
384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPING;
38502d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            if (oomAdj) {
38512d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                mService.updateOomAdjLocked();
38522d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            }
385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return r;
385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure the record is cleaned out of other places.
385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(r);
38584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
386250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final ActivityState prevState = r.state;
3864ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r);
386550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.state = ActivityState.FINISHING;
386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
386750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_IMMEDIATELY
386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.STOPPED
386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.INITIALIZING) {
387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this activity is already stopped, we can just finish
387150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it right now.
38722d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            boolean activityRemoved = destroyActivityLocked(r, true,
38732d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    oomAdj, "finish-imm");
387442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            if (activityRemoved) {
387542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
387642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            }
387742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            return activityRemoved ? null : r;
387850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
387950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Need to go through the full pause cycle to get this
388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity into the stopped state and then finish it.
388150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
388250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mFinishingActivities.add(r);
388350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
388450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
388550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return r;
388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
388750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
388950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform the common clean-up of an activity record.  This is called both
389050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * as part of destroyActivityLocked() (when destroying the client-side
389150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * representation) and cleaning things up as a result of its hosting
389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * processing going away, in which case there is no remaining client-side
389350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * state to destroy so only the cleanup here is needed.
389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
3895ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
3896ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            boolean setState) {
389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
389950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mFocusedActivity == r) {
390150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mFocusedActivity = null;
390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configDestroy = false;
390550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frozenBeforeDestroy = false;
390650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3907ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (setState) {
3908ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
3909ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            r.state = ActivityState.DESTROYED;
3910cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            r.app = null;
3911ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3912ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
391350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this record is no longer in the pending finishes list.
391450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // This could happen, for example, if we are trimming activities
391550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // down to the max limit while they are still waiting to finish.
391650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mFinishingActivities.remove(r);
391750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
391850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
391950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remove any pending results.
392050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing && r.pendingResults != null) {
392150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
392250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                PendingIntentRecord rec = apr.get();
392350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (rec != null) {
392450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.cancelIntentSenderLocked(rec, false);
392550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
392650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
392750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.pendingResults = null;
392850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
392950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
393050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (cleanServices) {
393150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
393250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
393350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
393450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
393650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
393750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
393850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
393950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
394050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
394150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Get rid of any pending idle timeouts.
394242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        removeTimeoutsForActivityLocked(r);
394342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    }
394442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
394542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn    private void removeTimeoutsForActivityLocked(ActivityRecord r) {
394650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
3947162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn        mHandler.removeMessages(STOP_TIMEOUT_MSG, r);
394850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
39490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
39502a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.finishLaunchTickingLocked();
395150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
395250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
39535c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void removeActivityFromHistoryLocked(ActivityRecord r) {
3954cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
3955cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        r.makeFinishing();
3956cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
3957cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            RuntimeException here = new RuntimeException("here");
3958cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            here.fillInStackTrace();
3959cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            Slog.i(TAG, "Removing activity " + r + " from stack");
3960cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        }
3961cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        mHistory.remove(r);
3962cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        r.takeFromHistory();
3963cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeTimeoutsForActivityLocked(r);
3964cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3965cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                + " (removed from history)");
3966cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        r.state = ActivityState.DESTROYED;
3967cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        r.app = null;
3968cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        mService.mWindowManager.removeAppToken(r.appToken);
3969cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (VALIDATE_TOKENS) {
3970cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            validateAppTokensLocked();
397150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
3972cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        cleanUpActivityServicesLocked(r);
3973cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        r.removeUriPermissionsLocked();
397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
397650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
397750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clean-up of service connections in an activity record.
397850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void cleanUpActivityServicesLocked(ActivityRecord r) {
398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Throw away any services that have been bound by this activity.
398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.connections != null) {
398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Iterator<ConnectionRecord> it = r.connections.iterator();
398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            while (it.hasNext()) {
398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ConnectionRecord c = it.next();
3985599db5c85faa5733af538a712b870e1f507cd380Dianne Hackborn                mService.mServices.removeConnectionLocked(c, null, r);
398650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.connections = null;
398850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3990755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
3991755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    final void scheduleDestroyActivities(ProcessRecord owner, boolean oomAdj, String reason) {
3992755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        Message msg = mHandler.obtainMessage(DESTROY_ACTIVITIES_MSG);
3993755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        msg.obj = new ScheduleDestroyArgs(owner, oomAdj, reason);
3994755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        mHandler.sendMessage(msg);
3995755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn    }
3996755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn
399728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
3998755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn        boolean lastIsOpaque = false;
399942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        boolean activityRemoved = false;
4000ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
4001ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            ActivityRecord r = mHistory.get(i);
4002755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.finishing) {
4003755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
4004755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
4005755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.fullscreen) {
4006755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                lastIsOpaque = true;
4007755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
4008ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (owner != null && r.app != owner) {
4009ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                continue;
4010ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
4011755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (!lastIsOpaque) {
4012755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                continue;
4013755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            }
4014ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // We can destroy this one if we have its icicle saved and
4015ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it is not in the process of pausing/stopping/finishing.
4016755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            if (r.app != null && r != mResumedActivity && r != mPausingActivity
4017755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                    && r.haveState && !r.visible && r.stopped
4018ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYING
4019ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYED) {
4020755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Destroying " + r + " in state " + r.state
4021755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " resumed=" + mResumedActivity
4022755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn                        + " pausing=" + mPausingActivity);
402342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (destroyActivityLocked(r, true, oomAdj, reason)) {
402442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    activityRemoved = true;
402542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
4026ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
4027ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
402842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        if (activityRemoved) {
402942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            resumeTopActivityLocked(null);
403042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn        }
4031ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
4032ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Destroy the current CLIENT SIDE instance of an activity.  This may be
403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * called both when actually finishing an activity, or when performing
403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * a configuration switch where we destroy the current client-side object
403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * but then create a new client-side object for this same HistoryRecord.
403850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
403950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean destroyActivityLocked(ActivityRecord r,
404028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            boolean removeFromApp, boolean oomAdj, String reason) {
4041cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CLEANUP) Slog.v(
4042755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn            TAG, "Removing activity from " + reason + ": token=" + r
404350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn              + ", app=" + (r.app != null ? r.app.processName : "(null)"));
404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
4045b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                r.userId, System.identityHashCode(r),
404628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                r.task.taskId, r.shortComponentName, reason);
404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean removedFromHistory = false;
4049cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4050ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        cleanUpActivityLocked(r, false, false);
405150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
405250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadApp = r.app != null;
4053cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
405450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (hadApp) {
405550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (removeFromApp) {
405650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int idx = r.app.activities.indexOf(r);
405750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (idx >= 0) {
405850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.app.activities.remove(idx);
405950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
406050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
406150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = null;
406250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendEmptyMessage(
406350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
406450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
406550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.app.activities.size() == 0) {
40662d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    // No longer have activities, so update oom adj.
40672d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    mService.updateOomAdjLocked();
406850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
406950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
407050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean skipDestroy = false;
407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
407450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
4075be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
407650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.configChangeFlags);
407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We can just ignore exceptions here...  if the process
407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
408150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.w(TAG, "Exception thrown during finish", e);
408250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
408350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
408450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removedFromHistory = true;
408550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    skipDestroy = true;
408650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
408750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
408950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.nowVisible = false;
409050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4091ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // If the activity is finishing, we need to wait on removing it
4092ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // from the list to give it a chance to do its cleanup.  During
4093ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // that time it may make calls back with its token so we need to
4094ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // be able to find it on the list and so we don't want to remove
4095ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it from the list yet.  Otherwise, we can just immediately put
4096ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it in the destroyed state since we are not removing it from the
4097ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // list.
409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing && !skipDestroy) {
4099ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r
4100ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy requested)");
410150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYING;
410250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
410350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                msg.obj = r;
410450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
410550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4106ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4107ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy skipped)");
410850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
4109cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                r.app = null;
411050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
411150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
411250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // remove this record from the history.
411350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
411450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removeActivityFromHistoryLocked(r);
411550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removedFromHistory = true;
411650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
4117ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
4118ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (no app)");
411950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
4120cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                r.app = null;
412150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
412250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
412350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
412450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configChangeFlags = 0;
412550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
412650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mLRUActivities.remove(r) && hadApp) {
412750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
412850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
412950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
413050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return removedFromHistory;
413150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
413250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void activityDestroyed(IBinder token) {
413450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
413542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            final long origId = Binder.clearCallingIdentity();
413642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            try {
413742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                ActivityRecord r = ActivityRecord.forToken(token);
413842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (r != null) {
413942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
414042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                }
414142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn
414242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                int index = indexOfActivityLocked(r);
414342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                if (index >= 0) {
414442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    if (r.state == ActivityState.DESTROYING) {
414545a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn                        cleanUpActivityLocked(r, true, false);
414642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                        removeActivityFromHistoryLocked(r);
414742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                    }
414850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
414942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                resumeTopActivityLocked(null);
415042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn            } finally {
415142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                Binder.restoreCallingIdentity(origId);
415250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
415350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
415450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
415550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4156cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn    private void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app,
4157cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            String listName) {
415850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = list.size();
4159cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (DEBUG_CLEANUP) Slog.v(
4160cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            TAG, "Removing app " + app + " from list " + listName
416150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            + " with " + i + " entries");
416250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
416350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
416450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)list.get(i);
4165cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            if (DEBUG_CLEANUP) Slog.v(TAG, "Record #" + i + " " + r);
416650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == app) {
4167cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                if (DEBUG_CLEANUP) Slog.v(TAG, "---> REMOVING this entry!");
416850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.remove(i);
416942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn                removeTimeoutsForActivityLocked(r);
417050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
417150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4174cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn    boolean removeHistoryRecordsForAppLocked(ProcessRecord app) {
4175cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeHistoryRecordsForAppLocked(mLRUActivities, app, "mLRUActivities");
4176cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeHistoryRecordsForAppLocked(mStoppingActivities, app, "mStoppingActivities");
4177cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app, "mGoingToSleepActivities");
4178cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app,
4179cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                "mWaitingVisibleActivities");
4180cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        removeHistoryRecordsForAppLocked(mFinishingActivities, app, "mFinishingActivities");
4181cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4182cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        boolean hasVisibleActivities = false;
4183cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4184cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        // Clean out the history list.
4185cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        int i = mHistory.size();
4186cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        if (DEBUG_CLEANUP) Slog.v(
4187cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            TAG, "Removing app " + app + " from history with " + i + " entries");
4188cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        while (i > 0) {
4189cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            i--;
4190cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            ActivityRecord r = (ActivityRecord)mHistory.get(i);
4191cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            if (DEBUG_CLEANUP) Slog.v(
4192cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                TAG, "Record #" + i + " " + r + ": app=" + r.app);
4193cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            if (r.app == app) {
4194cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                if ((!r.haveState && !r.stateNotNeeded) || r.finishing) {
4195cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    if (ActivityStack.DEBUG_ADD_REMOVE || DEBUG_CLEANUP) {
4196cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        RuntimeException here = new RuntimeException("here");
4197cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        here.fillInStackTrace();
4198cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        Slog.i(TAG, "Removing activity " + r + " from stack at " + i
4199cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                + ": haveState=" + r.haveState
4200cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                + " stateNotNeeded=" + r.stateNotNeeded
4201cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                + " finishing=" + r.finishing
4202cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                + " state=" + r.state, here);
4203cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    }
4204cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    if (!r.finishing) {
4205cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
4206cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
4207cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                r.userId, System.identityHashCode(r),
4208cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                r.task.taskId, r.shortComponentName,
4209cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                "proc died without state saved");
4210cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    }
4211cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    removeActivityFromHistoryLocked(r);
4212cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4213cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                } else {
4214cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    // We have the current state for this activity, so
4215cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    // it can be restarted later when needed.
4216cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    if (localLOGV) Slog.v(
4217cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        TAG, "Keeping entry, setting app to null");
4218cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    if (r.visible) {
4219cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        hasVisibleActivities = true;
4220cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    }
4221cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    r.app = null;
4222cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    r.nowVisible = false;
4223cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    if (!r.haveState) {
4224cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        if (ActivityStack.DEBUG_SAVED_STATE) Slog.i(TAG,
4225cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                                "App died, clearing saved state of " + r);
4226cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                        r.icicle = null;
4227cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                    }
4228cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                }
4229cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4230cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn                r.stack.cleanUpActivityLocked(r, true, true);
4231cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn            }
4232cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        }
4233cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn
4234cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        return hasVisibleActivities;
423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
423650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4237621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
4238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Move the current home activity's task (if one exists) to the front
4239621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * of the stack.
4240621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
4241621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontLocked() {
4242621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord homeTask = null;
4243621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
42440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord hr = mHistory.get(i);
4245621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (hr.isHomeActivity) {
4246621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                homeTask = hr.task;
424794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                break;
4248621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
4249621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4250621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (homeTask != null) {
42518078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            moveTaskToFrontLocked(homeTask, null, null);
4252621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
4253621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
4254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
42557f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    final void updateTransitLocked(int transit, Bundle options) {
42567f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        if (options != null) {
42577f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
42587f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (r != null && r.state != ActivityState.RESUMED) {
42597f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                r.updateOptionsLocked(options);
42607f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
42617f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
42627f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
42637f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        }
42647f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn        mService.mWindowManager.prepareAppTransition(transit, false);
42657f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn    }
4266621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
42678078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason, Bundle options) {
426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int task = tr.taskId;
427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size()-1;
427250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
42730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (top < 0 || (mHistory.get(top)).task.taskId == task) {
427450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // nothing to do!
42757f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            if (reason != null &&
42767f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                    (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
42777f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                ActivityOptions.abort(options);
42787f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            } else {
42797f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn                updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
42807f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            }
428150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
428250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
428350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4284be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
428550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
428650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Applying the affinities may have removed entries from the history,
428750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // so get the size again.
428850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        top = mHistory.size()-1;
428950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = top;
429050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
429150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task up to the top
429250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
429350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos >= 0) {
42940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
429550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
429650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
429750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
429850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
429998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
430098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
430198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
430298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here);
430398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
430450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
430550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(top, r);
4306be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(0, r.appToken);
430750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                top--;
430850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
430950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos--;
431050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
431150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
431250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
431350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to front transition: task=" + tr);
431450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
431550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
43167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
43177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
431850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
431950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
432050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
432150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
43228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            ActivityOptions.abort(options);
432350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
43247f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn            updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
432550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
432650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
432750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToTop(moved);
432850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4329be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
433050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
433150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
433250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
4333b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, tr.userId, task);
433450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
433550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
433650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void finishTaskMoveLocked(int task) {
433750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        resumeTopActivityLocked(null);
433850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
433950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
434050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
434150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Worker method for rearranging history stack.  Implements the function of moving all
434250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities for a specific task (gathering them if disjoint) into a single group at the
434350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * bottom of the stack.
434450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
434550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * If a watcher is installed, the action is preflighted and the watcher has an opportunity
434650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to premeptively cancel the move.
434750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
434850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param task The taskId to collect and move to the bottom.
434950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the move completed, false if not.
435050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
435150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean moveTaskToBackLocked(int task, ActivityRecord reason) {
435250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Slog.i(TAG, "moveTaskToBack: " + task);
435350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
435450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we have a watcher, preflight the move before committing to it.  First check
435550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // for *other* available tasks, but if none are available, then try again allowing the
435650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current task to be selected.
435750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack && mService.mController != null) {
435850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord next = topRunningActivityLocked(null, task);
435950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next == null) {
436050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next = topRunningActivityLocked(null, 0);
436150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
436250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next != null) {
436350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // ask watcher if this is allowed
436450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean moveOK = true;
436550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
436650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    moveOK = mService.mController.activityResuming(next.packageName);
436750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
436850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
436950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
437050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!moveOK) {
437150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return false;
437250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
437350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
437450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
437550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
4376be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
437750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
437850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
437950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to back transition: task=" + task);
438050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
438150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
438250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int bottom = 0;
438350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = 0;
438450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
438550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task down to the bottom
438650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
438750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos < N) {
43880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
438950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
439050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
439150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
439250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
439398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
439498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
439598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
439698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at "
439798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            + bottom, here);
439898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
439950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
440050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(bottom, r);
4401be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(r.appToken);
440250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                bottom++;
440350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
440450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos++;
440550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
440650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
440750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
440850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
44097da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
44107da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
441150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
441250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
441350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
441450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
441550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
44167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
44177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
441850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
441950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToBottom(moved);
442050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4421be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
442250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
442350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
442450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
442550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
442650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
442715491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn
44280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) {
44290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
44300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
44310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (resumed != null && resumed.thumbHolder == tr) {
44320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
44330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44346a864959e09ad700cc4815e8d751561ceb7e08e3Dianne Hackborn        if (info.mainThumbnail == null) {
44356a864959e09ad700cc4815e8d751561ceb7e08e3Dianne Hackborn            info.mainThumbnail = tr.lastThumbnail;
44366a864959e09ad700cc4815e8d751561ceb7e08e3Dianne Hackborn        }
44370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return info;
44380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
44390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
444015491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn    public Bitmap getTaskTopThumbnailLocked(TaskRecord tr) {
444115491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        ActivityRecord resumed = mResumedActivity;
444215491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        if (resumed != null && resumed.task == tr) {
444315491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn            // This task is the current resumed task, we just need to take
444415491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn            // a screenshot of it and return that.
444515491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn            return resumed.stack.screenshotActivities(resumed);
444615491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        }
444715491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        // Return the information about the task, to figure out the top
444815491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        // thumbnail to return.
444915491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
445015491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        if (info.numSubThumbbails <= 0) {
44516a864959e09ad700cc4815e8d751561ceb7e08e3Dianne Hackborn            return info.mainThumbnail != null ? info.mainThumbnail : tr.lastThumbnail;
445215491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        } else {
445315491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn            return info.subtasks.get(info.numSubThumbbails-1).holder.lastThumbnail;
445415491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn        }
445515491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn    }
445615491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn
44579da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn    public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex,
44589da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            boolean taskRequired) {
44590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false);
44600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (info.root == null) {
44619da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
44629da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId);
44639da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
44640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
44650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
44670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex < 0) {
44680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            // Just remove the entire task.
44690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            performClearTaskAtIndexLocked(taskId, info.rootIndex);
44700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return info.root;
44710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
44730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex >= info.subtasks.size()) {
44749da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
44759da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex);
44769da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
44770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
44780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
44790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
4480cc5a055613efb463275633d83a04674b0be6d770Dianne Hackborn        // Remove all of this task's activities starting at the sub task.
44810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex);
44820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        performClearTaskAtIndexLocked(taskId, subtask.index);
44830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return subtask.activity;
44840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
44850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
44860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) {
44870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final TaskAccessInfo thumbs = new TaskAccessInfo();
44880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // How many different sub-thumbnails?
44890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final int NA = mHistory.size();
44900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        int j = 0;
44910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ThumbnailHolder holder = null;
44920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
44930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
44940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!ar.finishing && ar.task.taskId == taskId) {
44958da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn                thumbs.root = ar;
44968da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn                thumbs.rootIndex = j;
44970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
449815491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                if (holder != null) {
449915491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    thumbs.mainThumbnail = holder.lastThumbnail;
450015491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                }
450115491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                j++;
45020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
45030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
45040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
45050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
45060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
45070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (j >= NA) {
45080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return thumbs;
45090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
45100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
45110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
45120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.subtasks = subtasks;
45130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
45140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
45150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
45160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.finishing) {
45170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
45180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
45190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.task.taskId != taskId) {
45200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
45210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
45220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.thumbHolder != holder && holder != null) {
45230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                thumbs.numSubThumbbails++;
45240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
45250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask();
452615491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                sub.holder = holder;
45270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.activity = ar;
45280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.index = j-1;
45290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                subtasks.add(sub);
45300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
45310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
45320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (thumbs.numSubThumbbails > 0) {
45330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            thumbs.retriever = new IThumbnailRetriever.Stub() {
45340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                public Bitmap getThumbnail(int index) {
45350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (index < 0 || index >= thumbs.subtasks.size()) {
45360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        return null;
45370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
453815491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    TaskAccessInfo.SubTask sub = thumbs.subtasks.get(index);
453915491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    ActivityRecord resumed = mResumedActivity;
454015491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    if (resumed != null && resumed.thumbHolder == sub.holder) {
454115491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                        return resumed.stack.screenshotActivities(resumed);
454215491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    }
454315491c6a728131e322c45bc440500a8a78e4a410Dianne Hackborn                    return sub.holder.lastThumbnail;
45440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
45450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            };
45460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
45470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return thumbs;
45480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
45490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
455050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void logStartActivity(int tag, ActivityRecord r,
455150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TaskRecord task) {
455250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(tag,
4553b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                r.userId, System.identityHashCode(r), task.taskId,
455450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.shortComponentName, r.intent.getAction(),
455550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getType(), r.intent.getDataString(),
455650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getFlags());
455750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
455850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
455950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
456050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure the given activity matches the current configuration.  Returns
456150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * false if the activity had to be destroyed.  Returns true if the
456250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * configuration is the same, or the activity will remain running as-is
456350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for whatever reason.  Ensures the HistoryRecord is updated with the
456450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * correct configuration and all other bookkeeping is handled.
456550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
456650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean ensureActivityConfigurationLocked(ActivityRecord r,
456750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int globalChanges) {
456850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mConfigWillChange) {
456950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
457050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Skipping config check (will change): " + r);
457150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
457250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
457350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
457450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
457550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Ensuring correct configuration: " + r);
457650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
457750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Short circuit: if the two configurations are the exact same
457850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // object (the common case), then there is nothing to do.
457950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration newConfig = mService.mConfiguration;
4580e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (r.configuration == newConfig && !r.forceNewConfig) {
458150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
458250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration unchanged in " + r);
458350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
458450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
458550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
458650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We don't worry about activities that are finishing.
458750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
458850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
458950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter in finishing " + r);
459050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
459150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
459250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
459350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
459450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Okay we now are going to make this activity have the new config.
459550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // But then we need to figure out how it needs to deal with that.
459650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration oldConfig = r.configuration;
459750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configuration = newConfig;
459858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
459958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Determine what has changed.  May be nothing, if this is a config
460058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // that has come back from the app after going idle.  In that case
460158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // we just want to leave the official config object now in the
460258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // activity and do nothing else.
460358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        final int changes = oldConfig.diff(newConfig);
460458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        if (changes == 0 && !r.forceNewConfig) {
460558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
460658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    "Configuration no differences in " + r);
460758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            return true;
460858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        }
460958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
461050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the activity isn't currently running, just leave the new
461150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration and it will pick that up next time it starts.
461250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app == null || r.app.thread == null) {
461350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
461450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter not running " + r);
461550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
4616e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
461750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
461850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
461950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
462058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Figure out how to handle the changes between the configurations.
46213c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
46223c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
46233c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + Integer.toHexString(changes) + ", handles=0x"
4624e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn                    + Integer.toHexString(r.info.getRealConfigChanged())
46253c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + ", newConfig=" + newConfig);
46263c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        }
4627e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn        if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) {
46283c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // Aha, the activity isn't handling the change, so DIE DIE DIE.
46293c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.configChangeFlags |= changes;
46303c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.startFreezingScreenLocked(r.app, globalChanges);
4631e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
46323c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            if (r.app == null || r.app.thread == null) {
46333c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4634b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is destroying non-running " + r);
463528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "config");
46363c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.PAUSING) {
46373c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // A little annoying: we are waiting for this activity to
46383c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // finish pausing.  Let's not do anything now, but just
46393c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // flag that it needs to be restarted when done pausing.
46403c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4641b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is skipping already pausing " + r);
46423c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configDestroy = true;
46433c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                return true;
46443c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.RESUMED) {
46453c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Try to optimize this case: the configuration is changing
46463c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // and we need to restart the top, resumed activity.
46473c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Instead of doing the normal handshaking, just say
46483c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // "restart!".
46493c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4650b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching resumed " + r);
46513c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, true);
46523c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
46533c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else {
46543c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
4655b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                        "Config is relaunching non-resumed " + r);
46563c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, false);
46573c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
465850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
46593c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn
46603c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // All done...  tell the caller we weren't able to keep this
46613c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // activity around.
46623c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            return false;
466350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
466450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
466550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Default case: the activity can handle this new configuration, so
466650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // hand it over.  Note that we don't need to give it the new
466750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration, since we always send configuration changes to all
466850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // process when they happen so it can just use whatever configuration
466950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // it last got.
467050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app != null && r.app.thread != null) {
467150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
467250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
4673be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleActivityConfigurationChanged(r.appToken);
467450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
467550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If process died, whatever.
467650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
467750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
467850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.stopFreezingScreenLocked(false);
467950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
468050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
468150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
468250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
468350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean relaunchActivityLocked(ActivityRecord r,
468450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int changes, boolean andResume) {
468550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<ResultInfo> results = null;
468650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<Intent> newIntents = null;
468750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
468850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            results = r.results;
468950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newIntents = r.newIntents;
469050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
469150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
469250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " with results=" + results + " newIntents=" + newIntents
469350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " andResume=" + andResume);
469450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
4695b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                : EventLogTags.AM_RELAUNCH_ACTIVITY, r.userId, System.identityHashCode(r),
469650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName);
469750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
469850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(r.app, 0);
469950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
470050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
4701b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG,
4702b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ")
4703b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn                    + r);
4704e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
4705be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents,
4706813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    changes, !andResume, new Configuration(mService.mConfiguration));
470750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: don't need to call pauseIfSleepingLocked() here, because
470850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the caller will only pass in 'andResume' if this activity is
470950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // currently resumed, which implies we aren't sleeping.
471050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
4711b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, "Relaunch failed", e);
471250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
471350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
471450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
471550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.results = null;
471650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.newIntents = null;
471750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
471850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.reportResumedActivityLocked(r);
471950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
4720b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.RESUMED;
4721b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn        } else {
4722b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
4723b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn            r.state = ActivityState.PAUSED;
472450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
472550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
472650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
472750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
472890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
472990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguardOnNextActivityLocked() {
473090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        mDismissKeyguardOnNextActivity = true;
473190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
473250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn}
4733