ActivityStack.java revision 621e2fecb559d5afa5e43d58e8a7ee2d71c74430
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
1950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity;
2050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl;
2150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity;
240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.ActivityManager;
2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals;
2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager;
270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever;
2850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_CLASS_NOT_FOUND;
2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_DELIVERED_TO_TOP;
3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_INTENT_NOT_RESOLVED;
3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_PERMISSION_DENIED;
3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_RETURN_INTENT_TO_CALLER;
3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SUCCESS;
3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SWITCHES_CANCELED;
3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_TASK_TO_FRONT;
3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread;
3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent;
3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo;
4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult;
4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName;
4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context;
4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender;
4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent;
4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender;
4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo;
4750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo;
4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager;
4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo;
5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration;
510aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources;
520aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap;
5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri;
5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder;
55ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle;
5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler;
5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder;
5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message;
5962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor;
6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager;
6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException;
6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock;
63742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog;
6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log;
6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog;
6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy;
6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException;
7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference;
7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList;
7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator;
7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List;
7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/**
7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities.
7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */
780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack {
7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final String TAG = ActivityManagerService.TAG;
80b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn    static final boolean localLOGV = ActivityManagerService.localLOGV;
8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH;
8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE;
8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY;
8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING;
8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION;
8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS;
8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION;
8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS;
8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
90ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    static final boolean DEBUG_STATES = false;
9198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
9298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_SAVED_STATE = false;
93ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS;
9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity telling us it
9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is idle.
9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int IDLE_TIMEOUT = 10*1000;
9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity to pause.  This
10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is short because it directly impacts the responsiveness of starting the
10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // next activity.
10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int PAUSE_TIMEOUT = 500;
10450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    // How long we can hold the sleep wake lock before giving up.
1064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    static final int SLEEP_TIMEOUT = 5*1000;
1074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we can hold the launch wake lock before giving up.
10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int LAUNCH_TIMEOUT = 10*1000;
11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on an activity telling us it has
11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // finished destroying itself.
11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int DESTROY_TIMEOUT = 10*1000;
11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long until we reset a task when the user returns to it.  Currently
116621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    // disabled.
117621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    static final long ACTIVITY_INACTIVE_RESET_TIME = 0;
11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1190dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // How long between activity launches that we consider safe to not warn
1200dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // the user about an unexpected activity being launched on top.
1210dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    static final long START_WARN_TIME = 5*1000;
1220dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // Set to false to disable the preview that is shown while a new activity
12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is being started.
12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean SHOW_APP_STARTING_PREVIEW = true;
12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    enum ActivityState {
12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        INITIALIZING,
12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        RESUMED,
13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSING,
13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSED,
13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPING,
13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPED,
13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        FINISHING,
13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYING,
13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYED
13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityManagerService mService;
14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean mMainStack;
14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Context mContext;
14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The back history of all previous (and possibly still
14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * running) activities.  It contains HistoryRecord objects.
14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();
149be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
150be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    /**
151be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     * Used for validating app tokens with window manager.
152be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     */
153be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>();
154be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of running activities, sorted by recent usage.
15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The first entry in the list is the least recently used.
15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * It contains HistoryRecord objects.
15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>();
16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are waiting for a new activity
16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to become visible before completing whatever operation they are
16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * supposed to do.
16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mWaitingVisibleActivities
16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be stopped, but waiting
17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the next activity to settle down before doing so.  It contains
17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mStoppingActivities
17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
1794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * List of activities that are in the process of going to sleep.
1804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
1814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    final ArrayList<ActivityRecord> mGoingToSleepActivities
1824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            = new ArrayList<ActivityRecord>();
1834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
1844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Animations that for the current transition have requested not to
18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * be considered for the transition animation.
18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mNoAnimActivities
18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be finished, but waiting
19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the previous activity to settle down before doing so.  It contains
19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mFinishingActivities
19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next launched activity.
20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched
20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next visible activity.
20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible
20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when the system is going to sleep, until we have
21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * successfully paused the current activity and released our wake lock.
21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * At that point the system is allowed to actually sleep.
21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mGoingToSleep;
21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * We don't want to allow the device to go to sleep while in the process
22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of launching an activity.  This is primarily to allow alarm intent
22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * receivers to launch an activity and get that to run before the device
22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * goes back to sleep.
22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mLaunchingActivity;
22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * When we are in the process of pausing an activity, before starting the
22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * next one, this variable holds the activity that is currently being paused.
22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
230621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    ActivityRecord mPausingActivity = null;
23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is the last activity that we put into the paused state.  This is
23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * used to determine if we need to do an activity transition while sleeping,
23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * when we normally hold the top activity paused.
23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mLastPausedActivity = null;
23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Current activity that is resumed, or null if there is none.
24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mResumedActivity = null;
24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
2450dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * This is the last activity that has been started.  It is only used to
2460dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * identify when multiple activities are started at once so that the user
2470dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * can be warned they may not be in the activity they think they are.
2480dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     */
2490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    ActivityRecord mLastStartedActivity = null;
2500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
2510dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    /**
25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when we know we are going to be calling updateConfiguration()
25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * soon, so want to skip intermediate config checks.
25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mConfigWillChange;
25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set to indicate whether to issue an onUserLeaving callback when a
25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * newly launched activity is being brought in front of us.
26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mUserLeaving = false;
26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    long mInitialStartTime = 0;
26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
2664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * Set when we have taken too long waiting to go to sleep.
2674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
2684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    boolean mSleepTimeout = false;
2694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
27090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    /**
27190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     * Dismiss the keyguard after the next activity is displayed?
27290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     */
27390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    boolean mDismissKeyguardOnNextActivity = false;
27490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
2750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailWidth = -1;
2760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailHeight = -1;
2770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
278742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private int mCurrentUser;
279742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG;
28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Handler mHandler = new Handler() {
28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //public Handler() {
29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //}
29250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
29350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        public void handleMessage(Message msg) {
29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            switch (msg.what) {
2954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                case SLEEP_TIMEOUT_MSG: {
2968e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    synchronized (mService) {
2978e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        if (mService.isSleeping()) {
2988e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
2998e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            mSleepTimeout = true;
3008e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            checkReadyForSleepLocked();
3018e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        }
3024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    }
3034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } break;
30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case PAUSE_TIMEOUT_MSG: {
305be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
308be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity pause timeout for " + r);
309be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityPaused(r != null ? r.appToken : null, true);
31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_TIMEOUT_MSG: {
31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        nmsg.obj = msg.obj;
31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
321be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
322be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity idle timeout for " + r);
323be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, true, null);
32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case DESTROY_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 destroy timeout for " + r);
330be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityDestroyed(r != null ? r.appToken : null);
33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_NOW_MSG: {
333be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
334be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, false, null);
33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case LAUNCH_TIMEOUT_MSG: {
33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT);
34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mLaunchingActivity.isHeld()) {
34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mLaunchingActivity.release();
34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case RESUME_TOP_ACTIVITY_MSG: {
35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    };
35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService = service;
36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mContext = context;
36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mMainStack = mainStack;
36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PowerManager pm =
36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            (PowerManager)context.getSystemService(Context.POWER_SERVICE);
36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity.setReferenceCounted(false);
36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
371742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
3740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && r != notTop) {
37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
384742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
3870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && !r.delayedResume && r != notTop) {
38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is a simplified version of topRunningActivityLocked that provides a number of
39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param token If non-null, any history records matching this token will be skipped.
40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns the HistoryRecord of the next activity on the stack.
40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
406742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: the taskId check depends on real taskId fields being non-zero
411be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) {
41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int indexOfTokenLocked(IBinder token) {
420be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(ActivityRecord.forToken(token));
421be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
422be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
423be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final int indexOfActivityLocked(ActivityRecord r) {
424be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(r);
425ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final ActivityRecord isInStackLocked(IBinder token) {
428be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ActivityRecord r = ActivityRecord.forToken(token);
429be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        if (mHistory.contains(r)) {
430be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return r;
431ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
432ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        return null;
43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean updateLRUListLocked(ActivityRecord r) {
43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadit = mLRUActivities.remove(r);
43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLRUActivities.add(r);
43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return hadit;
43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the top activity in any existing task matching the given
44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Intent.  Returns null if no such task is found.
44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        TaskRecord cp = null;
45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
453742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
4560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
457742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (!r.finishing && r.task != cp && r.userId == userId
45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                cp = r.task;
46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + "/aff=" + r.task.affinity + " to new cls="
46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.task.affinity != null) {
46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.task.affinity.equals(info.taskAffinity)) {
46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        //Slog.i(TAG, "Found matching affinity!");
46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return r;
46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.intent != null
46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.intent.getComponent().equals(cls)) {
47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.affinityIntent != null
47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.affinityIntent.getComponent().equals(cls)) {
47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the first activity (starting from the top of the stack) that
48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is the same as the given activity.  Returns null if no such activity
49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is found.
49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
497742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
503742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.intent.getComponent().equals(cls) && r.userId == userId) {
50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
51536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    final void showAskCompatModeDialogLocked(ActivityRecord r) {
51636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        Message msg = Message.obtain();
51736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
51836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.obj = r.task.askedCompatMode ? null : r;
51936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        mService.mHandler.sendMessage(msg);
52036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    }
52136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn
522742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /*
523742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * Move the activities around in the stack to bring a user to the foreground.
524742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * @return whether there are any activities for the specified user.
525742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     */
526742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    final boolean switchUser(int userId) {
527742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        synchronized (mService) {
528742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mCurrentUser = userId;
529742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
530742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Only one activity? Nothing to do...
531742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (mHistory.size() < 2)
532742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return false;
533742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
534742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            boolean haveActivities = false;
535742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Check if the top activity is from the new user.
536742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ActivityRecord top = mHistory.get(mHistory.size() - 1);
537742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (top.userId == userId) return true;
538742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Otherwise, move the user's activities to the top.
539742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int N = mHistory.size();
540742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int i = 0;
541742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            while (i < N) {
542742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                ActivityRecord r = mHistory.get(i);
543742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.userId == userId) {
544742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    ActivityRecord moveToTop = mHistory.remove(i);
545742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mHistory.add(moveToTop);
546742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // No need to check the top one now
547742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    N--;
548742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    haveActivities = true;
549742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                } else {
550742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    i++;
551742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                }
552742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
553742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Transition from the old top to the new top
554742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            resumeTopActivityLocked(top);
555742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return haveActivities;
556742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
557742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
558742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean realStartActivityLocked(ActivityRecord r,
56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord app, boolean andResume, boolean checkConfig)
56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throws RemoteException {
56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(app, 0);
564be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.setAppVisibility(r.appToken, true);
56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Have the window manager re-evaluate the orientation of
56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the screen based on the new activity order.  Note that
56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // as a result of this, it can call back into the activity
56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // manager with a new orientation.  We don't care about that,
57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because the activity is not currently running so we are
57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // just restarting it anyway.
57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (checkConfig) {
57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
57450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mConfiguration,
575be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
576813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn            mService.updateConfigurationLocked(config, r, false, false);
57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
57850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
57950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.app = app;
5800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        app.waitingToKill = null;
58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Launching: " + r);
58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int idx = app.activities.indexOf(r);
58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (idx < 0) {
58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.add(r);
58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
58850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateLruProcessLocked(app, true, true);
58950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
59050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (app.thread == null) {
59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                throw new RemoteException();
59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<ResultInfo> results = null;
59550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<Intent> newIntents = null;
59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                results = r.results;
59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                newIntents = r.newIntents;
59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " icicle=" + r.icicle
60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " with results=" + results + " newIntents=" + newIntents
60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " andResume=" + andResume);
60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(r),
60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.task.taskId, r.shortComponentName);
60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.isHomeActivity) {
61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mHomeProcess = app;
61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
6134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.sleeping = false;
614e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
61536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn            showAskCompatModeDialogLocked(r);
6168ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
61762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile = null;
61862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            ParcelFileDescriptor profileFd = null;
61962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean profileAutoStop = false;
62062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
62162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (mService.mProfileProc == null || mService.mProfileProc == app) {
62262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.mProfileProc = app;
62362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFile = mService.mProfileFile;
62462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = mService.mProfileFd;
62562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop = mService.mAutoStopProfiler;
62662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
62762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
628f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn            app.hasShownUi = true;
629c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            app.pendingUiClean = true;
63062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFd != null) {
63162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                try {
63262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = profileFd.dup();
63362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                } catch (IOException e) {
63462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = null;
63562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
63662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
637be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
638813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    System.identityHashCode(r), r.info,
639813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    new Configuration(mService.mConfiguration),
64058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    r.compat, r.icicle, results, newIntents, !andResume,
64162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.isNextTransitionForward(), profileFile, profileFd,
64262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop);
64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
64454e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Note that the package
64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // manager will ensure that only activity can run in the main
64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // process of the .apk, which is the only thing that will be
64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // considered heavy-weight.
64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (app.processName.equals(app.info.packageName)) {
65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null
65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && mService.mHeavyWeightProcess != app) {
65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Log.w(TAG, "Starting new heavy weight process " + app
65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " when already running "
65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + mService.mHeavyWeightProcess);
65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = app;
65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Message msg = mService.mHandler.obtainMessage(
65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    msg.obj = r;
66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendMessage(msg);
66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.launchFailed) {
66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second time we failed -- finish activity
66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and give up.
66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.e(TAG, "Second failure launching "
66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + r.intent.getComponent().flattenToShortString()
67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + ", giving up", e);
67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.appDiedLocked(app, app.pid, app.thread);
672be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "2nd-crash");
67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return false;
67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This is the first time we failed -- restart process and
67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // retry.
67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.remove(r);
68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw e;
68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.launchFailed = false;
68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (updateLRUListLocked(r)) {
68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r
68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                  + " being launched, but already in LRU list");
68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // As part of the process of launching, ActivityThread also performs
69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // a resume.
69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.RESUMED;
693ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r
694ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting new instance)");
69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = false;
69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = r;
69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.task.touchActiveTime();
69888819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
69988819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(r.task);
70088819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            completeResumeLocked(r);
7024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
70398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
70498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.icicle = null;
70598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.haveState = false;
70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not starting in the resumed state... which
70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should look like we asked it to pause+stop (but remain visible),
70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and it has done so and reported back the current icicle and
71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // other state.
711ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
712ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting in stopped state)");
71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPED;
71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = true;
71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Launch the new version setup screen if needed.  We do this -after-
71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // launching the initial activity (that is, home), so that it can have
71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a chance to initialize itself while in the background, making the
72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // switch back to it faster and look better.
72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.startSetupActivityLocked();
72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startSpecificActivityLocked(ActivityRecord r,
72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean andResume, boolean checkConfig) {
73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Is this activity's application already running?
73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.info.applicationInfo.uid);
73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7340dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        if (r.launchTime == 0) {
7350dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            r.launchTime = SystemClock.uptimeMillis();
73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mInitialStartTime == 0) {
7370dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mInitialStartTime = r.launchTime;
73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mInitialStartTime == 0) {
74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mInitialStartTime = SystemClock.uptimeMillis();
74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (app != null && app.thread != null) {
74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
7456c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                app.addPackage(r.info.packageName);
74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                realStartActivityLocked(r, app, andResume, checkConfig);
74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception when starting activity "
75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + r.intent.getComponent().flattenToShortString(), e);
75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
75250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If a dead object exception was thrown -- fall through to
75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // restart the application.
75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
75750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
758a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn                "activity", r.intent.getComponent(), false, false);
75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void stopIfSleepingLocked() {
7624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.isSleeping()) {
76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mGoingToSleep.isHeld()) {
76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mGoingToSleep.acquire();
76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mLaunchingActivity.isHeld()) {
76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
7704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
7714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG);
7724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT);
7734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
7744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
7754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void awakeFromSleepingLocked() {
7784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
7794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mSleepTimeout = false;
7804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
7814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
7824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
7834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        // Ensure activities are no longer sleeping.
7844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
7850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
7864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.setSleeping(false);
7874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
7884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.clear();
7894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
7904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
7914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void activitySleptLocked(ActivityRecord r) {
7924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
7934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        checkReadyForSleepLocked();
7944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
7954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
7964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void checkReadyForSleepLocked() {
7974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mService.isSleeping()) {
7984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Do not care.
7994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            return;
8004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mSleepTimeout) {
8034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mResumedActivity != null) {
8044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still have something resumed; can't sleep until it is paused.
8054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity);
80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, true);
8084eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
810621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity != null) {
8114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still waiting for something to pause; can't sleep yet.
812621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity);
8134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8144eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mStoppingActivities.size() > 0) {
8174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to stop; can't sleep yet.
8184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
8194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mStoppingActivities.size() + " activities");
82080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                scheduleIdleLocked();
8214eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8224eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            ensureActivitiesVisibleLocked(null, 0);
8254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Make sure any stopped but visible activities are now sleeping.
8274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // This ensures that the activity's onStop() is called.
8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            for (int i=mHistory.size()-1; i>=0; i--) {
8290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord r = mHistory.get(i);
8304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
8334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mGoingToSleepActivities.size() > 0) {
8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to sleep; can't sleep yet.
8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
8384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mGoingToSleepActivities.size() + " activities");
8394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
8424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.mShuttingDown) {
8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mService.notifyAll();
8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
853d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public final Bitmap screenshotActivities(ActivityRecord who) {
854ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        if (who.noDisplay) {
855ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn            return null;
856ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        }
857ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn
8580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Resources res = mService.mContext.getResources();
8590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int w = mThumbnailWidth;
8600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int h = mThumbnailHeight;
8610aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w < 0) {
8620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailWidth = w =
8630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
8640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailHeight = h =
8650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
8660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
8670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
8680aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w > 0) {
869be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return mService.mWindowManager.screenshotApplications(who.appToken, w, h);
8700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
8710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return null;
8720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
8730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
875621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
876621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            RuntimeException e = new RuntimeException();
877621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            Slog.e(TAG, "Trying to pause when pause is already pending for "
878621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                  + mPausingActivity, e);
879621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord prev = mResumedActivity;
88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev == null) {
88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            RuntimeException e = new RuntimeException();
88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
887ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);
888ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mResumedActivity = null;
890621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        mPausingActivity = prev;
89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLastPausedActivity = prev;
89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.state = ActivityState.PAUSING;
89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.task.touchActiveTime();
894f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        prev.updateThumbnail(screenshotActivities(prev), null);
89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateCpuStats();
89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.app.thread != null) {
89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(prev),
90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        prev.shortComponentName);
904be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
905be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        userLeaving, prev.configChangeFlags);
90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.updateUsageStats(prev, false);
90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Ignore exception, if process died other code will cleanup.
91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
912621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                mPausingActivity = null;
91350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mLastPausedActivity = null;
91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
916621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLastPausedActivity = null;
91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
92050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not going to sleep, we want to ensure the device is
92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // awake until the next activity is started.
92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mService.mSleeping && !mService.mShuttingDown) {
92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLaunchingActivity.acquire();
92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // To be safe, don't allow the wake lock to be held for too long.
92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT);
92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
931621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
932621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager pause its key dispatching until the new
93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity has started.  If we're pausing the activity just because
93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen is being turned off and the UI is sleeping, don't interrupt
93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // key dispatch; the same activity will pick it up again on wakeup.
93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!uiSleeping) {
938621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev.pauseKeyDispatchingLocked();
93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Schedule a pause timeout in case the app doesn't respond.
94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We don't give it much time because this directly impacts the
94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // responsiveness seen by the user.
94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = prev;
94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity failed to schedule the
95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // pause, so just treat it as being paused now.
95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
954621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(null);
95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
9580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    final void activityPaused(IBinder token, boolean timeout) {
95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(
9600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = null;
96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(token);
96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
9670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                r = mHistory.get(index);
96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
969621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (mPausingActivity == r) {
970ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
971ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                            + (timeout ? " (due to timeout)" : " (pause complete)"));
97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.state = ActivityState.PAUSED;
973621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    completePauseLocked();
97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            System.identityHashCode(r), r.shortComponentName,
977621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            mPausingActivity != null
978621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                                ? mPausingActivity.shortComponentName : "(none)");
97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
984ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail,
985ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            CharSequence description) {
98698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle);
987ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.icicle = icicle;
988ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.haveState = true;
989ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.updateThumbnail(thumbnail, description);
990ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.stopped = true;
991ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
992ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.state = ActivityState.STOPPED;
993ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (!r.finishing) {
994ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (r.configDestroy) {
99528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "stop-config");
996ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                resumeTopActivityLocked(null);
99750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn            } else {
99850685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // Now that this process has stopped, we may want to consider
99950685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // it to be the previous app to try to keep around in case
100050685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // the user wants to return to it.
100150685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                ProcessRecord fgApp = null;
100250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                if (mResumedActivity != null) {
100350685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    fgApp = mResumedActivity.app;
1004621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                } else if (mPausingActivity != null) {
1005621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    fgApp = mPausingActivity.app;
100650685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
100750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                if (r.app != null && fgApp != null && r.app != fgApp
100850685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                        && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
100950685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                        && r.app != mService.mHomeProcess) {
101050685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    mService.mPreviousProcess = r.app;
101150685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
101250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
1013ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1014ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
1015ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
1016ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
1017621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    private final void completePauseLocked() {
1018621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        ActivityRecord prev = mPausingActivity;
101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1021621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1022621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (prev.finishing) {
1023621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
1024621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
1025621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else if (prev.app != null) {
1026621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
1027621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.waitingVisible) {
1028621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    prev.waitingVisible = false;
1029621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mWaitingVisibleActivities.remove(prev);
1030621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
1031621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            TAG, "Complete pause, no longer waiting: " + prev);
1032621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                }
1033621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.configDestroy) {
1034621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // The previous is being paused because the configuration
1035621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // is changing, which means it is actually stopping...
1036621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // To juggle the fact that we are also starting a new
1037621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // instance right now, we need to first completely stop
1038621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // the current instance before starting the new one.
1039621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
1040621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    destroyActivityLocked(prev, true, false, "pause-config");
104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
1042621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mStoppingActivities.add(prev);
1043621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (mStoppingActivities.size() > 3) {
1044621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // If we already have a few activities waiting to stop,
1045621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // then give up on things going idle and start clearing
1046621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // them out.
1047621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
1048621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        scheduleIdleLocked();
1049621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    } else {
1050621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        checkReadyForSleepLocked();
1051621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    }
105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1053621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else {
1054621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
1055621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = null;
105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
1057621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1060621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (!mService.isSleeping()) {
1061621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(prev);
1062621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        } else {
10634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1065621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
1066621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1067621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            prev.resumeKeyDispatchingLocked();
1068621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.cpuTimeAtResume > 0
107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mService.mBatteryStatsService.isOnBattery()) {
107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long diff = 0;
107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid)
107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        - prev.cpuTimeAtResume;
107650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (diff > 0) {
107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (bsi) {
108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    BatteryStatsImpl.Uid.Proc ps =
108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            prev.info.packageName);
108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (ps != null) {
108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ps.addForegroundTimeLocked(diff);
108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.cpuTimeAtResume = 0; // reset it
109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Once we know that we have asked an application to put an activity in
109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the resumed state (either by launching it or explicitly telling it),
109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * this function updates the rest of our state to match that fact.
109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void completeResumeLocked(ActivityRecord next) {
109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.idle = false;
109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.results = null;
110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.newIntents = null;
110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // schedule an idle timeout in case the app doesn't do it for us.
110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        msg.obj = next;
110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (false) {
110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity was never told to pause, so just keep
110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // things going as-is.  To maintain our own state,
111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we need to emulate it coming back and saying it is
111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // idle.
111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg = mHandler.obtainMessage(IDLE_NOW_MSG);
111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = next;
111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessage(msg);
111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.reportResumedActivityLocked(next);
111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1121f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        next.clearThumbnail();
112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.setFocusedActivityLocked(next);
112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1125621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        next.resumeKeyDispatchingLocked();
112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ensureActivitiesVisibleLocked(null, 0);
112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.executeAppTransition();
112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mNoAnimActivities.clear();
112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Mark the point when the activity is resuming
113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // TODO: To be more accurate, the mark should be before the onCreate,
113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //       not after the onResume. But for subsequent starts, onResume is fine.
113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null) {
113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process
113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure that all activities that need to be visible (that is, they
114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * currently can be seen by the user) actually are.
114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord top,
114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord starting, String onlyThisProcess, int configChanges) {
114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_VISBILITY) Slog.v(
114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "ensureActivitiesVisible behind " + top
115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " configChanges=0x" + Integer.toHexString(configChanges));
115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is not fullscreen, then we need to
115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure any activities under it are now visible.
115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int count = mHistory.size();
115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = count-1;
115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (mHistory.get(i) != top) {
115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r;
116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean behindFullscreen = false;
116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (; i>=0; i--) {
11620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make visible? " + r + " finishing=" + r.finishing
116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state);
116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean doThisProcess = onlyThisProcess == null
117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || onlyThisProcess.equals(r.processName);
117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // First: if this is not the current activity being started, make
117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // sure it matches the current configuration.
117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != starting && doThisProcess) {
117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivityConfigurationLocked(r, 0);
117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == null || r.app.thread == null) {
118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (onlyThisProcess == null
118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        || onlyThisProcess.equals(r.processName)) {
118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // This activity needs to be visible, but isn't even
118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // running...  get it started, but don't resume it
118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // at this point.
118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Start and freeze screen for " + r);
118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.startFreezingScreenLocked(r.app, configChanges);
118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!r.visible) {
119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Starting and making visible: " + r);
1193be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        startSpecificActivityLocked(r, false, false);
119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (r.visible) {
120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is already visible, then there is nothing
120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // else to do here.
120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Skipping: already visible at " + r);
120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopFreezingScreenLocked(false);
120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (onlyThisProcess == null) {
120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This activity is not currently visible, but is running.
120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Tell it to become visible.
121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.visible = true;
121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state != ActivityState.RESUMED && r != starting) {
121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is paused, tell it
121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to now show its window.
121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Making visible and scheduling visibility: " + r);
121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    try {
1217be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
12184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        r.sleeping = false;
1219905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                        r.app.pendingUiClean = true;
1220be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.app.thread.scheduleWindowVisibility(r.appToken, true);
122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.stopFreezingScreenLocked(false);
122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } catch (Exception e) {
122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Just skip on any failure; we'll make it
122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // visible when it next restarts.
122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Slog.w(TAG, "Exception thrown making visibile: "
122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + r.intent.getComponent(), e);
122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Aggregate current change flags.
123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            configChanges |= r.configChangeFlags;
123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.fullscreen) {
123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // At this point, nothing else needs to be shown
123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping: fullscreen at " + r);
123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                behindFullscreen = true;
123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now for any activities that aren't visible to the user, make
124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // sure they no longer are keeping the screen frozen.
124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
12470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state
125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " behindFullscreen=" + behindFullscreen);
125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (behindFullscreen) {
125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.visible) {
125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Making invisible: " + r);
125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.visible = false;
125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
1259be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppVisibility(r.appToken, false);
126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if ((r.state == ActivityState.STOPPING
126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    || r.state == ActivityState.STOPPED)
126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    && r.app != null && r.app.thread != null) {
126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (DEBUG_VISBILITY) Slog.v(
126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        TAG, "Scheduling invisibility: " + r);
1265be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                r.app.thread.scheduleWindowVisibility(r.appToken, false);
126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (Exception e) {
126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Just skip on any failure; we'll make it
126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // visible when it next restarts.
127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Exception thrown making hidden: "
127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + r.intent.getComponent(), e);
127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Already invisible: " + r);
127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.fullscreen) {
127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Now behindFullscreen: " + r);
128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    behindFullscreen = true;
128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Version of ensureActivitiesVisible that can easily be called anywhere.
128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord starting,
129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int configChanges) {
129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = topRunningActivityLocked(null);
129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r != null) {
129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ensureActivitiesVisibleLocked(r, starting, null, configChanges);
129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Ensure that the top activity in the stack is resumed.
130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param prev The previously resumed activity, for when in the process
130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of pausing; can be null to call from elsewhere.
130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if something is being resumed, or false if
130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * nothing happened.
130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev) {
130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Find the first activity that is not finishing.
130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord next = topRunningActivityLocked(null);
131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remember how we'll process this pause/resume situation, and ensure
131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the state is reset however we wind up proceeding.
131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean userLeaving = mUserLeaving;
131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = false;
131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next == null) {
131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are no more activities!  Let's just start up the
131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Launcher...
131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
1320742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return mService.startHomeActivityLocked(0);
132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.delayedResume = false;
132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is the resumed one, nothing to do.
132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == next && next.state == ActivityState.RESUMED) {
132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are sleeping, and there is no resumed activity, and the top
133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity is paused, well that is the state we want.
133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((mService.mSleeping || mService.mShuttingDown)
133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mLastPausedActivity == next && next.state == ActivityState.PAUSED) {
133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // The activity may be waiting for stop, but that is no longer
134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // appropriate for it.
134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(next);
13494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(next);
13504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        next.sleeping = false;
135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(next);
135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1355621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // If we are currently pausing an activity, then don't do anything
1356621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // until that is done.
1357621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
1358621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity);
1359621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            return false;
1360621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
1361621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
13620dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // Okay we are now going to start a switch, to 'next'.  We may first
13630dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // have to pause the current activity, but this is an important point
13640dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // where we have decided to go to 'next' so keep track of that.
1365034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // XXX "App Redirected" dialog is getting too many false positives
1366034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // at this point, so turn off for now.
1367034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        if (false) {
1368034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn            if (mLastStartedActivity != null && !mLastStartedActivity.finishing) {
1369034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                long now = SystemClock.uptimeMillis();
1370034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final boolean inTime = mLastStartedActivity.startTime != 0
1371034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && (mLastStartedActivity.startTime + START_WARN_TIME) >= now;
1372034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int lastUid = mLastStartedActivity.info.applicationInfo.uid;
1373034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int nextUid = next.info.applicationInfo.uid;
1374034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                if (inTime && lastUid != nextUid
1375034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && lastUid != next.launchedFromUid
1376034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && mService.checkPermission(
1377034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                android.Manifest.permission.STOP_APP_SWITCHES,
1378034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                -1, next.launchedFromUid)
1379034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
1380034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mService.showLaunchWarningLocked(mLastStartedActivity, next);
1381034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                } else {
1382034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    next.startTime = now;
1383034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mLastStartedActivity = next;
1384034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                }
13850dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            } else {
1386034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                next.startTime = SystemClock.uptimeMillis();
13870dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mLastStartedActivity = next;
13880dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            }
13890dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        }
13900dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We need to start pausing the current activity so the top one
139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can be resumed...
139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity != null) {
139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startPausingLocked(userLeaving, false);
139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null && prev != next) {
140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!prev.waitingVisible && next != null && !next.nowVisible) {
140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                prev.waitingVisible = true;
140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.add(prev);
140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(
140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Resuming top, waiting visible to hide: " + prev);
140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The next activity is already visible, so hide the previous
140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity's windows right now so we can show the new one ASAP.
140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We only do this if the previous is finishing, which should mean
140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it is on top of the one being resumed so hiding it quickly
141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is good.  Otherwise, we want to do the normal route of allowing
141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the resumed activity to be shown so we can decide if the
141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // previous should actually be hidden depending on whether the
141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // new one is found to be full-screen or not.
141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev.finishing) {
1415be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(prev.appToken, false);
141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + prev + ", waitingVisible="
141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + (prev != null ? prev.waitingVisible : null)
141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + ", nowVisible=" + next.nowVisible);
142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + prev + ", waitingVisible="
142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + (prev != null ? prev.waitingVisible : null)
142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", nowVisible=" + next.nowVisible);
142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1429e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Launching this app's activity, make sure the app is no longer
1430e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // considered stopped.
1431e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        try {
1432742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // TODO: Apply to the correct userId
1433e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            AppGlobals.getPackageManager().setPackageStoppedState(
1434e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn                    next.packageName, false);
1435e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } catch (RemoteException e1) {
1436a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn        } catch (IllegalArgumentException e) {
1437a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn            Slog.w(TAG, "Failed trying to unstop package "
1438a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn                    + next.packageName + ": " + e);
1439e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
1440e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are starting up the next activity, so tell the window manager
144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the previous one will be hidden soon.  This way it can know
144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to ignore it when computing the desired screen orientation.
144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null) {
144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (prev.finishing) {
144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare close transition: prev=" + prev);
144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(prev)) {
14497da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
14507da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
14547da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
145550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1456be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1457be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare open transition: prev=" + prev);
146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(next)) {
14627da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
14637da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
14677da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (false) {
1471be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1472be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mHistory.size() > 1) {
147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: no previous");
147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mNoAnimActivities.contains(next)) {
14787da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
14797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, false);
148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
14817da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
14827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null && next.app.thread != null) {
148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is now becoming visible.
1490be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(next.appToken, true);
149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord lastResumedActivity = mResumedActivity;
149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityState lastState = next.state;
149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateCpuStats();
149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1497ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.state = ActivityState.RESUMED;
149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = next;
150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.task.touchActiveTime();
150188819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
150288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(next.task);
150388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateLruProcessLocked(next.app, true, true);
150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            updateLRUListLocked(next);
150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager re-evaluate the orientation of
150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen based on the new activity order.
150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean updated = false;
151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (mService) {
151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mConfiguration,
1514be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null);
151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (config != null) {
151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.frozenBeforeDestroy = true;
151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
1518813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    updated = mService.updateConfigurationLocked(config, next, false, false);
151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!updated) {
152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The configuration update wasn't able to keep the existing
152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity, and instead started a new one.
152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We should be all done, but let's just make sure our activity
152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is still at the top and schedule another run if something
152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // weird happened.
152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord nextNext = topRunningActivityLocked(null);
152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG,
152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Activity config changed during resume: " + next
153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", new next: " + nextNext);
153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (nextNext != next) {
153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Do over!
153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(next);
153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.executeAppTransition();
154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.clear();
154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Deliver all pending results.
154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList a = next.results;
154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (a != null) {
154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final int N = a.size();
154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!next.finishing && N > 0) {
155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_RESULTS) Slog.v(
155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Delivering results to " + next
155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + ": " + a);
1553be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        next.app.thread.scheduleSendResult(next.appToken, a);
155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (next.newIntents != null) {
1558be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(next),
156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.task.taskId, next.shortComponentName);
156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                next.sleeping = false;
156636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn                showAskCompatModeDialogLocked(next);
1567905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                next.app.pendingUiClean = true;
1568be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                next.app.thread.scheduleResumeActivity(next.appToken,
156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.isNextTransitionForward());
157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                checkReadyForSleepLocked();
157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Whoops, need to restart this activity!
1575ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to "
1576ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + lastState + ": " + next);
157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.state = lastState;
157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mResumedActivity = lastResumedActivity;
157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.i(TAG, "Restarting because process died: " + next);
158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!next.hasBeenLaunched) {
158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.hasBeenLaunched = true;
158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (SHOW_APP_STARTING_PREVIEW && mMainStack) {
158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mWindowManager.setAppStartingWindow(
1585be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                next.appToken, next.packageName, next.theme,
15862f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                mService.compatibilityInfoForPackageLocked(
15872f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                        next.info.applicationInfo),
158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                next.nonLocalizedLabel,
15897eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                next.labelRes, next.icon, next.windowFlags,
15907eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                null, true);
159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startSpecificActivityLocked(next, true, false);
159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // From this point on, if something goes wrong there is no way
159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to recover the activity.
159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.visible = true;
160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                completeResumeLocked(next);
160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If any exception gets thrown, toss away this
160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity and try the next one.
160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during resume of " + next, e);
1606be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "resume-exception");
160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Didn't need to use the icicle, and it is now out of date.
161298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next);
161350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.icicle = null;
161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.haveState = false;
161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.stopped = false;
161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Whoops, need to restart this activity!
161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!next.hasBeenLaunched) {
162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.hasBeenLaunched = true;
162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (SHOW_APP_STARTING_PREVIEW) {
162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.setAppStartingWindow(
1624be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.appToken, next.packageName, next.theme,
16252f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            mService.compatibilityInfoForPackageLocked(
16262f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                    next.info.applicationInfo),
162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            next.nonLocalizedLabel,
16287eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            next.labelRes, next.icon, next.windowFlags,
16297eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            null, true);
163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startSpecificActivityLocked(next, true, true);
163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startActivityLocked(ActivityRecord r, boolean newTask,
16407da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            boolean doResume, boolean keepCurTransition) {
164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int NH = mHistory.size();
164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int addPos = -1;
164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!newTask) {
164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If starting in an existing task, find where that is...
164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean startIt = true;
164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (int i = NH-1; i >= 0; i--) {
16490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord p = mHistory.get(i);
165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.finishing) {
165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    continue;
165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.task == r.task) {
165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Here it is!  Now, if this is not yet visible to the
165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // user, then just add it without starting; it will
165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // get started when the user navigates back to it.
165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    addPos = i+1;
165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!startIt) {
165998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
166098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
166198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
166298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos,
166398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    here);
166498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(addPos, r);
1666f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        r.putInHistory();
1667be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                r.info.screenOrientation, r.fullscreen);
166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
1670be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    break;
167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.fullscreen) {
167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    startIt = false;
167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Place a new activity at top of stack, so it is next to interact
168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // with the user.
168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < 0) {
16850dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            addPos = NH;
168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not placing the new activity frontmost, we do not want
168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to deliver the onUserLeaving callback to the actual frontmost
169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity
169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < NH) {
169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mUserLeaving = false;
169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Slot the activity into the history stack and proceed
169798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
169898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
169998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
170098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here);
170198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(addPos, r);
1703f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        r.putInHistory();
170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frontOfTask = newTask;
170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (NH > 0) {
170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We want to show the starting preview window if we are
170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // switching to a new task, or the next activity's process is
170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // not currently running.
170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean showStartingIcon = newTask;
171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord proc = r.app;
171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null) {
171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null || proc.thread == null) {
171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                showStartingIcon = true;
171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: starting " + r);
171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
17207da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
17217da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(
17257da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition);
172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(newTask
172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? WindowManagerPolicy.TRANSIT_TASK_OPEN
17307da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.addAppToken(
1734be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen);
173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean doShow = true;
173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (newTask) {
173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Even though this activity is starting fresh, we still need
173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to reset it to make sure we apply affinities to move any
173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // existing activities from other tasks in to it.
174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller has requested that the target task be
174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // reset, then do so.
174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()
174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resetTaskIfNeededLocked(r, r);
174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    doShow = topRunningNonDelayedActivityLocked(null) == r;
174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (SHOW_APP_STARTING_PREVIEW && doShow) {
174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Figure out if we are transitioning from another activity that is
175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // "has the same starting icon" as the next one.  This allows the
175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // window manager to keep the previous window it had previously
175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // created, if it still had one.
175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord prev = mResumedActivity;
175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev != null) {
175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't want to reuse the previous starting preview if:
175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (1) The current activity is in a different task.
175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (prev.task != r.task) prev = null;
175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (2) The current activity is already displayed.
175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    else if (prev.nowVisible) prev = null;
176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.setAppStartingWindow(
1762be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.appToken, r.packageName, r.theme,
17632f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                        mService.compatibilityInfoForPackageLocked(
17642f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                r.info.applicationInfo), r.nonLocalizedLabel,
1765be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.labelRes, r.icon, r.windowFlags,
1766be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        prev != null ? prev.appToken : null, showStartingIcon);
176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this is the first activity, don't do any fancy animations,
177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // because there is nothing for it to animate on top of.
1771be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.info.screenOrientation, r.fullscreen);
177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
1775be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (doResume) {
177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1783be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final void validateAppTokensLocked() {
1784be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.clear();
1785be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.ensureCapacity(mHistory.size());
1786be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        for (int i=0; i<mHistory.size(); i++) {
1787be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mValidateAppTokens.add(mHistory.get(i).appToken);
1788be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        }
1789be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.validateAppTokens(mValidateAppTokens);
1790be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
1791be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform a reset of the given task, if needed as part of launching it.
179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the new HistoryRecord at the top of the task.
179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord newActivity) {
179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean forceReset = (newActivity.info.flags
179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0;
1800621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (ACTIVITY_INACTIVE_RESET_TIME > 0
1801621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) {
180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((newActivity.info.flags
180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) {
180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                forceReset = true;
180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final TaskRecord task = taskTop.task;
180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are going to move through the history list so that we can look
181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // at each activity 'target' with 'below' either the interesting
181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity immediately below it in the stack or null.
181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord target = null;
181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int targetI = 0;
181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int taskTopI = -1;
181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int replyChainEnd = -1;
181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int lastReparentPos = -1;
181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mHistory.size()-1; i>=-1; i--) {
18190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (below != null && below.finishing) {
182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target == null) {
182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                target = below;
182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                targetI = i;
182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If we were in the middle of a reply chain before this
182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, it doesn't appear like the root of the chain wants
182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // anything interesting, so drop it.
183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                replyChainEnd = -1;
183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int flags = target.info.flags;
183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean finishOnTaskLaunch =
183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean allowTaskReparenting =
183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0;
184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target.task == task) {
184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of the task being reset...  we'll either
184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // finish this activity, push it out for another task,
184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // or leave it as-is.  We only do this
184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for activities that are not the root of the task (since
184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // if we finish the root, we may no longer have the task!).
184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTopI < 0) {
184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    taskTopI = targetI;
184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (below != null && below.task == task) {
185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final boolean clearWhenTaskReset =
185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (target.intent.getFlags()
185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0;
185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) {
185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity is sending a reply to a previous
185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, we can't do anything with it now until
185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // we reach the start of the reply chain.
185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // XXX note that we are assuming the result is always
185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to the previous activity, which is almost always
186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the case but we really shouldn't count on.
186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting
186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && target.taskAffinity != null
186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && !target.taskAffinity.equals(task.affinity)) {
186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity has an affinity for another
186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // task, then we need to move it out of here.  We will
186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // move it as far out of the way as possible, to the
187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // bottom of the activity stack.  This also keeps it
187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // correctly ordered with any activities we previously
187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // moved.
18730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(0);
187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (target.taskAffinity != null
187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && target.taskAffinity.equals(p.task.affinity)) {
187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // If the activity currently at the bottom has the
187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // same task affinity as the one we are moving,
187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // then merge it into the same task.
1879f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(p.task, p.thumbHolder, false);
188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to bottom task " + p.task);
188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mCurTask++;
188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (mService.mCurTask <= 0) {
188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                mService.mCurTask = 1;
188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
1887f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(new TaskRecord(mService.mCurTask, target.info, null),
1888f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                                    null, false);
188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            target.task.affinityIntent = target.intent;
189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to new task " + target.task);
189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
1893be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(target.appToken, task.taskId);
189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int dstPos = 0;
1898f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        ThumbnailHolder curThumbHolder = target.thumbHolder;
189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
19000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to target's task " + target.task);
1906f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            p.setTask(target.task, curThumbHolder, false);
1907f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            curThumbHolder = p.thumbHolder;
190898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            if (DEBUG_ADD_REMOVE) {
190998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                RuntimeException here = new RuntimeException("here");
191098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                here.fillInStackTrace();
191198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
191298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                        + dstPos, here);
191398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            }
191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.remove(srcPos);
191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.add(dstPos, p);
1916be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.moveAppToken(dstPos, p.appToken);
1917be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            dstPos++;
191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (VALIDATE_TOKENS) {
1920be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                validateAppTokensLocked();
192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            i++;
192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (forceReset || finishOnTaskLaunch
193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || clearWhenTaskReset) {
193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the activity should just be removed -- either
193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // because it asks for it, or the task should be
193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cleared -- then finish it and anything that is
193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // part of its reply chain.
193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (clearWhenTaskReset) {
193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case, we want to finish this activity
193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // and everything above it, so be sneaky and pretend
194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // like these are all in the reply chain.
194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI+1;
194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            while (replyChainEnd < mHistory.size() &&
19430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                                    (mHistory.get(
194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                                replyChainEnd)).task == task) {
194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd++;
194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (replyChainEnd < 0) {
194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord p = null;
195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
19530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (finishActivityLocked(p, srcPos,
195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    Activity.RESULT_CANCELED, null, "reset")) {
195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd--;
196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                srcPos--;
196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If we were in the middle of a chain, well the
197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity that started it all doesn't want anything
197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // special, so leave it all as-is.
197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Reached the bottom of the task -- any reply chain
197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // should be left as-is.
197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1981ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
1982ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (target.resultTo != null && (below == null
1983ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    || below.task == target.task)) {
198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is sending a reply to a previous
198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity, we can't do anything with it now until
198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we reach the start of the reply chain.
198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // XXX note that we are assuming the result is always
198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to the previous activity, which is almost always
198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the case but we really shouldn't count on.
199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (replyChainEnd < 0) {
199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = targetI;
199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (taskTopI >= 0 && allowTaskReparenting
199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity != null
199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity.equals(target.taskAffinity)) {
199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of another task...  if this activity has
199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // an affinity for our task, then either remove it if we are
199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // clearing or move it over to our task.  Note that
200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we currently punt on the case where we are resetting a
200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task that is not at the top but who has activities above
200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // with an affinity to it...  this is really not a normal
200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // case, and we will need to later pull that task to the front
200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and usually at that point we will do the reset and pick
200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up those remaining activities.  (This only happens if
200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // someone starts an activity in a new task from an activity
200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in a task that is not currently on top.)
200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (forceReset || finishOnTaskLaunch) {
200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord p = null;
2013ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index "
2014ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        p = mHistory.get(srcPos);
201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (finishActivityLocked(p, srcPos,
202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Activity.RESULT_CANCELED, null, "reset")) {
202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI--;
202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            srcPos--;
202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2033ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index "
2034ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) {
20360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(srcPos);
203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (lastReparentPos < 0) {
204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos = taskTopI;
204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = p;
204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
204698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
204798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
204898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
204998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
205098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    + lastReparentPos, here);
205198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.remove(srcPos);
2053f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        p.setTask(task, null, false);
205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(lastReparentPos, p);
205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
2056ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                                + " from " + srcPos + " to " + lastReparentPos
205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " in to resetting task " + task);
2058be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken);
2059be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
2061be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Now we've moved it in to place...  but what if this is
206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // a singleTop activity and we have put it on top of another
206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // instance of the same activity?  Then we drop the instance
206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // below so it remains singleTop.
207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int j=lastReparentPos-1; j>=0; j--) {
20720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            ActivityRecord p = mHistory.get(j);
207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (finishActivityLocked(p, j,
207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        Activity.RESULT_CANCELED, null, "replace")) {
207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    taskTopI--;
208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    lastReparentPos--;
208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                }
208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2086ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2087ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (below != null && below.task != target.task) {
2088ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // We hit the botton of a task; the reply chain can't
2089ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // pass through it.
2090ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                replyChainEnd = -1;
209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            target = below;
209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            targetI = i;
209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return taskTop;
209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clear operation as requested by
210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the
210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * stack to the given task, then look for
210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * an instance of that activity in the stack and, if found, finish all
210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities on top of it and return the instance.
210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param newR Description of the new activity being started.
2108621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @return Returns the old activity that should be continued to be used,
210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * or null if none was found.
211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord performClearTaskLocked(int taskId,
2112621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            ActivityRecord newR, int launchFlags) {
211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First find the requested task.
211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
21180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == taskId) {
212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i++;
212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now clear it.
212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
21280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId != taskId) {
213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return null;
213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.realActivity.equals(newR.realActivity)) {
213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Here it is!  Now finish everything in front...
213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord ret = r;
2138621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                while (i < (mHistory.size()-1)) {
2139621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    i++;
21400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    r = mHistory.get(i);
2141621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.task.taskId != taskId) {
2142621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
2143621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2144621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.finishing) {
2145621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
2146621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2147621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
2148621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            null, "clear")) {
2149621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        i--;
215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Finally, if this is a normal launch mode (that is, not
215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // expecting onNewIntent()), then we will finish the current
215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity so a new fresh one can be started.
215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!ret.finishing) {
2159be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        int index = indexOfTokenLocked(ret.appToken);
216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (index >= 0) {
216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    null, "clear");
216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return null;
216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return ret;
216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * Completely remove all activities associated with an existing
21770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * task starting at a specified index.
21780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     */
21790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private final void performClearTaskAtIndexLocked(int taskId, int i) {
2180eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn        while (i < mHistory.size()) {
21810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
21820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.task.taskId != taskId) {
21830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                // Whoops hit the end.
21840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return;
21850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
21860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.finishing) {
21870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
21880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
21890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
21900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
21910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    null, "clear")) {
21920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
21930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
21940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
21950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
21960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
21970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    /**
2198621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Completely remove all activities associated with an existing task.
2199621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
2200621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    private final void performClearTaskLocked(int taskId) {
2201621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int i = mHistory.size();
2202621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2203621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // First find the requested task.
2204621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2205621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
22060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2207621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId == taskId) {
2208621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                i++;
2209621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                break;
2210621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2211621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2212621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
22130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Now find the start and clear it.
2214621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2215621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
22160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2217621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.finishing) {
2218621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                continue;
2219621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2220621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId != taskId) {
2221621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // We hit the bottom.  Now finish it all...
22220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                performClearTaskAtIndexLocked(taskId, i+1);
2223621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                return;
2224621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2225621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2226621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2227621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Find the activity in the history stack within the given task.  Returns
223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the index within the history at which it's found, or < 0 if not found.
223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final int findActivityInHistoryLocked(ActivityRecord r, int task) {
223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord candidate = mHistory.get(i);
223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.task.taskId != task) {
223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.realActivity.equals(r.realActivity)) {
224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return i;
224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return -1;
224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Reorder the history stack so that the activity at the given index is
225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * brought to the front.
225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord moveActivityToFrontLocked(int where) {
22530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord newTop = mHistory.remove(where);
225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size();
22550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord oldTop = mHistory.get(top-1);
225698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
225798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
225898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
225998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at "
226098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    + top, here);
226198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(top, newTop);
226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        oldTop.frontOfTask = false;
226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        newTop.frontOfTask = true;
226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return newTop;
226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityLocked(IApplicationThread caller,
226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Intent intent, String resolvedType,
227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Uri[] grantedUriPermissions,
227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int grantedMode, ActivityInfo aInfo, IBinder resultTo,
227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode,
227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid, int callingUid, boolean onlyIfNeeded,
2274621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity) {
2275efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2276efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        int err = START_SUCCESS;
2277efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2278efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        ProcessRecord callerApp = null;
2279efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (caller != null) {
2280efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            callerApp = mService.getRecordForAppLocked(caller);
2281efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            if (callerApp != null) {
2282efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingPid = callerApp.pid;
2283efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingUid = callerApp.info.uid;
2284efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            } else {
2285efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                Slog.w(TAG, "Unable to find app for caller " + caller
2286efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + " (pid=" + callingPid + ") when starting: "
2287efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + intent.toString());
2288efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                err = START_PERMISSION_DENIED;
2289efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            }
2290efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
2291efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2292efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (err == START_SUCCESS) {
229390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            Slog.i(TAG, "START {" + intent.toShortString(true, true, true) + "} from pid "
2294efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                    + (callerApp != null ? callerApp.pid : callingPid));
2295efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord sourceRecord = null;
229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultRecord = null;
229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(resultTo);
230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(
230298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Will send result to " + resultTo + " (index " + index + ")");
230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
23040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sourceRecord = mHistory.get(index);
230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (requestCode >= 0 && !sourceRecord.finishing) {
230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord = sourceRecord;
230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && sourceRecord != null) {
231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Transfer the result target from the source activity to the new
231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // one being started, including any failures.
231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (requestCode >= 0) {
231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return START_FORWARD_AND_REQUEST_CONFLICT;
231950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultRecord = sourceRecord.resultTo;
232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultWho = sourceRecord.resultWho;
232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            requestCode = sourceRecord.requestCode;
232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sourceRecord.resultTo = null;
232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord.removeResultsLocked(
232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sourceRecord, resultWho, requestCode);
232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2330efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (err == START_SUCCESS && intent.getComponent() == null) {
233150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find a class that can handle the given Intent.
233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // That's the end of that!
233350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            err = START_INTENT_NOT_RESOLVED;
233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (err == START_SUCCESS && aInfo == null) {
233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find the specific class specified in the Intent.
233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Also the end of the line.
233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            err = START_CLASS_NOT_FOUND;
234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (err != START_SUCCESS) {
234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
234890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return err;
235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int perm = mService.checkComponentPermission(aInfo.permission, callingPid,
23536c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (perm != PackageManager.PERMISSION_GRANTED) {
235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
236090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
23616c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            String msg;
23626c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            if (!aInfo.exported) {
23636c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
23646c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
23656c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
23666c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " not exported from uid " + aInfo.applicationInfo.uid;
23676c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            } else {
23686c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
23696c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
23706c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
23716c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " requires " + aInfo.permission;
23726c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            }
237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, msg);
237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw new SecurityException(msg);
237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mController != null) {
237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean abort = false;
238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The Intent we give to the watcher has the extra data
238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // stripped off, since it can contain private information.
238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Intent watchIntent = intent.cloneFilter();
238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    abort = !mService.mController.activityStarting(watchIntent,
238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo.applicationInfo.packageName);
238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (abort) {
239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (resultRecord != null) {
239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sendActivityResultLocked(-1,
239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resultRecord, resultWho, requestCode,
239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Activity.RESULT_CANCELED, null);
239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We pretend to the caller that it was really started, but
239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // they will just get a cancel result.
239890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return START_SUCCESS;
240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2403742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,
240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                intent, resolvedType, aInfo, mService.mConfiguration,
240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord, resultWho, requestCode, componentSpecified);
2407621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (outActivity != null) {
2408621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            outActivity[0] = r;
2409621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mResumedActivity == null
241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || mResumedActivity.info.applicationInfo.uid != callingUid) {
241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    PendingActivityLaunch pal = new PendingActivityLaunch();
241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.r = r;
241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.sourceRecord = sourceRecord;
241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.grantedUriPermissions = grantedUriPermissions;
241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.grantedMode = grantedMode;
242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.onlyIfNeeded = onlyIfNeeded;
242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mPendingActivityLaunches.add(pal);
242290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return START_SWITCHES_CANCELED;
242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mDidAppSwitch) {
242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second allowed switch since we stopped switches,
242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // so now just generally allow switches.  Use case: user presses
243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // home (switches disabled, switch to home, mDidAppSwitch now true);
243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // user taps a home icon (coming from home so allowed, we hit here
243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and now allow anyone to switch again).
243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mAppSwitchesAllowedTime = 0;
243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mDidAppSwitch = true;
243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.doPendingActivityLaunchesLocked(false);
243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
244190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord,
244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                grantedUriPermissions, grantedMode, onlyIfNeeded, true);
2443621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
244490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // Someone asked to have the keyguard dismissed on the next
244590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // activity start, but we are not actually doing an activity
244690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // switch...  just dismiss the keyguard now, because we
244790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // probably want to see whatever is behind it.
244890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
244990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
245090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
245190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        return err;
245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2454621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
2455621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((launchFlags &
2456621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2457621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2458621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // Caller wants to appear on home activity, so before starting
2459621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // their own activity we will bring home to the front.
2460621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontLocked();
2461621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2462621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2463621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r,
246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord sourceRecord, Uri[] grantedUriPermissions,
246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int grantedMode, boolean onlyIfNeeded, boolean doResume) {
246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final Intent intent = r.intent;
246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int callingUid = r.launchedFromUid;
2469742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = r.userId;
2470742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We'll invoke onUserLeaving before onPause only if the launching
247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity did not explicitly state that this is an automated launch.
247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_USER_LEAVING) Slog.v(TAG,
247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "startActivity() => mUserLeaving=" + mUserLeaving);
247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the caller has asked not to resume at this point, we make note
248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of this in the record so that we can skip it when trying to find
248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the top running activity.
248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!doResume) {
248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.delayedResume = true;
248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)
248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                != 0 ? r : null;
248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the onlyIfNeeded flag is set, then we can do this if the activity
249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // being launched is the same as the one making the call...  or, as
249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a special case, if we do not know the caller then we count the
249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current top activity as the caller.
249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (onlyIfNeeded) {
249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord checkedCaller = sourceRecord;
249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (checkedCaller == null) {
249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                checkedCaller = topRunningNonDelayedActivityLocked(notTop);
249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!checkedCaller.realActivity.equals(r.realActivity)) {
249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Caller is not the same as launcher, so always needed.
250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                onlyIfNeeded = false;
250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sourceRecord == null) {
250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not being started from another...  in this
250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // case we -always- start a new task.
250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + intent);
251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The original activity who is starting us is running as a single
251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // instance...  this new activity it is starting must go on its
251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // own task.
251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity being started is a single instance...  it always
252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // gets launched into its own task.
252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // For whatever reason this activity is being launched into a new
252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // task...  yet the caller has requested a result back.  Well, that
252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // is pretty messed up, so instead immediately send back a cancel
252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and let the new task continue launched as normal without a
252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // dependency on its originator.
253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sendActivityResultLocked(-1,
253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.resultTo, r.resultWho, r.requestCode,
253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Activity.RESULT_CANCELED, null);
253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean addingToTask = false;
2538621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord reuseTask = null;
253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If bring to front is requested, and no result is requested, and
254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we can find a task that was started with this same
254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // component, then instead of launching bring that one to the front.
254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo == null) {
254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // See if there is a task to bring to the front.  If this is
254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // a SINGLE_INSTANCE activity, there can be one and only one
254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of it in the history, and it is always in its own
255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // unique task, so we do a special search.
255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? findTaskLocked(intent, r.info)
255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        : findActivityLocked(intent, r.info);
255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTop != null) {
255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (taskTop.task.intent == null) {
255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // This task was started because of movement of
255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the activity based on affinity...  now that we
255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // are actually launching it, we can assign the
255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // base intent.
256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(intent, r.info);
256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the target task is not in the front, then we need
256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to bring it to the front...  except...  well, with
256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to have the same behavior as if a new instance was
256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // being started, which means not bringing it to the front
256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // if the caller is not itself in the front.
256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop);
256966a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru                    if (curTop != null && curTop.task != taskTop.task) {
257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        boolean callerAtFront = sourceRecord == null
257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                || curTop.task == sourceRecord.task;
257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (callerAtFront) {
257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // We really do want to push this one into the
257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // user's face, right now.
2576621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            moveHomeToFrontFromLaunchLocked(launchFlags);
257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            moveTaskToFrontLocked(taskTop.task, r);
257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller has requested that the target task be
258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // reset, then do so.
258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop = resetTaskIfNeededLocked(taskTop, r);
258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (onlyIfNeeded) {
258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We don't need to start a new activity, and
258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the client said not to do anything if that
258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is the case, so this is it!  And for paranoia, make
258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resumeTopActivityLocked(null);
259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return START_RETURN_INTENT_TO_CALLER;
259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2595621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if ((launchFlags &
2596621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
2597621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
2598621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // The caller has requested to completely replace any
25997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // existing task with its new activity.  Well that should
2600621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // not be too hard...
2601621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask = taskTop.task;
2602621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        performClearTaskLocked(taskTop.task.taskId);
2603621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask.setIntent(r.intent, r.info);
2604621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this situation we want to remove all activities
260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from the task up to the one being started.  In most
260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cases this means we are resetting the task to its
261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // initial state.
261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord top = performClearTaskLocked(
2612621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                taskTop.task.taskId, r, launchFlags);
261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (top != null) {
261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (top.frontOfTask) {
261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // Activity aliases may mean we use different
261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intents for the top activity, so make sure
261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the task now has the identity of the new
261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intent.
261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                top.task.setIntent(r.intent, r.info);
262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
262239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // A special case: we need to
262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // start the activity because it is not currently
262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // running, and the caller has asked to clear the
262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // current task to have this activity at the top.
262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Now pretend like this activity is being started
263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // by the top of its task, so it is put in the
263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // right place.
263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (r.realActivity.equals(taskTop.task.realActivity)) {
263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case the top activity on the task is the
263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // same as the one being launched, so we take that
263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // as a request to bring the task to the foreground.
263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the top activity in the task is the root
263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, deliver this new intent to it if it
264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // desires.
264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && taskTop.realActivity.equals(r.realActivity)) {
264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (taskTop.frontOfTask) {
264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                taskTop.task.setIntent(r.intent, r.info);
264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
264739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            taskTop.deliverNewIntentLocked(callingUid, r.intent);
264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (!r.intent.filterEquals(taskTop.task.intent)) {
264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case we are launching the root activity
265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // of the task, but with a different intent.  We
265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // should start a new instance on top.
265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case an activity is being launched in to an
265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // existing task, without resetting that task.  This
265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is typically the situation of launching an activity
265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from a notification or shortcut.  We want to place
266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the new activity on top of the current task.
266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        addingToTask = true;
266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sourceRecord = taskTop;
266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!taskTop.task.rootWasReset) {
266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case we are launching in to an existing task
266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // that has not yet been started from its front door.
266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // The current task has been brought to the front.
266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Ideally, we'd probably like to place this new task
266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // at the bottom of its stack, but that's a little hard
266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to do with the current organization of the code so
267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // for now we'll just drop it.
267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(r.intent, r.info);
267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2673621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (!addingToTask && reuseTask == null) {
267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We didn't do anything...  but it was needed (a.k.a., client
267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // don't use that intent!)  And for paranoia, make
267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resumeTopActivityLocked(null);
267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return START_TASK_TO_FRONT;
268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //String uri = r.intent.toURI();
268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Intent intent2 = new Intent(uri);
268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "Given intent: " + r.intent);
268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "URI is: " + uri);
269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "To intent: " + intent2);
269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.packageName != null) {
269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity being launched is the same as the one currently
269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // at the top, then we need to check if it should only be launched
269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // once.
269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (top != null && r.resultTo == null) {
2698742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (top.app != null && top.app.thread != null) {
270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // For paranoia, make sure we have correctly
270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // resumed the top activity.
270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (doResume) {
270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                resumeTopActivityLocked(null);
270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (onlyIfNeeded) {
271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // We don't need to start a new activity, and
271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the client said not to do anything if that
271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // is the case, so this is it!
271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                return START_RETURN_INTENT_TO_CALLER;
271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
271539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            return START_DELIVERED_TO_TOP;
271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo != null) {
272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.resultTo, r.resultWho, r.requestCode,
272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return START_CLASS_NOT_FOUND;
272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean newTask = false;
27327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        boolean keepCurTransition = false;
273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Should this be considered a new task?
273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo == null && !addingToTask
273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2737621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (reuseTask == null) {
2738621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // todo: should do better management of integers.
2739621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mService.mCurTask++;
2740621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (mService.mCurTask <= 0) {
2741621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    mService.mCurTask = 1;
2742621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
2743f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true);
2744621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
2745621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        + " in new task " + r.task);
2746621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else {
2747f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(reuseTask, reuseTask, true);
274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newTask = true;
2750621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontFromLaunchLocked(launchFlags);
275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord != null) {
275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!addingToTask &&
275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are adding the activity to an existing
275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, but the caller has asked to clear that task if the
275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity is already running.
275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord top = performClearTaskLocked(
2759621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        sourceRecord.task.taskId, r, launchFlags);
27607da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                keepCurTransition = true;
276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (top != null) {
276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
276339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // For paranoia, make sure we have correctly
276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // resumed the top activity.
276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return START_DELIVERED_TO_TOP;
277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (!addingToTask &&
277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are launching an activity in our own task
277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // that may already be running somewhere in the history, and
277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we want to shuffle it to the front of the stack if so.
277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (where >= 0) {
277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord top = moveActivityToFrontLocked(where);
277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
278039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return START_DELIVERED_TO_TOP;
278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // An existing activity is starting this new activity, so we want
278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to keep the new one in the same task as the one that is starting
278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it.
2790f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in existing task " + r.task);
279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This not being started from an existing activity, and not part
279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // of a new task...  just put it in the top task, though these days
279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this case should never happen.
279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int N = mHistory.size();
279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord prev =
28000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                N > 0 ? mHistory.get(N-1) : null;
2801f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(prev != null
2802621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    ? prev.task
2803f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                    : new TaskRecord(mService.mCurTask, r.info, intent), null, true);
280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in new guessed " + r.task);
280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
280739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
280839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        if (grantedUriPermissions != null && callingUid > 0) {
280939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            for (int i=0; i<grantedUriPermissions.length; i++) {
281039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                mService.grantUriPermissionLocked(callingUid, r.packageName,
28117e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                        grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked());
281239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn            }
281339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        }
281439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
281539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
28167e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                intent, r.getUriPermissionsLocked());
281739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (newTask) {
281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId);
282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
28227da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        startActivityLocked(r, newTask, doResume, keepCurTransition);
282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return START_SUCCESS;
282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
282662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    ActivityInfo resolveActivity(Intent intent, String resolvedType, boolean debug,
282762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile, ParcelFileDescriptor profileFd, boolean autoStopProfiler) {
282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Collect information about the target of the Intent.
282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityInfo aInfo;
283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ResolveInfo rInfo =
283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                AppGlobals.getPackageManager().resolveIntent(
283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent, resolvedType,
283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        PackageManager.MATCH_DEFAULT_ONLY
283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        | ActivityManagerService.STOCK_PM_FLAGS);
283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = rInfo != null ? rInfo.activityInfo : null;
283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = null;
283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (aInfo != null) {
284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Store the found target back into the intent, because now that
284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we have it we never want to do this again.  For example, if the
284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // user navigates back to this point in the history, we should
284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // always restart the exact same activity.
284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            intent.setComponent(new ComponentName(
284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    aInfo.applicationInfo.packageName, aInfo.name));
284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Don't debug things in the system process
285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (debug) {
285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setDebugApp(aInfo.processName, true, false);
285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
285562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
285662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFile != null) {
285762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
285862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
285962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                            profileFile, profileFd, autoStopProfiler);
286062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
286162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2863621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return aInfo;
2864621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2865621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2866621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivityMayWait(IApplicationThread caller, int callingUid,
2867621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Intent intent, String resolvedType, Uri[] grantedUriPermissions,
2868621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            int grantedMode, IBinder resultTo,
2869621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            String resultWho, int requestCode, boolean onlyIfNeeded,
287062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean debug, String profileFile, ParcelFileDescriptor profileFd,
2871742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            boolean autoStopProfiler,
2872742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            WaitResult outResult, Configuration config, int userId) {
2873621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Refuse possible leaked file descriptors
2874621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intent != null && intent.hasFileDescriptors()) {
2875621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("File descriptors passed in Intent");
2876621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2877621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        boolean componentSpecified = intent.getComponent() != null;
2878621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Don't modify the client's object!
2880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        intent = new Intent(intent);
2881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Collect information about the target of the Intent.
288362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityInfo aInfo = resolveActivity(intent, resolvedType, debug,
288462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                profileFile, profileFd, autoStopProfiler);
2885742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        aInfo = mService.getActivityInfoForUser(aInfo, userId);
288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid;
2889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (callingUid >= 0) {
2890621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                callingPid = -1;
2891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else if (caller == null) {
289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = Binder.getCallingPid();
289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingUid = Binder.getCallingUid();
289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = callingUid = -1;
289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mConfigWillChange = config != null
289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && mService.mConfiguration.diff(config) != 0;
290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_CONFIGURATION) Slog.v(TAG,
290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Starting activity when config will change = " + mConfigWillChange);
290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final long origId = Binder.clearCallingIdentity();
290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack && aInfo != null &&
290654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Check to see if we already
290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // have another, different heavy-weight process running.
290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null &&
291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingPid = callingPid;
291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingUid = callingUid;
291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (caller != null) {
291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (callerApp != null) {
291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingPid = callerApp.pid;
291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingUid = callerApp.info.uid;
292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } else {
292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Slog.w(TAG, "Unable to find app for caller " + caller
292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + " (pid=" + realCallingPid + ") when starting: "
292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + intent.toString());
292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                return START_PERMISSION_DENIED;
292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        IIntentSender target = mService.getIntentSenderLocked(
292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                IActivityManager.INTENT_SENDER_ACTIVITY, "android",
2930621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                realCallingUid, null, null, 0, new Intent[] { intent },
2931621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                | PendingIntent.FLAG_ONE_SHOT);
293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Intent newIntent = new Intent();
293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (requestCode >= 0) {
293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Caller is requesting a result.
293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                new IntentSender(target));
294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.packageName);
294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.task.taskId);
294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                aInfo.packageName);
295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setFlags(intent.getFlags());
295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setClassName("android",
295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                HeavyWeightSwitcherActivity.class.getName());
295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent = newIntent;
295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resolvedType = null;
295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        caller = null;
295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingUid = Binder.getCallingUid();
295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingPid = Binder.getCallingPid();
295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        componentSpecified = true;
295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ResolveInfo rInfo =
296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                AppGlobals.getPackageManager().resolveIntent(
296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        intent, null,
296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        PackageManager.MATCH_DEFAULT_ONLY
296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        | ActivityManagerService.STOCK_PM_FLAGS);
296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = rInfo != null ? rInfo.activityInfo : null;
2966742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (RemoteException e) {
296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = null;
296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType,
297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    grantedUriPermissions, grantedMode, aInfo,
297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultTo, resultWho, requestCode, callingPid, callingUid,
2977621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    onlyIfNeeded, componentSpecified, null);
297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mConfigWillChange && mMainStack) {
298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller also wants to switch to a new configuration,
298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // do so now.  This allows a clean switch, as we are waiting
298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for the current activity to pause (so we will not destroy
298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it), and have not yet started the next activity.
298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "updateConfiguration()");
298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mConfigWillChange = false;
298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG,
298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Updating to new configuration after starting activity.");
2989813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                mService.updateConfigurationLocked(config, null, false, false);
299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Binder.restoreCallingIdentity(origId);
299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (outResult != null) {
299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                outResult.result = res;
299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (res == IActivityManager.START_SUCCESS) {
299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mWaitingActivityLaunched.add(outResult);
299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    do {
299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
3000ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                            mService.wait();
300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (InterruptedException e) {
300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } while (!outResult.timeout && outResult.who == null);
300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (res == IActivityManager.START_TASK_TO_FRONT) {
300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord r = this.topRunningActivityLocked(null);
300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.nowVisible) {
300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.timeout = false;
300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.totalTime = 0;
301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = 0;
301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = SystemClock.uptimeMillis();
301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mWaitingActivityVisible.add(outResult);
301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        do {
301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            try {
3016ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                                mService.wait();
301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } catch (InterruptedException e) {
301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } while (!outResult.timeout && outResult.who == null);
302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return res;
302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3028621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivities(IApplicationThread caller, int callingUid,
3029742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Intent[] intents,
3030742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            String[] resolvedTypes, IBinder resultTo, int userId) {
3031621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents == null) {
3032621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("intents is null");
3033621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3034621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (resolvedTypes == null) {
3035621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("resolvedTypes is null");
3036621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3037621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents.length != resolvedTypes.length) {
3038621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("intents are length different than resolvedTypes");
3039621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3040621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3041621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        ActivityRecord[] outActivity = new ActivityRecord[1];
3042621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3043621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int callingPid;
3044621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (callingUid >= 0) {
3045621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = -1;
3046621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else if (caller == null) {
3047621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = Binder.getCallingPid();
3048621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingUid = Binder.getCallingUid();
3049621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else {
3050621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = callingUid = -1;
3051621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3052621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        final long origId = Binder.clearCallingIdentity();
3053621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
3054621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mService) {
3055621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3056621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<intents.length; i++) {
3057621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    Intent intent = intents[i];
3058621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent == null) {
3059621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
3060621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3061621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3062621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Refuse possible leaked file descriptors
3063621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent != null && intent.hasFileDescriptors()) {
3064621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException("File descriptors passed in Intent");
3065621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3067621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    boolean componentSpecified = intent.getComponent() != null;
3068621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3069621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Don't modify the client's object!
3070621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    intent = new Intent(intent);
3071621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3072621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Collect information about the target of the Intent.
307362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], false,
307462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                            null, null, false);
3075742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // TODO: New, check if this is correct
3076742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
3077621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3078621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags
3079621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
3080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException(
3081621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                "FLAG_CANT_SAVE_STATE not supported here");
3082621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3083621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3084621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
3085621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            null, 0, aInfo, resultTo, null, -1, callingPid, callingUid,
3086621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            false, componentSpecified, outActivity);
3087621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (res < 0) {
3088621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        return res;
3089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3091be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
3092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
3093621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3094621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } finally {
3095621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Binder.restoreCallingIdentity(origId);
3096621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3097621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3098621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return IActivityManager.START_SUCCESS;
3099621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3100621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long thisTime, long totalTime) {
310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityLaunched.get(i);
310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = timeout;
310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = thisTime;
311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = totalTime;
311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3114621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityVisibleLocked(ActivityRecord r) {
311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityVisible.get(i);
311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = false;
311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = w.totalTime;
312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
312690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
312790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mDismissKeyguardOnNextActivity) {
312890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
312990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
313090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void sendActivityResultLocked(int callingUid, ActivityRecord r,
313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode, int resultCode, Intent data) {
313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (callingUid > 0) {
313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
31387e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                    data, r.getUriPermissionsLocked());
313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " : who=" + resultWho + " req=" + requestCode
314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " res=" + resultCode + " data=" + data);
314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r && r.app != null && r.app.thread != null) {
314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.add(new ResultInfo(resultWho, requestCode,
314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resultCode, data));
3149be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleSendResult(r.appToken, list);
315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown sending result to " + r, e);
315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void stopActivityLocked(ActivityRecord r) {
316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
3164be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "no-history");
316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.app != null && r.app.thread != null) {
316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mFocusedActivity == r) {
317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(topRunningActivityLocked(null));
317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3173621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            r.resumeKeyDispatchingLocked();
317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = false;
3176ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3177ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (stop requested)");
317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPING;
317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping visible=" + r.visible + " for " + r);
318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!r.visible) {
3182be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(r.appToken, false);
318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
3184be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
31854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (mService.isSleeping()) {
31864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
31874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Maybe just ignore exceptions here...  if the process
319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Just in case, assume it to be stopped.
319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = true;
3195ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);
319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPED;
319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.configDestroy) {
319828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                    destroyActivityLocked(r, true, false, "stop-except");
319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(
320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean remove) {
320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int N = mStoppingActivities.size();
320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (N <= 0) return null;
320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean nowVisible = mResumedActivity != null
321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mResumedActivity.nowVisible
321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && !mResumedActivity.waitingVisible;
321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=0; i<N; i++) {
321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord s = mStoppingActivities.get(i);
321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + nowVisible + " waitingVisible=" + s.waitingVisible
321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " finishing=" + s.finishing);
321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (s.waitingVisible && nowVisible) {
322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.remove(s);
322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                s.waitingVisible = false;
322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (s.finishing) {
322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is finishing, it is sitting on top of
322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // everyone else but we now know it is no longer needed...
322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so get rid of it.  Otherwise, we need to go through the
322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // normal flow and hide it once we determine that it is
322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // hidden by the activities in front of it.
322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3229be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(s.appToken, false);
323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
32324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if ((!s.waitingVisible || mService.isSleeping()) && remove) {
323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (stops == null) {
323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stops = new ArrayList<ActivityRecord>();
323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                stops.add(s);
323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.remove(i);
323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                N--;
324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return stops;
324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
324780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    final void scheduleIdleLocked() {
324880a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        Message msg = Message.obtain();
324980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        msg.what = IDLE_NOW_MSG;
325080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        mHandler.sendMessage(msg);
325180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    }
325280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn
325362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config) {
325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
325762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityRecord res = null;
325862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> finishes = null;
326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> thumbnails = null;
326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NS = 0;
326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NF = 0;
326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NT = 0;
326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        IApplicationThread sendThumbnail = null;
326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean booting = false;
326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean enableScreen = false;
326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3270be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3271be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3272be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Get the activity record.
3276be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
327862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                res = r;
327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (fromTimeout) {
328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is a hack to semi-deal with a race condition
328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in the client where it can be constructed with a
328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // newer configuration from when we asked it to launch.
328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We'll update with whatever configuration it now says
328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it used to launch.
328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (config != null) {
329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.configuration = config;
329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // No longer need to keep the device awake.
329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mResumedActivity == r && mLaunchingActivity.isHeld()) {
329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are now idle.  If someone is waiting for a thumbnail from
330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // us, we can now deliver.
330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.idle = true;
330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.scheduleAppGcsLocked();
330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sendThumbnail = r.app.thread;
330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.thumbnailNeeded = false;
330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is fullscreen, set up to hide those under it.
330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
331529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (!mService.mBooted) {
331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mBooted = true;
331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        enableScreen = true;
331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (fromTimeout) {
332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Atomically retrieve all of the other things to do.
332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            stops = processStoppingActivitiesLocked(true);
332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            NS = stops != null ? stops.size() : 0;
332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NF=mFinishingActivities.size()) > 0) {
332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mFinishingActivities.clear();
333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NT=mService.mCancelledThumbnails.size()) > 0) {
333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails);
333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mCancelledThumbnails.clear();
333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                booting = mService.mBooting;
333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mBooting = false;
334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i;
334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Send thumbnail if requested.
334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sendThumbnail != null) {
334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendThumbnail.requestThumbnail(token);
334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.sendPendingThumbnail(null, token, null, null, true);
335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Stop any activities that are scheduled to do so but have been
335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NS; i++) {
335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)stops.get(i);
335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stopActivityLocked(r);
336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Finish any activities that are scheduled to do so but have been
336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NF; i++) {
337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)finishes.get(i);
337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
337328695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "finish-idle");
337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Report back to any thumbnail receivers.
337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NT; i++) {
337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)thumbnails.get(i);
338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.sendPendingThumbnail(r, null, null, null, true);
338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (booting) {
338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.finishBooting();
338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.trimApplications();
338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //dump();
338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //mWindowManager.dump();
339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (enableScreen) {
339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.enableScreenAfterBoot();
339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
339462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
339562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        return res;
339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the activity is being finished, false if for
340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * some reason it is being left as-is.
340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Intent resultData, String reason) {
340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int index = indexOfTokenLocked(token);
340598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(
340698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Finishing activity @" + index + ": token=" + token
340798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                + ", result=" + resultCode + ", data=" + resultData);
340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
34110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord r = mHistory.get(index);
341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishActivityLocked(r, index, resultCode, resultData, reason);
341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if this activity has been removed from the history
341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * list, or false if it is still in the list and will be removed later.
342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int resultCode, Intent resultData, String reason) {
342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Duplicate finish request for " + r);
342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        r.makeFinishing();
342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName, reason);
343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < (mHistory.size()-1)) {
34330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord next = mHistory.get(index+1);
343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next.task == r.task) {
343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.frontOfTask) {
343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The next activity is now the front of the task.
343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.frontOfTask = true;
343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller asked that this activity (and all above it)
344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // be cleared when the task is reset, don't lose that information,
344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // but propagate it up to the next activity.
344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pauseKeyDispatchingLocked();
344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mFocusedActivity == r) {
345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.setFocusedActivityLocked(topRunningActivityLocked(null));
345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // send the result
345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultTo = r.resultTo;
345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " who=" + r.resultWho + " req=" + r.requestCode
346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " res=" + resultCode + " data=" + resultData);
346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.info.applicationInfo.uid > 0) {
346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
3463a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn                        resultTo.packageName, resultData,
3464a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn                        resultTo.getUriPermissionsLocked());
346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                     resultData);
346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this HistoryRecord is not holding on to other resources,
347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because clients have remote IPC references to this object so we
347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can't assume that will go away and want to avoid circular IPC refs.
347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.results = null;
347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pendingResults = null;
347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.newIntents = null;
347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.icicle = null;
347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean endTask = index <= 0
34890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    || (mHistory.get(index-1)).task != r.task;
349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare close transition: finishing " + r);
349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.prepareAppTransition(endTask
349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
34947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Tell window manager to prepare for this one to be removed.
3497be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(r.appToken, false);
349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3499621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity == null) {
350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, false);
350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.state != ActivityState.PAUSING) {
350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity is PAUSING, we will complete the finish once
350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it is done pausing; else we can just directly finish it here.
350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return finishCurrentActivityLocked(r, index,
351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    FINISH_AFTER_PAUSE) == null;
351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return false;
351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_IMMEDIATELY = 0;
351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_PAUSE = 1;
352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_VISIBLE = 2;
352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int mode) {
3524be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        final int index = indexOfActivityLocked(r);
352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return null;
352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return finishCurrentActivityLocked(r, index, mode);
353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index, int mode) {
353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First things first: if this activity is currently visible,
353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // and the resumed activity is not yet visible, then hold off on
353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // finishing until the resumed one becomes visible.
353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mStoppingActivities.contains(r)) {
353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.add(r);
354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mStoppingActivities.size() > 3) {
354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If we already have a few activities waiting to stop,
354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // then give up on things going idle and start clearing
354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // them out.
354480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                    scheduleIdleLocked();
35454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } else {
35464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    checkReadyForSleepLocked();
354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3549ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3550ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (finish requested)");
355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPING;
355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateOomAdjLocked();
355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return r;
355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure the record is cleaned out of other places.
355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(r);
35584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final ActivityState prevState = r.state;
3564ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r);
356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.state = ActivityState.FINISHING;
356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_IMMEDIATELY
356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.STOPPED
356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.INITIALIZING) {
357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this activity is already stopped, we can just finish
357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it right now.
357228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            return destroyActivityLocked(r, true, true, "finish-imm") ? null : r;
357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Need to go through the full pause cycle to get this
357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity into the stopped state and then finish it.
357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mFinishingActivities.add(r);
357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return r;
358150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
358250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
358350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform the common clean-up of an activity record.  This is called both
358550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * as part of destroyActivityLocked() (when destroying the client-side
358650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * representation) and cleaning things up as a result of its hosting
358750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * processing going away, in which case there is no remaining client-side
358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * state to destroy so only the cleanup here is needed.
358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
3590ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
3591ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            boolean setState) {
359250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
359350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mFocusedActivity == r) {
359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mFocusedActivity = null;
359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
359950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configDestroy = false;
360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frozenBeforeDestroy = false;
360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3602ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (setState) {
3603ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
3604ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            r.state = ActivityState.DESTROYED;
3605ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3606ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this record is no longer in the pending finishes list.
360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // This could happen, for example, if we are trimming activities
360950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // down to the max limit while they are still waiting to finish.
361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mFinishingActivities.remove(r);
361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remove any pending results.
361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing && r.pendingResults != null) {
361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                PendingIntentRecord rec = apr.get();
361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (rec != null) {
361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.cancelIntentSenderLocked(rec, false);
361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.pendingResults = null;
362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (cleanServices) {
362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
362750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
362850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Get rid of any pending idle timeouts.
363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
363750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
36380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
363950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
364050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
364150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void removeActivityFromHistoryLocked(ActivityRecord r) {
364250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.state != ActivityState.DESTROYED) {
364394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            r.makeFinishing();
364498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_ADD_REMOVE) {
364598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                RuntimeException here = new RuntimeException("here");
364698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                here.fillInStackTrace();
364798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                Slog.i(TAG, "Removing activity " + r + " from stack");
364898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            }
364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHistory.remove(r);
3650f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.takeFromHistory();
3651ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3652ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (removed from history)");
365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.DESTROYED;
3654be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.removeAppToken(r.appToken);
365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (VALIDATE_TOKENS) {
3656be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                validateAppTokensLocked();
365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.removeUriPermissionsLocked();
366050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
366150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
366250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
366450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clean-up of service connections in an activity record.
366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void cleanUpActivityServicesLocked(ActivityRecord r) {
366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Throw away any services that have been bound by this activity.
366850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.connections != null) {
366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Iterator<ConnectionRecord> it = r.connections.iterator();
367050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            while (it.hasNext()) {
367150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ConnectionRecord c = it.next();
367250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.removeConnectionLocked(c, null, r);
367350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.connections = null;
367550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
367828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
3679ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
3680ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            ActivityRecord r = mHistory.get(i);
3681ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (owner != null && r.app != owner) {
3682ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                continue;
3683ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3684ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // We can destroy this one if we have its icicle saved and
3685ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it is not in the process of pausing/stopping/finishing.
3686ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (r.app != null && r.haveState && !r.visible && r.stopped && !r.finishing
3687ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYING
3688ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYED) {
368928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, oomAdj, "trim");
3690ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3691ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3692ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
3693ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Destroy the current CLIENT SIDE instance of an activity.  This may be
369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * called both when actually finishing an activity, or when performing
369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * a configuration switch where we destroy the current client-side object
369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * but then create a new client-side object for this same HistoryRecord.
369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean destroyActivityLocked(ActivityRecord r,
370128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            boolean removeFromApp, boolean oomAdj, String reason) {
370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(
370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing activity: token=" + r
370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn              + ", app=" + (r.app != null ? r.app.processName : "(null)"));
370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
370728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                r.task.taskId, r.shortComponentName, reason);
370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean removedFromHistory = false;
371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3711ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        cleanUpActivityLocked(r, false, false);
371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadApp = r.app != null;
371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (hadApp) {
371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (removeFromApp) {
371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int idx = r.app.activities.indexOf(r);
371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (idx >= 0) {
371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.app.activities.remove(idx);
372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
372250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = null;
372350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendEmptyMessage(
372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.app.activities.size() == 0) {
372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // No longer have activities, so update location in
372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // LRU list.
3729ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    mService.updateLruProcessLocked(r.app, oomAdj, false);
373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
373250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean skipDestroy = false;
373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
3737be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.configChangeFlags);
373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We can just ignore exceptions here...  if the process
374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.w(TAG, "Exception thrown during finish", e);
374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removedFromHistory = true;
374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    skipDestroy = true;
374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.app = null;
375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.nowVisible = false;
375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3754ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // If the activity is finishing, we need to wait on removing it
3755ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // from the list to give it a chance to do its cleanup.  During
3756ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // that time it may make calls back with its token so we need to
3757ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // be able to find it on the list and so we don't want to remove
3758ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it from the list yet.  Otherwise, we can just immediately put
3759ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it in the destroyed state since we are not removing it from the
3760ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // list.
376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing && !skipDestroy) {
3762ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r
3763ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy requested)");
376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYING;
376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                msg.obj = r;
376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
3769ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3770ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy skipped)");
377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // remove this record from the history.
377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removeActivityFromHistoryLocked(r);
377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removedFromHistory = true;
377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
3779ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3780ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (no app)");
378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configChangeFlags = 0;
378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mLRUActivities.remove(r) && hadApp) {
378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return removedFromHistory;
379250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
379350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
379450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void activityDestroyed(IBinder token) {
379550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3796be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3797be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3798be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
3799be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            }
380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3801be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state == ActivityState.DESTROYING) {
380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final long origId = Binder.clearCallingIdentity();
380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Binder.restoreCallingIdentity(origId);
380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = list.size();
381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(
381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing app " + app + " from list " + list
381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            + " with " + i + " entries");
381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)list.get(i);
382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "Record #" + i + " " + r + ": app=" + r.app);
382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == app) {
382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing this entry!");
382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.remove(i);
382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void removeHistoryRecordsForAppLocked(ProcessRecord app) {
383050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mLRUActivities, app);
383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mStoppingActivities, app);
38324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app);
383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app);
383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mFinishingActivities, app);
383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3837621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
3838621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Move the current home activity's task (if one exists) to the front
3839621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * of the stack.
3840621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
3841621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontLocked() {
3842621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord homeTask = null;
3843621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
38440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord hr = mHistory.get(i);
3845621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (hr.isHomeActivity) {
3846621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                homeTask = hr.task;
384794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                break;
3848621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3849621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3850621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (homeTask != null) {
3851621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveTaskToFrontLocked(homeTask, null);
3852621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3853621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3854621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3855621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) {
385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int task = tr.taskId;
386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size()-1;
386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (top < 0 || (mHistory.get(top)).task.taskId == task) {
386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // nothing to do!
386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
386550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3867be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Applying the affinities may have removed entries from the history,
387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // so get the size again.
387150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        top = mHistory.size()-1;
387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = top;
387350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task up to the top
387550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
387650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos >= 0) {
38770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
387850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
387950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
388150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
388298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
388398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
388498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
388598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here);
388698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
388750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(top, r);
3889be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(0, r.appToken);
389050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                top--;
389150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos--;
389350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
389550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
389650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to front transition: task=" + tr);
389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
38997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
39007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
390150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
390550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
39067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
39077da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false);
390850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
390950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
391050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToTop(moved);
391150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
3912be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
391350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
391450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
391550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
391650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task);
391750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
391850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
391950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void finishTaskMoveLocked(int task) {
392050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        resumeTopActivityLocked(null);
392150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
392250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
392350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
392450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Worker method for rearranging history stack.  Implements the function of moving all
392550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities for a specific task (gathering them if disjoint) into a single group at the
392650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * bottom of the stack.
392750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
392850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * If a watcher is installed, the action is preflighted and the watcher has an opportunity
392950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to premeptively cancel the move.
393050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
393150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param task The taskId to collect and move to the bottom.
393250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the move completed, false if not.
393350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
393450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean moveTaskToBackLocked(int task, ActivityRecord reason) {
393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Slog.i(TAG, "moveTaskToBack: " + task);
393650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
393750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we have a watcher, preflight the move before committing to it.  First check
393850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // for *other* available tasks, but if none are available, then try again allowing the
393950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current task to be selected.
394050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack && mService.mController != null) {
394150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord next = topRunningActivityLocked(null, task);
394250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next == null) {
394350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next = topRunningActivityLocked(null, 0);
394450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
394550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next != null) {
394650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // ask watcher if this is allowed
394750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean moveOK = true;
394850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
394950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    moveOK = mService.mController.activityResuming(next.packageName);
395050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
395150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
395250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
395350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!moveOK) {
395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return false;
395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
395750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
395850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3959be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
396050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
396250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to back transition: task=" + task);
396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
396450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
396550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int bottom = 0;
396650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = 0;
396750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
396850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task down to the bottom
396950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
397050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos < N) {
39710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
397250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
397350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
397698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
397798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
397898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
397998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at "
398098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            + bottom, here);
398198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(bottom, r);
3984be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(r.appToken);
398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                bottom++;
398650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos++;
398850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
39927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
39937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
399450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
399650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
399850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
39997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
40007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToBottom(moved);
400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4004be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
401050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
40110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) {
40120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
40130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
40140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (resumed != null && resumed.thumbHolder == tr) {
40150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
40160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        } else {
40170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = tr.lastThumbnail;
40180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return info;
40200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
40210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex) {
40230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false);
40240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (info.root == null) {
40250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId);
40260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
40270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex < 0) {
40300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            // Just remove the entire task.
40310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            performClearTaskAtIndexLocked(taskId, info.rootIndex);
40320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return info.root;
40330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex >= info.subtasks.size()) {
40360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex);
40370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
40380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Remove all of this task's activies starting at the sub task.
40410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex);
40420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        performClearTaskAtIndexLocked(taskId, subtask.index);
40430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return subtask.activity;
40440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
40450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) {
40470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
40480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final TaskAccessInfo thumbs = new TaskAccessInfo();
40490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // How many different sub-thumbnails?
40500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final int NA = mHistory.size();
40510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        int j = 0;
40520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ThumbnailHolder holder = null;
40530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
40540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
40550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!ar.finishing && ar.task.taskId == taskId) {
40560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
40570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
40580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
40590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
40600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (j >= NA) {
40630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return thumbs;
40640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.root = mHistory.get(j);
40670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.rootIndex = j;
40680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
40700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.subtasks = subtasks;
40710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord lastActivity = null;
40720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
40730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
40740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
40750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.finishing) {
40760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
40770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
40780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.task.taskId != taskId) {
40790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
40800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
40810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            lastActivity = ar;
40820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.thumbHolder != holder && holder != null) {
40830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                thumbs.numSubThumbbails++;
40840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
40850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask();
40860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = holder.lastThumbnail;
40870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.activity = ar;
40880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.index = j-1;
40890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                subtasks.add(sub);
40900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
40910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (lastActivity != null && subtasks.size() > 0) {
40930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (resumed == lastActivity) {
40940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1);
40950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity);
40960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
40970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (thumbs.numSubThumbbails > 0) {
40990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            thumbs.retriever = new IThumbnailRetriever.Stub() {
41000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                public Bitmap getThumbnail(int index) {
41010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (index < 0 || index >= thumbs.subtasks.size()) {
41020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        return null;
41030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
41040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return thumbs.subtasks.get(index).thumbnail;
41050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
41060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            };
41070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return thumbs;
41090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
41100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
411150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void logStartActivity(int tag, ActivityRecord r,
411250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TaskRecord task) {
411350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(tag,
411450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r), task.taskId,
411550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.shortComponentName, r.intent.getAction(),
411650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getType(), r.intent.getDataString(),
411750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getFlags());
411850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
411950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
412050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
412150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure the given activity matches the current configuration.  Returns
412250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * false if the activity had to be destroyed.  Returns true if the
412350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * configuration is the same, or the activity will remain running as-is
412450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for whatever reason.  Ensures the HistoryRecord is updated with the
412550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * correct configuration and all other bookkeeping is handled.
412650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
412750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean ensureActivityConfigurationLocked(ActivityRecord r,
412850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int globalChanges) {
412950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mConfigWillChange) {
413050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
413150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Skipping config check (will change): " + r);
413250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
413450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
413550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
413650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Ensuring correct configuration: " + r);
413750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
413850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Short circuit: if the two configurations are the exact same
413950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // object (the common case), then there is nothing to do.
414050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration newConfig = mService.mConfiguration;
4141e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (r.configuration == newConfig && !r.forceNewConfig) {
414250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
414350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration unchanged in " + r);
414450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
414550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
414650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
414750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We don't worry about activities that are finishing.
414850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
414950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
415050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter in finishing " + r);
415150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
415250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
415350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
415450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
415550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Okay we now are going to make this activity have the new config.
415650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // But then we need to figure out how it needs to deal with that.
415750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration oldConfig = r.configuration;
415850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configuration = newConfig;
415958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
416058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Determine what has changed.  May be nothing, if this is a config
416158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // that has come back from the app after going idle.  In that case
416258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // we just want to leave the official config object now in the
416358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // activity and do nothing else.
416458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        final int changes = oldConfig.diff(newConfig);
416558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        if (changes == 0 && !r.forceNewConfig) {
416658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
416758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    "Configuration no differences in " + r);
416858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            return true;
416958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        }
417058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
417150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the activity isn't currently running, just leave the new
417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration and it will pick that up next time it starts.
417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app == null || r.app.thread == null) {
417450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
417550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter not running " + r);
417650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
4177e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
417950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
418050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
418158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Figure out how to handle the changes between the configurations.
41823c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
41833c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
41843c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + Integer.toHexString(changes) + ", handles=0x"
4185e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn                    + Integer.toHexString(r.info.getRealConfigChanged())
41863c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + ", newConfig=" + newConfig);
41873c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        }
4188e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn        if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) {
41893c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // Aha, the activity isn't handling the change, so DIE DIE DIE.
41903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.configChangeFlags |= changes;
41913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.startFreezingScreenLocked(r.app, globalChanges);
4192e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
41933c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            if (r.app == null || r.app.thread == null) {
41943c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
41953c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is destroying non-running " + r);
419628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "config");
41973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.PAUSING) {
41983c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // A little annoying: we are waiting for this activity to
41993c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // finish pausing.  Let's not do anything now, but just
42003c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // flag that it needs to be restarted when done pausing.
42013c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is skipping already pausing " + r);
42033c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configDestroy = true;
42043c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                return true;
42053c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.RESUMED) {
42063c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Try to optimize this case: the configuration is changing
42073c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // and we need to restart the top, resumed activity.
42083c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Instead of doing the normal handshaking, just say
42093c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // "restart!".
42103c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42113c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is restarting resumed " + r);
42123c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, true);
42133c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
42143c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else {
42153c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42163c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is restarting non-resumed " + r);
42173c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, false);
42183c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
42203c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn
42213c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // All done...  tell the caller we weren't able to keep this
42223c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // activity around.
42233c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            return false;
422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
422550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
422650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Default case: the activity can handle this new configuration, so
422750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // hand it over.  Note that we don't need to give it the new
422850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration, since we always send configuration changes to all
422950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // process when they happen so it can just use whatever configuration
423050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // it last got.
423150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app != null && r.app.thread != null) {
423250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
423350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
4234be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleActivityConfigurationChanged(r.appToken);
423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
423650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If process died, whatever.
423750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
423850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
423950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.stopFreezingScreenLocked(false);
424050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
424150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
424250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
424350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
424450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean relaunchActivityLocked(ActivityRecord r,
424550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int changes, boolean andResume) {
424650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<ResultInfo> results = null;
424750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<Intent> newIntents = null;
424850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
424950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            results = r.results;
425050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newIntents = r.newIntents;
425150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
425250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
425350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " with results=" + results + " newIntents=" + newIntents
425450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " andResume=" + andResume);
425550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
425650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
425750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName);
425850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
425950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(r.app, 0);
426050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
426150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
426250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r);
4263e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
4264be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents,
4265813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    changes, !andResume, new Configuration(mService.mConfiguration));
426650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: don't need to call pauseIfSleepingLocked() here, because
426750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the caller will only pass in 'andResume' if this activity is
426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // currently resumed, which implies we aren't sleeping.
426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
427250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
427450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.results = null;
427550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.newIntents = null;
427650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
427750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.reportResumedActivityLocked(r);
427850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
427950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
428050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
428150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
428250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
428390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
428490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguardOnNextActivityLocked() {
428590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        mDismissKeyguardOnNextActivity = true;
428690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
428750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn}
4288