ActivityStack.java revision 483f3b06ea84440a082e21b68ec2c2e54046f5a6
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;
257a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackbornimport android.app.ActivityOptions;
2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals;
2750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager;
280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever;
2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread;
3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent;
3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo;
3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult;
3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName;
3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context;
3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender;
3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent;
3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender;
3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo;
3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo;
4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager;
4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo;
4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration;
430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources;
440aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap;
4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri;
4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder;
47ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle;
4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler;
4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder;
5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message;
5162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor;
5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager;
5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException;
5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock;
55742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId;
5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog;
5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log;
5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog;
5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy;
6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException;
6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference;
6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList;
6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator;
6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List;
6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/**
6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities.
6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */
700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack {
7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final String TAG = ActivityManagerService.TAG;
72b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn    static final boolean localLOGV = ActivityManagerService.localLOGV;
7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH;
7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE;
7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY;
7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING;
7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION;
7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS;
7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION;
8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS;
8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
82ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    static final boolean DEBUG_STATES = false;
8398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
8498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn    static final boolean DEBUG_SAVED_STATE = false;
85ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS;
8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity telling us it
8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is idle.
9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int IDLE_TIMEOUT = 10*1000;
912a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
922a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    // Ticks during which we check progress while waiting for an app to launch.
932a29b3ad1350785aedea3442b38042885533576cDianne Hackborn    static final int LAUNCH_TICK = 500;
942a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on the last activity to pause.  This
9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is short because it directly impacts the responsiveness of starting the
9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // next activity.
9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int PAUSE_TIMEOUT = 500;
9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    // How long we can hold the sleep wake lock before giving up.
1014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    static final int SLEEP_TIMEOUT = 5*1000;
1024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we can hold the launch wake lock before giving up.
10450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int LAUNCH_TIMEOUT = 10*1000;
10550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
10650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long we wait until giving up on an activity telling us it has
10750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // finished destroying itself.
10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final int DESTROY_TIMEOUT = 10*1000;
10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // How long until we reset a task when the user returns to it.  Currently
111621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    // disabled.
112621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    static final long ACTIVITY_INACTIVE_RESET_TIME = 0;
11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1140dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // How long between activity launches that we consider safe to not warn
1150dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    // the user about an unexpected activity being launched on top.
1160dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    static final long START_WARN_TIME = 5*1000;
1170dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // Set to false to disable the preview that is shown while a new activity
11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    // is being started.
12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    static final boolean SHOW_APP_STARTING_PREVIEW = true;
12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    enum ActivityState {
12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        INITIALIZING,
12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        RESUMED,
12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSING,
12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PAUSED,
12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPING,
12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        STOPPED,
12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        FINISHING,
13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYING,
13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        DESTROYED
13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityManagerService mService;
13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean mMainStack;
13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Context mContext;
13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The back history of all previous (and possibly still
14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * running) activities.  It contains HistoryRecord objects.
14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();
144be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
145be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    /**
146be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     * Used for validating app tokens with window manager.
147be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn     */
148be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>();
149be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of running activities, sorted by recent usage.
15250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * The first entry in the list is the least recently used.
15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * It contains HistoryRecord objects.
15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
1550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>();
15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are waiting for a new activity
15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to become visible before completing whatever operation they are
16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * supposed to do.
16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mWaitingVisibleActivities
16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be stopped, but waiting
16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the next activity to settle down before doing so.  It contains
16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mStoppingActivities
17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
1744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * List of activities that are in the process of going to sleep.
1754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
1764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    final ArrayList<ActivityRecord> mGoingToSleepActivities
1774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            = new ArrayList<ActivityRecord>();
1784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
1794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Animations that for the current transition have requested not to
18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * be considered for the transition animation.
18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mNoAnimActivities
18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of activities that are ready to be finished, but waiting
18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for the previous activity to settle down before doing so.  It contains
18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * HistoryRecord objects.
19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> mFinishingActivities
19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<ActivityRecord>();
19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next launched activity.
19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched
19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * List of people waiting to find out about the next visible activity.
20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible
20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            = new ArrayList<IActivityManager.WaitResult>();
20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when the system is going to sleep, until we have
20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * successfully paused the current activity and released our wake lock.
20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * At that point the system is allowed to actually sleep.
21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mGoingToSleep;
21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * We don't want to allow the device to go to sleep while in the process
21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of launching an activity.  This is primarily to allow alarm intent
21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * receivers to launch an activity and get that to run before the device
21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * goes back to sleep.
21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final PowerManager.WakeLock mLaunchingActivity;
22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * When we are in the process of pausing an activity, before starting the
22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * next one, this variable holds the activity that is currently being paused.
22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
225621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    ActivityRecord mPausingActivity = null;
22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is the last activity that we put into the paused state.  This is
22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * used to determine if we need to do an activity transition while sleeping,
23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * when we normally hold the top activity paused.
23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mLastPausedActivity = null;
23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Current activity that is resumed, or null if there is none.
23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityRecord mResumedActivity = null;
23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
2400dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * This is the last activity that has been started.  It is only used to
2410dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * identify when multiple activities are started at once so that the user
2420dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     * can be warned they may not be in the activity they think they are.
2430dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn     */
2440dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    ActivityRecord mLastStartedActivity = null;
2450dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
2460dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn    /**
24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set when we know we are going to be calling updateConfiguration()
24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * soon, so want to skip intermediate config checks.
24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mConfigWillChange;
25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Set to indicate whether to issue an onUserLeaving callback when a
25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * newly launched activity is being brought in front of us.
25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    boolean mUserLeaving = false;
25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    long mInitialStartTime = 0;
25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    /**
2614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     * Set when we have taken too long waiting to go to sleep.
2624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn     */
2634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    boolean mSleepTimeout = false;
2644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
26590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    /**
26690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     * Dismiss the keyguard after the next activity is displayed?
26790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn     */
26890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    boolean mDismissKeyguardOnNextActivity = false;
26990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
2700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailWidth = -1;
2710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    int mThumbnailHeight = -1;
2720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
273742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private int mCurrentUser;
274742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG;
27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
28229ba7e66804e91cbd05fed74893061b4971ec52bDianne Hackborn    static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7;
28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final Handler mHandler = new Handler() {
28550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //public Handler() {
28650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //}
28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        public void handleMessage(Message msg) {
29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            switch (msg.what) {
2914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                case SLEEP_TIMEOUT_MSG: {
2928e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                    synchronized (mService) {
2938e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        if (mService.isSleeping()) {
2948e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
2958e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            mSleepTimeout = true;
2968e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                            checkReadyForSleepLocked();
2978e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn                        }
2984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    }
2994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } break;
30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case PAUSE_TIMEOUT_MSG: {
301be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
304be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity pause timeout for " + r);
3052a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3062a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.app != null) {
3072a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.pauseTime,
3082a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "pausing " + r);
3092a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3102a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3112a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
312be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityPaused(r != null ? r.appToken : null, true);
31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_TIMEOUT_MSG: {
31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        nmsg.obj = msg.obj;
31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
324be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
325be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity idle timeout for " + r);
326be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, true, null);
32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
3282a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                case LAUNCH_TICK_MSG: {
3292a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
3302a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    synchronized (mService) {
3312a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        if (r.continueLaunchTickingLocked()) {
3322a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                            mService.logAppTooSlow(r.app, r.launchTickTime,
3332a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                                    "launching " + r);
3342a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                        }
3352a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                    }
3362a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                } break;
33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case DESTROY_TIMEOUT_MSG: {
338be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't at this point know if the activity is fullscreen,
34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so we need to be conservative and assume it isn't.
341be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    Slog.w(TAG, "Activity destroy timeout for " + r);
342be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityDestroyed(r != null ? r.appToken : null);
34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case IDLE_NOW_MSG: {
345be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    ActivityRecord r = (ActivityRecord)msg.obj;
346be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    activityIdleInternal(r != null ? r.appToken : null, false, null);
34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case LAUNCH_TIMEOUT_MSG: {
34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mDidDexOpt) {
35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mDidDexOpt = false;
35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT);
35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mLaunchingActivity.isHeld()) {
35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mLaunchingActivity.release();
35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                case RESUME_TOP_ACTIVITY_MSG: {
36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    synchronized (mService) {
36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } break;
36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    };
37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService = service;
37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mContext = context;
37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mMainStack = mainStack;
37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        PowerManager pm =
37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            (PowerManager)context.getSystemService(Context.POWER_SERVICE);
37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLaunchingActivity.setReferenceCounted(false);
38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
383742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
3860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && r != notTop) {
38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) {
396742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
3990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing && !r.delayedResume && r != notTop) {
40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * This is a simplified version of topRunningActivityLocked that provides a number of
41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param token If non-null, any history records matching this token will be skipped.
41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns the HistoryRecord of the next activity on the stack.
41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) {
418742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // TODO: Don't look for any tasks from other users
41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size()-1;
42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
4210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: the taskId check depends on real taskId fields being non-zero
423be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) {
42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return r;
42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int indexOfTokenLocked(IBinder token) {
432be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(ActivityRecord.forToken(token));
433be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
434be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
435be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final int indexOfActivityLocked(ActivityRecord r) {
436be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        return mHistory.indexOf(r);
437ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
439ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final ActivityRecord isInStackLocked(IBinder token) {
440be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ActivityRecord r = ActivityRecord.forToken(token);
441be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        if (mHistory.contains(r)) {
442be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return r;
443ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
444ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        return null;
44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean updateLRUListLocked(ActivityRecord r) {
44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadit = mLRUActivities.remove(r);
44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLRUActivities.add(r);
45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return hadit;
45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the top activity in any existing task matching the given
45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Intent.  Returns null if no such task is found.
45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        TaskRecord cp = null;
46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
465742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
4680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
469742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (!r.finishing && r.task != cp && r.userId == userId
47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                cp = r.task;
47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + "/aff=" + r.task.affinity + " to new cls="
47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.task.affinity != null) {
47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.task.affinity.equals(info.taskAffinity)) {
47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        //Slog.i(TAG, "Found matching affinity!");
47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return r;
47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.intent != null
48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.intent.getComponent().equals(cls)) {
48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.task.affinityIntent != null
48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && r.task.affinityIntent.getComponent().equals(cls)) {
48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the first activity (starting from the top of the stack) that
50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is the same as the given activity.  Returns null if no such activity
50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * is found.
50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ComponentName cls = intent.getComponent();
50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (info.targetActivity != null) {
50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cls = new ComponentName(info.packageName, info.targetActivity);
50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
509742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = UserId.getUserId(info.applicationInfo.uid);
51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=(N-1); i>=0; i--) {
5130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
515742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.intent.getComponent().equals(cls) && r.userId == userId) {
51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "Found matching class!");
51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //dump();
51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return r;
52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
52736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    final void showAskCompatModeDialogLocked(ActivityRecord r) {
52836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        Message msg = Message.obtain();
52936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG;
53036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        msg.obj = r.task.askedCompatMode ? null : r;
53136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn        mService.mHandler.sendMessage(msg);
53236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn    }
53336cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn
534742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /*
535742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * Move the activities around in the stack to bring a user to the foreground.
536742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     * @return whether there are any activities for the specified user.
537742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani     */
538742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    final boolean switchUser(int userId) {
539742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        synchronized (mService) {
540742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mCurrentUser = userId;
541742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
542742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Only one activity? Nothing to do...
543742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (mHistory.size() < 2)
544742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return false;
545742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
546742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            boolean haveActivities = false;
547742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Check if the top activity is from the new user.
548742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ActivityRecord top = mHistory.get(mHistory.size() - 1);
549742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (top.userId == userId) return true;
550742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Otherwise, move the user's activities to the top.
551742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int N = mHistory.size();
552742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            int i = 0;
553742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            while (i < N) {
554742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                ActivityRecord r = mHistory.get(i);
555742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (r.userId == userId) {
556742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    ActivityRecord moveToTop = mHistory.remove(i);
557742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    mHistory.add(moveToTop);
558742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // No need to check the top one now
559742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    N--;
560742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    haveActivities = true;
561742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                } else {
562742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    i++;
563742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                }
564742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
565742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            // Transition from the old top to the new top
566742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            resumeTopActivityLocked(top);
567742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return haveActivities;
568742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
569742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
570742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean realStartActivityLocked(ActivityRecord r,
57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord app, boolean andResume, boolean checkConfig)
57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throws RemoteException {
57450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
57550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(app, 0);
576be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.setAppVisibility(r.appToken, true);
57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
5782a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        // schedule launch ticks to collect information about slow apps.
5792a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.startLaunchTickingLocked();
5802a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Have the window manager re-evaluate the orientation of
58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the screen based on the new activity order.  Note that
58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // as a result of this, it can call back into the activity
58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // manager with a new orientation.  We don't care about that,
58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // because the activity is not currently running so we are
58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // just restarting it anyway.
58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (checkConfig) {
58850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
58950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mConfiguration,
590be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
591813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn            mService.updateConfigurationLocked(config, r, false, false);
59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.app = app;
5950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        app.waitingToKill = null;
59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Launching: " + r);
59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int idx = app.activities.indexOf(r);
60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (idx < 0) {
60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.add(r);
60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateLruProcessLocked(app, true, true);
60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (app.thread == null) {
60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                throw new RemoteException();
60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<ResultInfo> results = null;
61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            List<Intent> newIntents = null;
61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                results = r.results;
61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                newIntents = r.newIntents;
61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " icicle=" + r.icicle
61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " with results=" + results + " newIntents=" + newIntents
61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " andResume=" + andResume);
61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (andResume) {
62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(r),
62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.task.taskId, r.shortComponentName);
62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.isHomeActivity) {
62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mHomeProcess = app;
62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
6284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.sleeping = false;
629e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
63036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn            showAskCompatModeDialogLocked(r);
6318ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
63262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            String profileFile = null;
63362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            ParcelFileDescriptor profileFd = null;
63462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            boolean profileAutoStop = false;
63562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
63662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (mService.mProfileProc == null || mService.mProfileProc == app) {
63762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.mProfileProc = app;
63862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFile = mService.mProfileFile;
63962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = mService.mProfileFd;
64062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop = mService.mAutoStopProfiler;
64162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
64262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
643f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn            app.hasShownUi = true;
644c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            app.pendingUiClean = true;
64562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFd != null) {
64662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                try {
64762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = profileFd.dup();
64862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                } catch (IOException e) {
64962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileFd = null;
65062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
65162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
652be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
653813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    System.identityHashCode(r), r.info,
654813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    new Configuration(mService.mConfiguration),
65558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    r.compat, r.icicle, results, newIntents, !andResume,
65662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.isNextTransitionForward(), profileFile, profileFd,
65762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    profileAutoStop);
65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
65954e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Note that the package
66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // manager will ensure that only activity can run in the main
66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // process of the .apk, which is the only thing that will be
66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // considered heavy-weight.
66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (app.processName.equals(app.info.packageName)) {
66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null
66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && mService.mHeavyWeightProcess != app) {
66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Log.w(TAG, "Starting new heavy weight process " + app
66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " when already running "
66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + mService.mHeavyWeightProcess);
67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = app;
67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Message msg = mService.mHandler.obtainMessage(
67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    msg.obj = r;
67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendMessage(msg);
67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.launchFailed) {
68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second time we failed -- finish activity
68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and give up.
68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.e(TAG, "Second failure launching "
68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + r.intent.getComponent().flattenToShortString()
68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + ", giving up", e);
68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.appDiedLocked(app, app.pid, app.thread);
687be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "2nd-crash");
68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return false;
69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This is the first time we failed -- restart process and
69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // retry.
69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            app.activities.remove(r);
69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw e;
69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.launchFailed = false;
69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (updateLRUListLocked(r)) {
70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r
70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                  + " being launched, but already in LRU list");
70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // As part of the process of launching, ActivityThread also performs
70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // a resume.
70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.RESUMED;
708ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r
709ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting new instance)");
71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = false;
71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = r;
71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.task.touchActiveTime();
71388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
71488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(r.task);
71588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            completeResumeLocked(r);
7174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
71898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle);
71998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.icicle = null;
72098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            r.haveState = false;
72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not starting in the resumed state... which
72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should look like we asked it to pause+stop (but remain visible),
72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and it has done so and reported back the current icicle and
72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // other state.
726ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
727ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (starting in stopped state)");
72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPED;
72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopped = true;
73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Launch the new version setup screen if needed.  We do this -after-
73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // launching the initial activity (that is, home), so that it can have
73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a chance to initialize itself while in the background, making the
73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // switch back to it faster and look better.
73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.startSetupActivityLocked();
73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startSpecificActivityLocked(ActivityRecord r,
74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean andResume, boolean checkConfig) {
74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Is this activity's application already running?
74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.info.applicationInfo.uid);
74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        if (r.launchTime == 0) {
7500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            r.launchTime = SystemClock.uptimeMillis();
75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mInitialStartTime == 0) {
7520dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mInitialStartTime = r.launchTime;
75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mInitialStartTime == 0) {
75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mInitialStartTime = SystemClock.uptimeMillis();
75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
75750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
75850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (app != null && app.thread != null) {
75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
7606c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                app.addPackage(r.info.packageName);
76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                realStartActivityLocked(r, app, andResume, checkConfig);
76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception when starting activity "
76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + r.intent.getComponent().flattenToShortString(), e);
76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If a dead object exception was thrown -- fall through to
76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // restart the application.
77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
773a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn                "activity", r.intent.getComponent(), false, false);
77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void stopIfSleepingLocked() {
7774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.isSleeping()) {
77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mGoingToSleep.isHeld()) {
77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mGoingToSleep.acquire();
78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mLaunchingActivity.isHeld()) {
78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
7854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
7864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG);
7874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT);
7884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
7894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
7904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
79150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
7924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void awakeFromSleepingLocked() {
7934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
7944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mSleepTimeout = false;
7954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
7964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
7974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
7984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        // Ensure activities are no longer sleeping.
7994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
8000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
8014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            r.setSleeping(false);
8024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.clear();
8044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void activitySleptLocked(ActivityRecord r) {
8074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
8084eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        checkReadyForSleepLocked();
8094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    }
8104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn    void checkReadyForSleepLocked() {
8124eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mService.isSleeping()) {
8134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Do not care.
8144eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            return;
8154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (!mSleepTimeout) {
8184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mResumedActivity != null) {
8194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still have something resumed; can't sleep until it is paused.
8204eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity);
82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, true);
8234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
825621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity != null) {
8264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still waiting for something to pause; can't sleep yet.
827621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity);
8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mStoppingActivities.size() > 0) {
8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to stop; can't sleep yet.
8334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mStoppingActivities.size() + " activities");
83580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                scheduleIdleLocked();
8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            ensureActivitiesVisibleLocked(null, 0);
8404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // Make sure any stopped but visible activities are now sleeping.
8424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            // This ensures that the activity's onStop() is called.
8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            for (int i=mHistory.size()-1; i>=0; i--) {
8440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord r = mHistory.get(i);
8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) {
8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            }
8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if (mGoingToSleepActivities.size() > 0) {
8514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                // Still need to tell some activities to sleep; can't sleep yet.
8524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
8534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        + mGoingToSleepActivities.size() + " activities");
8544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                return;
85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
8574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
8594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn
8604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mGoingToSleep.isHeld()) {
8614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mGoingToSleep.release();
8624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
8634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        if (mService.mShuttingDown) {
8644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            mService.notifyAll();
8654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        }
86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
868d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public final Bitmap screenshotActivities(ActivityRecord who) {
869ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        if (who.noDisplay) {
870ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn            return null;
871ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn        }
872ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn
8730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Resources res = mService.mContext.getResources();
8740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int w = mThumbnailWidth;
8750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int h = mThumbnailHeight;
8760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w < 0) {
8770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailWidth = w =
8780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
8790aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            mThumbnailHeight = h =
8800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
8810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
8820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
8830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (w > 0) {
884be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            return mService.mWindowManager.screenshotApplications(who.appToken, w, h);
8850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
8860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return null;
8870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
8880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
890621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
891621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            RuntimeException e = new RuntimeException();
892621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            Slog.e(TAG, "Trying to pause when pause is already pending for "
893621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                  + mPausingActivity, e);
894621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord prev = mResumedActivity;
89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev == null) {
89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            RuntimeException e = new RuntimeException();
89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
902ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev);
903ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mResumedActivity = null;
905621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        mPausingActivity = prev;
90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mLastPausedActivity = prev;
90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.state = ActivityState.PAUSING;
90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.task.touchActiveTime();
909f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        prev.updateThumbnail(screenshotActivities(prev), null);
91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.updateCpuStats();
91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
91350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.app.thread != null) {
91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(prev),
91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        prev.shortComponentName);
919be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
920be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        userLeaving, prev.configChangeFlags);
92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.updateUsageStats(prev, false);
92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Ignore exception, if process died other code will cleanup.
92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
927621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                mPausingActivity = null;
92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mLastPausedActivity = null;
92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
931621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLastPausedActivity = null;
93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not going to sleep, we want to ensure the device is
93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // awake until the next activity is started.
93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mService.mSleeping && !mService.mShuttingDown) {
93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mLaunchingActivity.acquire();
93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // To be safe, don't allow the wake lock to be held for too long.
94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG);
94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT);
94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
946621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
947621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager pause its key dispatching until the new
94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity has started.  If we're pausing the activity just because
95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen is being turned off and the UI is sleeping, don't interrupt
95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // key dispatch; the same activity will pick it up again on wakeup.
95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!uiSleeping) {
953621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev.pauseKeyDispatchingLocked();
95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Schedule a pause timeout in case the app doesn't respond.
95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We don't give it much time because this directly impacts the
96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // responsiveness seen by the user.
96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = prev;
9632a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            prev.pauseTime = SystemClock.uptimeMillis();
96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity failed to schedule the
96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // pause, so just treat it as being paused now.
96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
970621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(null);
97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
9740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    final void activityPaused(IBinder token, boolean timeout) {
97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(
9760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            TAG, "Activity paused: token=" + token + ", timeout=" + timeout);
97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = null;
97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(token);
98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
9830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                r = mHistory.get(index);
98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
985621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (mPausingActivity == r) {
986ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r
987ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                            + (timeout ? " (due to timeout)" : " (pause complete)"));
98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.state = ActivityState.PAUSED;
989621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    completePauseLocked();
99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            System.identityHashCode(r), r.shortComponentName,
993621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            mPausingActivity != null
994621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                                ? mPausingActivity.shortComponentName : "(none)");
99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1000ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail,
1001ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            CharSequence description) {
100298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle);
1003ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.icicle = icicle;
1004ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.haveState = true;
1005ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.updateThumbnail(thumbnail, description);
1006ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.stopped = true;
1007ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)");
1008ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        r.state = ActivityState.STOPPED;
1009ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (!r.finishing) {
1010ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (r.configDestroy) {
101128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "stop-config");
1012ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                resumeTopActivityLocked(null);
101350685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn            } else {
101450685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // Now that this process has stopped, we may want to consider
101550685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // it to be the previous app to try to keep around in case
101650685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                // the user wants to return to it.
101750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                ProcessRecord fgApp = null;
101850685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                if (mResumedActivity != null) {
101950685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    fgApp = mResumedActivity.app;
1020621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                } else if (mPausingActivity != null) {
1021621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    fgApp = mPausingActivity.app;
102250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
102350685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                if (r.app != null && fgApp != null && r.app != fgApp
102450685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                        && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
102550685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                        && r.app != mService.mHomeProcess) {
102650685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    mService.mPreviousProcess = r.app;
102750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                    mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
102850685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn                }
1029ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1030ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
1031ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
1032ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
1033621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn    private final void completePauseLocked() {
1034621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        ActivityRecord prev = mPausingActivity;
103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1037621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1038621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (prev.finishing) {
1039621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
1040621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
1041621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else if (prev.app != null) {
1042621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
1043621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.waitingVisible) {
1044621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    prev.waitingVisible = false;
1045621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mWaitingVisibleActivities.remove(prev);
1046621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
1047621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                            TAG, "Complete pause, no longer waiting: " + prev);
1048621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                }
1049621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (prev.configDestroy) {
1050621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // The previous is being paused because the configuration
1051621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // is changing, which means it is actually stopping...
1052621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // To juggle the fact that we are also starting a new
1053621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // instance right now, we need to first completely stop
1054621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    // the current instance before starting the new one.
1055621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
1056621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    destroyActivityLocked(prev, true, false, "pause-config");
105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
1058621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    mStoppingActivities.add(prev);
1059621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    if (mStoppingActivities.size() > 3) {
1060621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // If we already have a few activities waiting to stop,
1061621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // then give up on things going idle and start clearing
1062621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        // them out.
1063621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
1064621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        scheduleIdleLocked();
1065621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    } else {
1066621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                        checkReadyForSleepLocked();
1067621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                    }
106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1069621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            } else {
1070621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
1071621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn                prev = null;
107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
1073621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            mPausingActivity = null;
107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1076621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (!mService.isSleeping()) {
1077621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            resumeTopActivityLocked(prev);
1078621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        } else {
10794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            checkReadyForSleepLocked();
108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1081621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
1082621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (prev != null) {
1083621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            prev.resumeKeyDispatchingLocked();
1084621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev.app != null && prev.cpuTimeAtResume > 0
108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mService.mBatteryStatsService.isOnBattery()) {
108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long diff = 0;
108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid)
109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        - prev.cpuTimeAtResume;
109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (diff > 0) {
109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (bsi) {
109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    BatteryStatsImpl.Uid.Proc ps =
109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            prev.info.packageName);
109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (ps != null) {
110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ps.addForegroundTimeLocked(diff);
110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        prev.cpuTimeAtResume = 0; // reset it
110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Once we know that we have asked an application to put an activity in
111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the resumed state (either by launching it or explicitly telling it),
111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * this function updates the rest of our state to match that fact.
111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void completeResumeLocked(ActivityRecord next) {
111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.idle = false;
111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.results = null;
111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.newIntents = null;
111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // schedule an idle timeout in case the app doesn't do it for us.
111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        msg.obj = next;
112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (false) {
112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity was never told to pause, so just keep
112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // things going as-is.  To maintain our own state,
112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we need to emulate it coming back and saying it is
112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // idle.
112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg = mHandler.obtainMessage(IDLE_NOW_MSG);
112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            msg.obj = next;
113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHandler.sendMessage(msg);
113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.reportResumedActivityLocked(next);
113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1137f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        next.clearThumbnail();
113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.setFocusedActivityLocked(next);
114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
1141621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        next.resumeKeyDispatchingLocked();
114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ensureActivitiesVisibleLocked(null, 0);
114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.executeAppTransition();
114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mNoAnimActivities.clear();
114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Mark the point when the activity is resuming
114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // TODO: To be more accurate, the mark should be before the onCreate,
114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //       not after the onResume. But for subsequent starts, onResume is fine.
114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null) {
115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService.mProcessStatsThread) {
115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid);
115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process
115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure that all activities that need to be visible (that is, they
116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * currently can be seen by the user) actually are.
116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord top,
116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord starting, String onlyThisProcess, int configChanges) {
116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_VISBILITY) Slog.v(
116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "ensureActivitiesVisible behind " + top
116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " configChanges=0x" + Integer.toHexString(configChanges));
116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is not fullscreen, then we need to
116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure any activities under it are now visible.
117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int count = mHistory.size();
117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = count-1;
117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (mHistory.get(i) != top) {
117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r;
117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean behindFullscreen = false;
117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (; i>=0; i--) {
11780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make visible? " + r + " finishing=" + r.finishing
118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state);
118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean doThisProcess = onlyThisProcess == null
118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || onlyThisProcess.equals(r.processName);
118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // First: if this is not the current activity being started, make
119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // sure it matches the current configuration.
119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != starting && doThisProcess) {
119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivityConfigurationLocked(r, 0);
119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == null || r.app.thread == null) {
119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (onlyThisProcess == null
119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        || onlyThisProcess.equals(r.processName)) {
119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // This activity needs to be visible, but isn't even
119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // running...  get it started, but don't resume it
120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // at this point.
120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Start and freeze screen for " + r);
120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.startFreezingScreenLocked(r.app, configChanges);
120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!r.visible) {
120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Starting and making visible: " + r);
1209be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r != starting) {
121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        startSpecificActivityLocked(r, false, false);
121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (r.visible) {
121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is already visible, then there is nothing
121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // else to do here.
121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Skipping: already visible at " + r);
122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopFreezingScreenLocked(false);
122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (onlyThisProcess == null) {
122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This activity is not currently visible, but is running.
122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Tell it to become visible.
122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.visible = true;
122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state != ActivityState.RESUMED && r != starting) {
122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is paused, tell it
122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to now show its window.
123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Making visible and scheduling visibility: " + r);
123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    try {
1233be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppVisibility(r.appToken, true);
12344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                        r.sleeping = false;
1235905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                        r.app.pendingUiClean = true;
1236be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.app.thread.scheduleWindowVisibility(r.appToken, true);
123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.stopFreezingScreenLocked(false);
123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } catch (Exception e) {
123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Just skip on any failure; we'll make it
124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // visible when it next restarts.
124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Slog.w(TAG, "Exception thrown making visibile: "
124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + r.intent.getComponent(), e);
124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Aggregate current change flags.
124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            configChanges |= r.configChangeFlags;
124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.fullscreen) {
125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // At this point, nothing else needs to be shown
125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping: fullscreen at " + r);
125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                behindFullscreen = true;
125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now for any activities that aren't visible to the user, make
126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // sure they no longer are keeping the screen frozen.
126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i >= 0) {
12630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            r = mHistory.get(i);
126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_VISBILITY) Slog.v(
126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    TAG, "Make invisible? " + r + " finishing=" + r.finishing
126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " state=" + r.state
126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " behindFullscreen=" + behindFullscreen);
126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (behindFullscreen) {
127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.visible) {
127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Making invisible: " + r);
127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.visible = false;
127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
1275be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppVisibility(r.appToken, false);
127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if ((r.state == ActivityState.STOPPING
127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    || r.state == ActivityState.STOPPED)
127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    && r.app != null && r.app.thread != null) {
127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (DEBUG_VISBILITY) Slog.v(
128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        TAG, "Scheduling invisibility: " + r);
1281be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                r.app.thread.scheduleWindowVisibility(r.appToken, false);
128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (Exception e) {
128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Just skip on any failure; we'll make it
128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // visible when it next restarts.
128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Slog.w(TAG, "Exception thrown making hidden: "
128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + r.intent.getComponent(), e);
128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_VISBILITY) Slog.v(
129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Already invisible: " + r);
129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else if (r.fullscreen) {
129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_VISBILITY) Slog.v(
129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            TAG, "Now behindFullscreen: " + r);
129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    behindFullscreen = true;
129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Version of ensureActivitiesVisible that can easily be called anywhere.
130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void ensureActivitiesVisibleLocked(ActivityRecord starting,
130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int configChanges) {
130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = topRunningActivityLocked(null);
130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r != null) {
131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ensureActivitiesVisibleLocked(r, starting, null, configChanges);
131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Ensure that the top activity in the stack is resumed.
131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param prev The previously resumed activity, for when in the process
131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * of pausing; can be null to call from elsewhere.
131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if something is being resumed, or false if
132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * nothing happened.
132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean resumeTopActivityLocked(ActivityRecord prev) {
132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Find the first activity that is not finishing.
132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord next = topRunningActivityLocked(null);
132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remember how we'll process this pause/resume situation, and ensure
132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the state is reset however we wind up proceeding.
132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean userLeaving = mUserLeaving;
133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = false;
133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next == null) {
133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are no more activities!  Let's just start up the
133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Launcher...
133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
1336742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                return mService.startHomeActivityLocked(0);
133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        next.delayedResume = false;
134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the top activity is the resumed one, nothing to do.
134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == next && next.state == ActivityState.RESUMED) {
134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are sleeping, and there is no resumed activity, and the top
135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity is paused, well that is the state we want.
135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((mService.mSleeping || mService.mShuttingDown)
135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mLastPausedActivity == next && next.state == ActivityState.PAUSED) {
135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Make sure we have executed any pending transitions, since there
135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // should be nothing left to do at this point.
135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.executeAppTransition();
135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mNoAnimActivities.clear();
135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // The activity may be waiting for stop, but that is no longer
136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // appropriate for it.
136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(next);
13654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(next);
13664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        next.sleeping = false;
136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(next);
136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1371621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // If we are currently pausing an activity, then don't do anything
1372621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        // until that is done.
1373621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mPausingActivity != null) {
1374621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity);
1375621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            return false;
1376621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        }
1377621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
13780dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // Okay we are now going to start a switch, to 'next'.  We may first
13790dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // have to pause the current activity, but this is an important point
13800dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        // where we have decided to go to 'next' so keep track of that.
1381034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // XXX "App Redirected" dialog is getting too many false positives
1382034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        // at this point, so turn off for now.
1383034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn        if (false) {
1384034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn            if (mLastStartedActivity != null && !mLastStartedActivity.finishing) {
1385034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                long now = SystemClock.uptimeMillis();
1386034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final boolean inTime = mLastStartedActivity.startTime != 0
1387034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && (mLastStartedActivity.startTime + START_WARN_TIME) >= now;
1388034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int lastUid = mLastStartedActivity.info.applicationInfo.uid;
1389034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                final int nextUid = next.info.applicationInfo.uid;
1390034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                if (inTime && lastUid != nextUid
1391034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && lastUid != next.launchedFromUid
1392034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        && mService.checkPermission(
1393034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                android.Manifest.permission.STOP_APP_SWITCHES,
1394034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                                -1, next.launchedFromUid)
1395034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
1396034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mService.showLaunchWarningLocked(mLastStartedActivity, next);
1397034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                } else {
1398034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    next.startTime = now;
1399034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                    mLastStartedActivity = next;
1400034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                }
14010dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            } else {
1402034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn                next.startTime = SystemClock.uptimeMillis();
14030dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn                mLastStartedActivity = next;
14040dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            }
14050dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn        }
14060dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn
140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We need to start pausing the current activity so the top one
140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // can be resumed...
140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity != null) {
141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startPausingLocked(userLeaving, false);
141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null && prev != next) {
141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!prev.waitingVisible && next != null && !next.nowVisible) {
141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                prev.waitingVisible = true;
141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.add(prev);
141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(
142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Resuming top, waiting visible to hide: " + prev);
142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The next activity is already visible, so hide the previous
142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity's windows right now so we can show the new one ASAP.
142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We only do this if the previous is finishing, which should mean
142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it is on top of the one being resumed so hiding it quickly
142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is good.  Otherwise, we want to do the normal route of allowing
142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the resumed activity to be shown so we can decide if the
142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // previous should actually be hidden depending on whether the
142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // new one is found to be full-screen or not.
143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev.finishing) {
1431be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(prev.appToken, false);
143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + prev + ", waitingVisible="
143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + (prev != null ? prev.waitingVisible : null)
143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            + ", nowVisible=" + next.nowVisible);
143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + prev + ", waitingVisible="
143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + (prev != null ? prev.waitingVisible : null)
144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", nowVisible=" + next.nowVisible);
144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1445e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Launching this app's activity, make sure the app is no longer
1446e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // considered stopped.
1447e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        try {
1448e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            AppGlobals.getPackageManager().setPackageStoppedState(
1449483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    next.packageName, false, next.userId); /* TODO: Verify if correct userid */
1450e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } catch (RemoteException e1) {
1451a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn        } catch (IllegalArgumentException e) {
1452a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn            Slog.w(TAG, "Failed trying to unstop package "
1453a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn                    + next.packageName + ": " + e);
1454e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
1455e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are starting up the next activity, so tell the window manager
145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // that the previous one will be hidden soon.  This way it can know
145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to ignore it when computing the desired screen orientation.
14597a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        boolean noAnim = false;
146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (prev != null) {
146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (prev.finishing) {
146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare close transition: prev=" + prev);
146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(prev)) {
14657da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
14667da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
14707da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
1472be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1473be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_TRANSITION) Slog.v(TAG,
147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Prepare open transition: prev=" + prev);
147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mNoAnimActivities.contains(next)) {
14787a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    noAnim = true;
14797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    mService.mWindowManager.prepareAppTransition(
14807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            WindowManagerPolicy.TRANSIT_NONE, false);
148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.prepareAppTransition(prev.task == next.task
148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
14847da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (false) {
1488be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppWillBeHidden(prev.appToken);
1489be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mService.mWindowManager.setAppVisibility(prev.appToken, false);
149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (mHistory.size() > 1) {
149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: no previous");
149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mNoAnimActivities.contains(next)) {
14957a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                noAnim = true;
14967da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
14977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, false);
149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
14997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
15007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
15037a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        if (!noAnim) {
15047a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.applyOptionsLocked();
15057a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        } else {
15067a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            next.clearOptionsLocked();
15077a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        }
150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (next.app != null && next.app.thread != null) {
151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is now becoming visible.
1513be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(next.appToken, true);
151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15152a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            // schedule launch ticks to collect information about slow apps.
15162a29b3ad1350785aedea3442b38042885533576cDianne Hackborn            next.startLaunchTickingLocked();
15172a29b3ad1350785aedea3442b38042885533576cDianne Hackborn
151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord lastResumedActivity = mResumedActivity;
151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityState lastState = next.state;
152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateCpuStats();
152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1523ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)");
152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.state = ActivityState.RESUMED;
152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = next;
152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.task.touchActiveTime();
152788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            if (mMainStack) {
152888819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn                mService.addRecentTaskLocked(next.task);
152988819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn            }
153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateLruProcessLocked(next.app, true, true);
153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            updateLRUListLocked(next);
153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Have the window manager re-evaluate the orientation of
153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the screen based on the new activity order.
153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean updated = false;
153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                synchronized (mService) {
153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mConfiguration,
1540be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.mayFreezeScreenLocked(next.app) ? next.appToken : null);
154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (config != null) {
154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.frozenBeforeDestroy = true;
154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
1544813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    updated = mService.updateConfigurationLocked(config, next, false, false);
154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!updated) {
154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // The configuration update wasn't able to keep the existing
154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity, and instead started a new one.
155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We should be all done, but let's just make sure our activity
155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // is still at the top and schedule another run if something
155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // weird happened.
155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord nextNext = topRunningActivityLocked(null);
155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG,
155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Activity config changed during resume: " + next
155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        + ", new next: " + nextNext);
155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (nextNext != next) {
155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Do over!
155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(next);
156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.executeAppTransition();
156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.clear();
156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Deliver all pending results.
157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList a = next.results;
157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (a != null) {
157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final int N = a.size();
157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!next.finishing && N > 0) {
157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_RESULTS) Slog.v(
157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                TAG, "Delivering results to " + next
157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + ": " + a);
1579be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        next.app.thread.scheduleSendResult(next.appToken, a);
158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (next.newIntents != null) {
1584be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    next.app.thread.scheduleNewIntent(next.newIntents, next.appToken);
158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        System.identityHashCode(next),
158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        next.task.taskId, next.shortComponentName);
159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                next.sleeping = false;
159236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn                showAskCompatModeDialogLocked(next);
1593905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn                next.app.pendingUiClean = true;
1594be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                next.app.thread.scheduleResumeActivity(next.appToken,
159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.isNextTransitionForward());
159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
15974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                checkReadyForSleepLocked();
159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Whoops, need to restart this activity!
1601ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to "
1602ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + lastState + ": " + next);
160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.state = lastState;
160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mResumedActivity = lastResumedActivity;
160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.i(TAG, "Restarting because process died: " + next);
160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!next.hasBeenLaunched) {
160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.hasBeenLaunched = true;
160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (SHOW_APP_STARTING_PREVIEW && mMainStack) {
161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mWindowManager.setAppStartingWindow(
1611be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                next.appToken, next.packageName, next.theme,
16122f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                mService.compatibilityInfoForPackageLocked(
16132f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                        next.info.applicationInfo),
161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                next.nonLocalizedLabel,
16157eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                next.labelRes, next.icon, next.windowFlags,
16167eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                                null, true);
161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startSpecificActivityLocked(next, true, false);
162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // From this point on, if something goes wrong there is no way
162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to recover the activity.
162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.visible = true;
162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                completeResumeLocked(next);
162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If any exception gets thrown, toss away this
163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity and try the next one.
163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during resume of " + next, e);
1632be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "resume-exception");
163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return true;
163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Didn't need to use the icicle, and it is now out of date.
163898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next);
163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.icicle = null;
164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.haveState = false;
164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            next.stopped = false;
164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Whoops, need to restart this activity!
164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!next.hasBeenLaunched) {
164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next.hasBeenLaunched = true;
164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (SHOW_APP_STARTING_PREVIEW) {
164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mWindowManager.setAppStartingWindow(
1650be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            next.appToken, next.packageName, next.theme,
16512f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            mService.compatibilityInfoForPackageLocked(
16522f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                    next.info.applicationInfo),
165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            next.nonLocalizedLabel,
16547eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            next.labelRes, next.icon, next.windowFlags,
16557eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            null, true);
165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            startSpecificActivityLocked(next, true, true);
166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void startActivityLocked(ActivityRecord r, boolean newTask,
16667a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            boolean doResume, boolean keepCurTransition, Bundle options) {
166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int NH = mHistory.size();
166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int addPos = -1;
167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!newTask) {
167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If starting in an existing task, find where that is...
167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean startIt = true;
167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (int i = NH-1; i >= 0; i--) {
16750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                ActivityRecord p = mHistory.get(i);
167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.finishing) {
167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    continue;
167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.task == r.task) {
168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Here it is!  Now, if this is not yet visible to the
168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // user, then just add it without starting; it will
168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // get started when the user navigates back to it.
168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    addPos = i+1;
168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!startIt) {
168598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
168698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
168798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
168898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos,
168998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    here);
169098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(addPos, r);
1692f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        r.putInHistory();
1693be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                r.info.screenOrientation, r.fullscreen);
169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
1696be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return;
169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    break;
170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (p.fullscreen) {
170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    startIt = false;
170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Place a new activity at top of stack, so it is next to interact
170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // with the user.
171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < 0) {
17110dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn            addPos = NH;
171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we are not placing the new activity frontmost, we do not want
171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // to deliver the onUserLeaving callback to the actual frontmost
171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity
171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (addPos < NH) {
171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mUserLeaving = false;
171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Slot the activity into the history stack and proceed
172398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
172498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
172598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
172698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here);
172798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(addPos, r);
1729f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn        r.putInHistory();
173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frontOfTask = newTask;
173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (NH > 0) {
173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We want to show the starting preview window if we are
173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // switching to a new task, or the next activity's process is
173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // not currently running.
173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean showStartingIcon = newTask;
173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ProcessRecord proc = r.app;
173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null) {
173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (proc == null || proc.thread == null) {
174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                showStartingIcon = true;
174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare open transition: starting " + r);
174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
17467da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                mService.mWindowManager.prepareAppTransition(
17477da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(
17517da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition);
175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.prepareAppTransition(newTask
175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? WindowManagerPolicy.TRANSIT_TASK_OPEN
17567da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.remove(r);
175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
17597a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            r.updateOptionsLocked(options);
176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.addAppToken(
1761be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen);
176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean doShow = true;
176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (newTask) {
176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Even though this activity is starting fresh, we still need
176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to reset it to make sure we apply affinities to move any
176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // existing activities from other tasks in to it.
176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller has requested that the target task be
176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // reset, then do so.
176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()
177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resetTaskIfNeededLocked(r, r);
177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    doShow = topRunningNonDelayedActivityLocked(null) == r;
177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (SHOW_APP_STARTING_PREVIEW && doShow) {
177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Figure out if we are transitioning from another activity that is
177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // "has the same starting icon" as the next one.  This allows the
177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // window manager to keep the previous window it had previously
177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // created, if it still had one.
178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord prev = mResumedActivity;
178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (prev != null) {
178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We don't want to reuse the previous starting preview if:
178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (1) The current activity is in a different task.
178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (prev.task != r.task) prev = null;
178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // (2) The current activity is already displayed.
178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    else if (prev.nowVisible) prev = null;
178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mWindowManager.setAppStartingWindow(
1789be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.appToken, r.packageName, r.theme,
17902f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                        mService.compatibilityInfoForPackageLocked(
17912f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                                r.info.applicationInfo), r.nonLocalizedLabel,
1792be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        r.labelRes, r.icon, r.windowFlags,
1793be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        prev != null ? prev.appToken : null, showStartingIcon);
179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this is the first activity, don't do any fancy animations,
179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // because there is nothing for it to animate on top of.
1798be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId,
179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.info.screenOrientation, r.fullscreen);
180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
1802be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (doResume) {
180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
1810be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    final void validateAppTokensLocked() {
1811be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.clear();
1812be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mValidateAppTokens.ensureCapacity(mHistory.size());
1813be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        for (int i=0; i<mHistory.size(); i++) {
1814be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mValidateAppTokens.add(mHistory.get(i).appToken);
1815be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        }
1816be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        mService.mWindowManager.validateAppTokens(mValidateAppTokens);
1817be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    }
1818be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn
181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform a reset of the given task, if needed as part of launching it.
182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Returns the new HistoryRecord at the top of the task.
182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord newActivity) {
182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean forceReset = (newActivity.info.flags
182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0;
1827621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (ACTIVITY_INACTIVE_RESET_TIME > 0
1828621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) {
182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((newActivity.info.flags
183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) {
183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                forceReset = true;
183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final TaskRecord task = taskTop.task;
183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We are going to move through the history list so that we can look
183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // at each activity 'target' with 'below' either the interesting
183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity immediately below it in the stack or null.
184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord target = null;
184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int targetI = 0;
184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int taskTopI = -1;
184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int replyChainEnd = -1;
184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int lastReparentPos = -1;
184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mHistory.size()-1; i>=-1; i--) {
18460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (below != null && below.finishing) {
184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
185104e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            // Don't check any lower in the stack if we're crossing a user boundary.
185204e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            if (below != null && below.userId != taskTop.userId) {
185304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani                break;
185404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani            }
185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target == null) {
185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                target = below;
185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                targetI = i;
185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If we were in the middle of a reply chain before this
185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, it doesn't appear like the root of the chain wants
186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // anything interesting, so drop it.
186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                replyChainEnd = -1;
186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int flags = target.info.flags;
186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean finishOnTaskLaunch =
186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final boolean allowTaskReparenting =
187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0;
187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (target.task == task) {
187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of the task being reset...  we'll either
187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // finish this activity, push it out for another task,
187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // or leave it as-is.  We only do this
187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for activities that are not the root of the task (since
187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // if we finish the root, we may no longer have the task!).
187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTopI < 0) {
187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    taskTopI = targetI;
188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (below != null && below.task == task) {
188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final boolean clearWhenTaskReset =
188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (target.intent.getFlags()
188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0;
188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) {
188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity is sending a reply to a previous
188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, we can't do anything with it now until
188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // we reach the start of the reply chain.
188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // XXX note that we are assuming the result is always
189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to the previous activity, which is almost always
189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the case but we really shouldn't count on.
189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting
189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && target.taskAffinity != null
189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            && !target.taskAffinity.equals(task.affinity)) {
189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If this activity has an affinity for another
189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // task, then we need to move it out of here.  We will
190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // move it as far out of the way as possible, to the
190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // bottom of the activity stack.  This also keeps it
190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // correctly ordered with any activities we previously
190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // moved.
19040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(0);
190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (target.taskAffinity != null
190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && target.taskAffinity.equals(p.task.affinity)) {
190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // If the activity currently at the bottom has the
190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // same task affinity as the one we are moving,
190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // then merge it into the same task.
1910f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(p.task, p.thumbHolder, false);
191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to bottom task " + p.task);
191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mService.mCurTask++;
191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (mService.mCurTask <= 0) {
191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                mService.mCurTask = 1;
191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
1918f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            target.setTask(new TaskRecord(mService.mCurTask, target.info, null),
1919f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                                    null, false);
192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            target.task.affinityIntent = target.intent;
192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to new task " + target.task);
192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
1924be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(target.appToken, task.taskId);
192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (replyChainEnd < 0) {
192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int dstPos = 0;
1929f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        ThumbnailHolder curThumbHolder = target.thumbHolder;
193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
19310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    + " out to target's task " + target.task);
1937f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            p.setTask(target.task, curThumbHolder, false);
1938f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                            curThumbHolder = p.thumbHolder;
193998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            if (DEBUG_ADD_REMOVE) {
194098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                RuntimeException here = new RuntimeException("here");
194198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                here.fillInStackTrace();
194298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
194398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                        + dstPos, here);
194498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            }
194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.remove(srcPos);
194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            mHistory.add(dstPos, p);
1947be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.moveAppToken(dstPos, p.appToken);
1948be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            dstPos++;
195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (VALIDATE_TOKENS) {
1951be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                                validateAppTokensLocked();
195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            i++;
195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (forceReset || finishOnTaskLaunch
196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || clearWhenTaskReset) {
196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the activity should just be removed -- either
196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // because it asks for it, or the task should be
196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cleared -- then finish it and anything that is
196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // part of its reply chain.
196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (clearWhenTaskReset) {
196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case, we want to finish this activity
197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // and everything above it, so be sneaky and pretend
197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // like these are all in the reply chain.
197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI+1;
197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            while (replyChainEnd < mHistory.size() &&
19740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                                    (mHistory.get(
197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                                replyChainEnd)).task == task) {
197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd++;
197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (replyChainEnd < 0) {
198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd = targetI;
198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord p = null;
198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
19840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            p = mHistory.get(srcPos);
198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (finishActivityLocked(p, srcPos,
198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    Activity.RESULT_CANCELED, null, "reset")) {
199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                replyChainEnd--;
199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                srcPos--;
199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTop == p) {
199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = below;
199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (taskTopI == replyChainEnd) {
199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI = -1;
199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If we were in the middle of a chain, well the
200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity that started it all doesn't want anything
200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // special, so leave it all as-is.
200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = -1;
200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Reached the bottom of the task -- any reply chain
200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // should be left as-is.
201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2012ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2013ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (target.resultTo != null && (below == null
2014ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    || below.task == target.task)) {
201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is sending a reply to a previous
201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity, we can't do anything with it now until
201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we reach the start of the reply chain.
201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // XXX note that we are assuming the result is always
201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // to the previous activity, which is almost always
202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // the case but we really shouldn't count on.
202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (replyChainEnd < 0) {
202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = targetI;
202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (taskTopI >= 0 && allowTaskReparenting
202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity != null
202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && task.affinity.equals(target.taskAffinity)) {
202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are inside of another task...  if this activity has
202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // an affinity for our task, then either remove it if we are
203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // clearing or move it over to our task.  Note that
203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we currently punt on the case where we are resetting a
203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task that is not at the top but who has activities above
203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // with an affinity to it...  this is really not a normal
203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // case, and we will need to later pull that task to the front
203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and usually at that point we will do the reset and pick
203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up those remaining activities.  (This only happens if
203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // someone starts an activity in a new task from an activity
203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in a task that is not currently on top.)
203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (forceReset || finishOnTaskLaunch) {
204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord p = null;
2044ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index "
2045ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
20470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        p = mHistory.get(srcPos);
204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (finishActivityLocked(p, srcPos,
205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Activity.RESULT_CANCELED, null, "reset")) {
205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTopI--;
205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            replyChainEnd--;
205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            srcPos--;
205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (replyChainEnd < 0) {
206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        replyChainEnd = targetI;
206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2064ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                    if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index "
2065ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                            + targetI + " to " + replyChainEnd);
206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) {
20670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        ActivityRecord p = mHistory.get(srcPos);
206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (p.finishing) {
206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            continue;
207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (lastReparentPos < 0) {
207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos = taskTopI;
207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            taskTop = p;
207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            lastReparentPos--;
207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
207798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        if (DEBUG_ADD_REMOVE) {
207898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            RuntimeException here = new RuntimeException("here");
207998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            here.fillInStackTrace();
208098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            Slog.i(TAG, "Removing and adding activity " + p + " to stack at "
208198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                                    + lastReparentPos, here);
208298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                        }
208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.remove(srcPos);
2084f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                        p.setTask(task, null, false);
208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mHistory.add(lastReparentPos, p);
208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
2087ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                                + " from " + srcPos + " to " + lastReparentPos
208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                + " in to resetting task " + task);
2089be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken);
2090be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId);
209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (VALIDATE_TOKENS) {
2092be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                            validateAppTokensLocked();
209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    replyChainEnd = -1;
209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // Now we've moved it in to place...  but what if this is
209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // a singleTop activity and we have put it on top of another
209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // instance of the same activity?  Then we drop the instance
210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // below so it remains singleTop.
210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        for (int j=lastReparentPos-1; j>=0; j--) {
21030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                            ActivityRecord p = mHistory.get(j);
210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.finishing) {
210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                continue;
210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                if (finishActivityLocked(p, j,
210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        Activity.RESULT_CANCELED, null, "replace")) {
211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    taskTopI--;
211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    lastReparentPos--;
211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                }
211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
2117ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn
2118ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn            } else if (below != null && below.task != target.task) {
2119ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // We hit the botton of a task; the reply chain can't
2120ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                // pass through it.
2121ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn                replyChainEnd = -1;
212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            target = below;
212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            targetI = i;
212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return taskTop;
212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clear operation as requested by
213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the
213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * stack to the given task, then look for
213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * an instance of that activity in the stack and, if found, finish all
213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities on top of it and return the instance.
213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param newR Description of the new activity being started.
2139621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * @return Returns the old activity that should be continued to be used,
214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * or null if none was found.
214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord performClearTaskLocked(int taskId,
2143621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            ActivityRecord newR, int launchFlags) {
214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First find the requested task.
214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
21490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == taskId) {
215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i++;
215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Now clear it.
215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
21590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                continue;
216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId != taskId) {
216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return null;
216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.realActivity.equals(newR.realActivity)) {
216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Here it is!  Now finish everything in front...
216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord ret = r;
2169621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                while (i < (mHistory.size()-1)) {
2170621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    i++;
21710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    r = mHistory.get(i);
2172621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.task.taskId != taskId) {
2173621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
2174621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2175621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (r.finishing) {
2176621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
2177621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
2178621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
2179621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            null, "clear")) {
2180621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        i--;
218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Finally, if this is a normal launch mode (that is, not
218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // expecting onNewIntent()), then we will finish the current
218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of the activity so a new fresh one can be started.
218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE
218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) {
218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (!ret.finishing) {
2190be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                        int index = indexOfTokenLocked(ret.appToken);
219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (index >= 0) {
219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    null, "clear");
219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        return null;
219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return ret;
220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return null;
220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
22070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * Completely remove all activities associated with an existing
22080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     * task starting at a specified index.
22090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn     */
22100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    private final void performClearTaskAtIndexLocked(int taskId, int i) {
2211eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn        while (i < mHistory.size()) {
22120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
22130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.task.taskId != taskId) {
22140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                // Whoops hit the end.
22150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                return;
22160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
22170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (r.finishing) {
22180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
22190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
22200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
22210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
22220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    null, "clear")) {
22230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                i++;
22240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
22250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
22260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
22270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
22280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    /**
2229621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Completely remove all activities associated with an existing task.
2230621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
2231621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    private final void performClearTaskLocked(int taskId) {
2232621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int i = mHistory.size();
2233621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2234621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // First find the requested task.
2235621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2236621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
22370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId == taskId) {
2239621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                i++;
2240621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                break;
2241621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2242621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2243621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
22440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Now find the start and clear it.
2245621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        while (i > 0) {
2246621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            i--;
22470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(i);
2248621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.finishing) {
2249621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                continue;
2250621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2251621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (r.task.taskId != taskId) {
2252621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // We hit the bottom.  Now finish it all...
22530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                performClearTaskAtIndexLocked(taskId, i+1);
2254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                return;
2255621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
2256621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2257621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2258621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2259621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Find the activity in the history stack within the given task.  Returns
226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * the index within the history at which it's found, or < 0 if not found.
226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final int findActivityInHistoryLocked(ActivityRecord r, int task) {
226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = mHistory.size();
226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
22670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord candidate = mHistory.get(i);
226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.task.taskId != task) {
226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                break;
227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (candidate.realActivity.equals(r.realActivity)) {
227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return i;
227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return -1;
227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Reorder the history stack so that the activity at the given index is
228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * brought to the front.
228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord moveActivityToFrontLocked(int where) {
22840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord newTop = mHistory.remove(where);
228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size();
22860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord oldTop = mHistory.get(top-1);
228798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_ADD_REMOVE) {
228898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            RuntimeException here = new RuntimeException("here");
228998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            here.fillInStackTrace();
229098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at "
229198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    + top, here);
229298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        }
229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHistory.add(top, newTop);
229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        oldTop.frontOfTask = false;
229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        newTop.frontOfTask = true;
229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return newTop;
229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityLocked(IApplicationThread caller,
2300a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode,
2302a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            int callingPid, int callingUid, int startFlags, Bundle options,
2303621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity) {
2304efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2305a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        int err = ActivityManager.START_SUCCESS;
2306efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2307efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        ProcessRecord callerApp = null;
2308efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        if (caller != null) {
2309efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            callerApp = mService.getRecordForAppLocked(caller);
2310efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            if (callerApp != null) {
2311efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingPid = callerApp.pid;
2312efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                callingUid = callerApp.info.uid;
2313efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            } else {
2314efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                Slog.w(TAG, "Unable to find app for caller " + caller
2315efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + " (pid=" + callingPid + ") when starting: "
2316efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn                      + intent.toString());
2317a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                err = ActivityManager.START_PERMISSION_DENIED;
2318efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn            }
2319efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
2320efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn
2321a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS) {
232221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            Slog.i(TAG, "START {" + intent.toShortString(true, true, true, false)
232321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
2324efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn        }
232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord sourceRecord = null;
232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord resultRecord = null;
232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (resultTo != null) {
232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index = indexOfTokenLocked(resultTo);
233050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(
233198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Will send result to " + resultTo + " (index " + index + ")");
233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
23330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sourceRecord = mHistory.get(index);
233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (requestCode >= 0 && !sourceRecord.finishing) {
233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord = sourceRecord;
233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && sourceRecord != null) {
234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Transfer the result target from the source activity to the new
234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // one being started, including any failures.
234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (requestCode >= 0) {
2347a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultRecord = sourceRecord.resultTo;
235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resultWho = sourceRecord.resultWho;
235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            requestCode = sourceRecord.requestCode;
235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sourceRecord.resultTo = null;
235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord.removeResultsLocked(
235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sourceRecord, resultWho, requestCode);
235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2359a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find a class that can handle the given Intent.
236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // That's the end of that!
2362a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_INTENT_NOT_RESOLVED;
236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2365a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // We couldn't find the specific class specified in the Intent.
236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Also the end of the line.
2368a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            err = ActivityManager.START_CLASS_NOT_FOUND;
236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2371a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (err != ActivityManager.START_SUCCESS) {
237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
237790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return err;
237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int perm = mService.checkComponentPermission(aInfo.permission, callingPid,
23826c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (perm != PackageManager.PERMISSION_GRANTED) {
238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (resultRecord != null) {
238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    resultRecord, resultWho, requestCode,
238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
238990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
23906c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            String msg;
23916c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            if (!aInfo.exported) {
23926c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
23936c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
23946c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
23956c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " not exported from uid " + aInfo.applicationInfo.uid;
23966c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            } else {
23976c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                msg = "Permission Denial: starting " + intent.toString()
23986c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " from " + callerApp + " (pid=" + callingPid
23996c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + ", uid=" + callingUid + ")"
24006c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn                        + " requires " + aInfo.permission;
24016c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn            }
240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, msg);
240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            throw new SecurityException(msg);
240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mController != null) {
240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean abort = false;
240950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The Intent we give to the watcher has the extra data
241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // stripped off, since it can contain private information.
241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Intent watchIntent = intent.cloneFilter();
241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    abort = !mService.mController.activityStarting(watchIntent,
241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo.applicationInfo.packageName);
241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (abort) {
242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (resultRecord != null) {
242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sendActivityResultLocked(-1,
242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resultRecord, resultWho, requestCode,
242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            Activity.RESULT_CANCELED, null);
242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // We pretend to the caller that it was really started, but
242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // they will just get a cancel result.
242790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
2428a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SUCCESS;
242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2432742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,
243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                intent, resolvedType, aInfo, mService.mConfiguration,
243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                resultRecord, resultWho, requestCode, componentSpecified);
2436621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (outActivity != null) {
2437621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            outActivity[0] = r;
2438621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mResumedActivity == null
244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    || mResumedActivity.info.applicationInfo.uid != callingUid) {
244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    PendingActivityLaunch pal = new PendingActivityLaunch();
244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.r = r;
244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    pal.sourceRecord = sourceRecord;
2447a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    pal.startFlags = startFlags;
244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mPendingActivityLaunches.add(pal);
244990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                    mDismissKeyguardOnNextActivity = false;
2450a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_SWITCHES_CANCELED;
245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mDidAppSwitch) {
245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is the second allowed switch since we stopped switches,
245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // so now just generally allow switches.  Use case: user presses
245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // home (switches disabled, switch to home, mDidAppSwitch now true);
245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // user taps a home icon (coming from home so allowed, we hit here
245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // and now allow anyone to switch again).
246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mAppSwitchesAllowedTime = 0;
246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mDidAppSwitch = true;
246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.doPendingActivityLaunchesLocked(false);
246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
246890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord,
24697a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                startFlags, true, options);
2470621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn        if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
247190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // Someone asked to have the keyguard dismissed on the next
247290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // activity start, but we are not actually doing an activity
247390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // switch...  just dismiss the keyguard now, because we
247490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            // probably want to see whatever is behind it.
247590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
247690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
247790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
247890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        return err;
247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2481621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
2482621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if ((launchFlags &
2483621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2484621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2485621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // Caller wants to appear on home activity, so before starting
2486621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            // their own activity we will bring home to the front.
2487621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontLocked();
2488621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2489621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2490621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r,
24927a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            ActivityRecord sourceRecord, int startFlags, boolean doResume,
24937a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn            Bundle options) {
249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final Intent intent = r.intent;
249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int callingUid = r.launchedFromUid;
2496742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final int userId = r.userId;
2497742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int launchFlags = intent.getFlags();
249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We'll invoke onUserLeaving before onPause only if the launching
250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // activity did not explicitly state that this is an automated launch.
250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_USER_LEAVING) Slog.v(TAG,
250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "startActivity() => mUserLeaving=" + mUserLeaving);
250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the caller has asked not to resume at this point, we make note
250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of this in the record so that we can skip it when trying to find
250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // the top running activity.
250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!doResume) {
251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.delayedResume = true;
251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)
251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                != 0 ? r : null;
251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the onlyIfNeeded flag is set, then we can do this if the activity
251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // being launched is the same as the one making the call...  or, as
251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // a special case, if we do not know the caller then we count the
251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current top activity as the caller.
2520a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord checkedCaller = sourceRecord;
252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (checkedCaller == null) {
252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                checkedCaller = topRunningNonDelayedActivityLocked(notTop);
252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!checkedCaller.realActivity.equals(r.realActivity)) {
252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Caller is not the same as launcher, so always needed.
2527a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sourceRecord == null) {
253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This activity is not being started from another...  in this
253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // case we -always- start a new task.
253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                      + intent);
253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The original activity who is starting us is running as a single
254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // instance...  this new activity it is starting must go on its
254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // own task.
254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // The activity being started is a single instance...  it always
254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // gets launched into its own task.
254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // For whatever reason this activity is being launched into a new
255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // task...  yet the caller has requested a result back.  Well, that
255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // is pretty messed up, so instead immediately send back a cancel
255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // and let the new task continue launched as normal without a
255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // dependency on its originator.
255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            sendActivityResultLocked(-1,
255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.resultTo, r.resultWho, r.requestCode,
256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Activity.RESULT_CANCELED, null);
256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.resultTo = null;
256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean addingToTask = false;
2565621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord reuseTask = null;
256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If bring to front is requested, and no result is requested, and
257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we can find a task that was started with this same
257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // component, then instead of launching bring that one to the front.
257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo == null) {
257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // See if there is a task to bring to the front.  If this is
257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // a SINGLE_INSTANCE activity, there can be one and only one
257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // instance of it in the history, and it is always in its own
257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // unique task, so we do a special search.
257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ? findTaskLocked(intent, r.info)
258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        : findActivityLocked(intent, r.info);
258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (taskTop != null) {
258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (taskTop.task.intent == null) {
258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // This task was started because of movement of
258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the activity based on affinity...  now that we
258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // are actually launching it, we can assign the
258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // base intent.
258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(intent, r.info);
258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the target task is not in the front, then we need
259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to bring it to the front...  except...  well, with
259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // to have the same behavior as if a new instance was
259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // being started, which means not bringing it to the front
259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // if the caller is not itself in the front.
259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop);
259666a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru                    if (curTop != null && curTop.task != taskTop.task) {
259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        boolean callerAtFront = sourceRecord == null
259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                || curTop.task == sourceRecord.task;
260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (callerAtFront) {
260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // We really do want to push this one into the
260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // user's face, right now.
2603621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            moveHomeToFrontFromLaunchLocked(launchFlags);
26047a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                            r.updateOptionsLocked(options);
260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            moveTaskToFrontLocked(taskTop.task, r);
260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller has requested that the target task be
260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // reset, then do so.
261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop = resetTaskIfNeededLocked(taskTop, r);
261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2613a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED)  != 0) {
261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We don't need to start a new activity, and
261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the client said not to do anything if that
261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is the case, so this is it!  And for paranoia, make
261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resumeTopActivityLocked(null);
262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2621a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2623621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if ((launchFlags &
2624621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
2625621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
2626621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // The caller has requested to completely replace any
26277da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // existing task with its new activity.  Well that should
2628621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        // not be too hard...
2629621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask = taskTop.task;
2630621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        performClearTaskLocked(taskTop.task.taskId);
2631621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        reuseTask.setIntent(r.intent, r.info);
2632621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this situation we want to remove all activities
263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from the task up to the one being started.  In most
263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // cases this means we are resetting the task to its
263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // initial state.
263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        ActivityRecord top = performClearTaskLocked(
2640621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                taskTop.task.taskId, r, launchFlags);
264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (top != null) {
264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (top.frontOfTask) {
264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // Activity aliases may mean we use different
264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intents for the top activity, so make sure
264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the task now has the identity of the new
264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // intent.
264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                top.task.setIntent(r.intent, r.info);
264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
265039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else {
265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // A special case: we need to
265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // start the activity because it is not currently
265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // running, and the caller has asked to clear the
265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // current task to have this activity at the top.
265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Now pretend like this activity is being started
265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // by the top of its task, so it is put in the
265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // right place.
266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (r.realActivity.equals(taskTop.task.realActivity)) {
266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case the top activity on the task is the
266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // same as the one being launched, so we take that
266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // as a request to bring the task to the foreground.
266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // If the top activity in the task is the root
266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // activity, deliver this new intent to it if it
266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // desires.
266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                && taskTop.realActivity.equals(r.realActivity)) {
267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (taskTop.frontOfTask) {
267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                taskTop.task.setIntent(r.intent, r.info);
267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
267539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            taskTop.deliverNewIntentLocked(callingUid, r.intent);
267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } else if (!r.intent.filterEquals(taskTop.task.intent)) {
267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // In this case we are launching the root activity
267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // of the task, but with a different intent.  We
267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // should start a new instance on top.
268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            addingToTask = true;
268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            sourceRecord = taskTop;
268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case an activity is being launched in to an
268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // existing task, without resetting that task.  This
268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // is typically the situation of launching an activity
268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // from a notification or shortcut.  We want to place
268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // the new activity on top of the current task.
268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        addingToTask = true;
269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        sourceRecord = taskTop;
269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else if (!taskTop.task.rootWasReset) {
269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // In this case we are launching in to an existing task
269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // that has not yet been started from its front door.
269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // The current task has been brought to the front.
269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // Ideally, we'd probably like to place this new task
269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // at the bottom of its stack, but that's a little hard
269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // to do with the current organization of the code so
269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // for now we'll just drop it.
269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        taskTop.task.setIntent(r.intent, r.info);
270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2701621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (!addingToTask && reuseTask == null) {
270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // We didn't do anything...  but it was needed (a.k.a., client
270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // don't use that intent!)  And for paranoia, make
270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        // sure we have correctly resumed the top activity.
270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (doResume) {
270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            resumeTopActivityLocked(null);
270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
2708a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        return ActivityManager.START_TASK_TO_FRONT;
270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //String uri = r.intent.toURI();
271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Intent intent2 = new Intent(uri);
271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "Given intent: " + r.intent);
271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "URI is: " + uri);
271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //Slog.i(TAG, "To intent: " + intent2);
271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.packageName != null) {
272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity being launched is the same as the one currently
272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // at the top, then we need to check if it should only be launched
272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // once.
272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (top != null && r.resultTo == null) {
2726742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (top.app != null && top.app.thread != null) {
272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // For paranoia, make sure we have correctly
273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // resumed the top activity.
273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (doResume) {
273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                resumeTopActivityLocked(null);
273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
2737a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // We don't need to start a new activity, and
273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // the client said not to do anything if that
274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                // is the case, so this is it!
2741a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
274339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent);
2744a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            return ActivityManager.START_DELIVERED_TO_TOP;
274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.resultTo != null) {
275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendActivityResultLocked(-1,
275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.resultTo, r.resultWho, r.requestCode,
275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Activity.RESULT_CANCELED, null);
275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
2756a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            return ActivityManager.START_CLASS_NOT_FOUND;
275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean newTask = false;
27607da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn        boolean keepCurTransition = false;
276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Should this be considered a new task?
276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.resultTo == null && !addingToTask
276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2765621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (reuseTask == null) {
2766621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                // todo: should do better management of integers.
2767621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                mService.mCurTask++;
2768621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (mService.mCurTask <= 0) {
2769621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    mService.mCurTask = 1;
2770621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
2771f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true);
2772621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
2773621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        + " in new task " + r.task);
2774621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else {
2775f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                r.setTask(reuseTask, reuseTask, true);
277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newTask = true;
2778621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveHomeToFrontFromLaunchLocked(launchFlags);
277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (sourceRecord != null) {
278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!addingToTask &&
278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are adding the activity to an existing
278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // task, but the caller has asked to clear that task if the
278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // activity is already running.
278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ActivityRecord top = performClearTaskLocked(
2787621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        sourceRecord.task.taskId, r, launchFlags);
27887da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                keepCurTransition = true;
278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (top != null) {
279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
279139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // For paranoia, make sure we have correctly
279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // resumed the top activity.
279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2797a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (!addingToTask &&
280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // In this case, we are launching an activity in our own task
280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // that may already be running somewhere in the history, and
280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // we want to shuffle it to the front of the stack if so.
280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (where >= 0) {
280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord top = moveActivityToFrontLocked(where);
280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
28087a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    top.updateOptionsLocked(options);
280939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent);
281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (doResume) {
281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resumeTopActivityLocked(null);
281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
2813a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // An existing activity is starting this new activity, so we want
281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to keep the new one in the same task as the one that is starting
281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it.
2819f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in existing task " + r.task);
282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // This not being started from an existing activity, and not part
282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // of a new task...  just put it in the top task, though these days
282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this case should never happen.
282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final int N = mHistory.size();
282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord prev =
28290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                N > 0 ? mHistory.get(N-1) : null;
2830f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.setTask(prev != null
2831621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    ? prev.task
2832f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn                    : new TaskRecord(mService.mCurTask, r.info, intent), null, true);
283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " in new guessed " + r.task);
283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
283639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
283739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
28387e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                intent, r.getUriPermissionsLocked());
283939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn
284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (newTask) {
284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId);
284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
28447a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn        startActivityLocked(r, newTask, doResume, keepCurTransition, options);
2845a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
2848a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
2849483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            String profileFile, ParcelFileDescriptor profileFd, int userId) {
285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Collect information about the target of the Intent.
285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ActivityInfo aInfo;
285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ResolveInfo rInfo =
285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                AppGlobals.getPackageManager().resolveIntent(
285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent, resolvedType,
285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        PackageManager.MATCH_DEFAULT_ONLY
2857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = rInfo != null ? rInfo.activityInfo : null;
285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            aInfo = null;
286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (aInfo != null) {
286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Store the found target back into the intent, because now that
286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // we have it we never want to do this again.  For example, if the
286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // user navigates back to this point in the history, we should
286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // always restart the exact same activity.
286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            intent.setComponent(new ComponentName(
286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    aInfo.applicationInfo.packageName, aInfo.name));
287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Don't debug things in the system process
2872a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setDebugApp(aInfo.processName, true, false);
287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
287762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
2878a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
287992a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                if (!aInfo.processName.equals("system")) {
288092a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
288192a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy                }
288292a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy            }
288392a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy
288462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            if (profileFile != null) {
288562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                if (!aInfo.processName.equals("system")) {
288662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
2887a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            profileFile, profileFd,
2888a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
288962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                }
289062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
2892621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        return aInfo;
2893621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
2894621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2895621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivityMayWait(IApplicationThread caller, int callingUid,
2896a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, String resolvedType, IBinder resultTo,
2897a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            String resultWho, int requestCode, int startFlags, String profileFile,
2898a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
2899a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
2900621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Refuse possible leaked file descriptors
2901621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intent != null && intent.hasFileDescriptors()) {
2902621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("File descriptors passed in Intent");
2903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
2904621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        boolean componentSpecified = intent.getComponent() != null;
2905621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2906621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Don't modify the client's object!
2907621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        intent = new Intent(intent);
2908621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
2909621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        // Collect information about the target of the Intent.
2910a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
2911483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                profileFile, profileFd, userId);
2912742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        aInfo = mService.getActivityInfoForUser(aInfo, userId);
291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int callingPid;
2916621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (callingUid >= 0) {
2917621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                callingPid = -1;
2918621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            } else if (caller == null) {
291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = Binder.getCallingPid();
292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingUid = Binder.getCallingUid();
292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                callingPid = callingUid = -1;
292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mConfigWillChange = config != null
292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    && mService.mConfiguration.diff(config) != 0;
292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_CONFIGURATION) Slog.v(TAG,
292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Starting activity when config will change = " + mConfigWillChange);
292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            final long origId = Binder.clearCallingIdentity();
293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack && aInfo != null &&
293354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This may be a heavy-weight process!  Check to see if we already
293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // have another, different heavy-weight process running.
293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (mService.mHeavyWeightProcess != null &&
293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingPid = callingPid;
294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        int realCallingUid = callingUid;
294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (caller != null) {
294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            if (callerApp != null) {
294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingPid = callerApp.pid;
294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                realCallingUid = callerApp.info.uid;
294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } else {
294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                Slog.w(TAG, "Unable to find app for caller " + caller
294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + " (pid=" + realCallingPid + ") when starting: "
295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                      + intent.toString());
2951a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                return ActivityManager.START_PERMISSION_DENIED;
295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        IIntentSender target = mService.getIntentSenderLocked(
2956a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
2957621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                realCallingUid, null, null, 0, new Intent[] { intent },
2958621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
29597a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                                | PendingIntent.FLAG_ONE_SHOT, null);
296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        Intent newIntent = new Intent();
296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (requestCode >= 0) {
296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            // Caller is requesting a result.
296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                new IntentSender(target));
296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.packageName);
297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                    hist.task.taskId);
297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                aInfo.packageName);
297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setFlags(intent.getFlags());
297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        newIntent.setClassName("android",
297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                HeavyWeightSwitcherActivity.class.getName());
298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        intent = newIntent;
298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resolvedType = null;
298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        caller = null;
298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingUid = Binder.getCallingUid();
298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        callingPid = Binder.getCallingPid();
298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        componentSpecified = true;
298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ResolveInfo rInfo =
298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                AppGlobals.getPackageManager().resolveIntent(
298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        intent, null,
299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                                        PackageManager.MATCH_DEFAULT_ONLY
2991483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = rInfo != null ? rInfo.activityInfo : null;
2993742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (RemoteException e) {
299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            aInfo = null;
299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType,
3002a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
3003a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    startFlags, options, componentSpecified, null);
300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mConfigWillChange && mMainStack) {
300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If the caller also wants to switch to a new configuration,
300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // do so now.  This allows a clean switch, as we are waiting
300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // for the current activity to pause (so we will not destroy
300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it), and have not yet started the next activity.
301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "updateConfiguration()");
301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mConfigWillChange = false;
301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG,
301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "Updating to new configuration after starting activity.");
3015813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                mService.updateConfigurationLocked(config, null, false, false);
301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Binder.restoreCallingIdentity(origId);
301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (outResult != null) {
302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                outResult.result = res;
3022a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                if (res == ActivityManager.START_SUCCESS) {
302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mWaitingActivityLaunched.add(outResult);
302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    do {
302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        try {
3026ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                            mService.wait();
302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } catch (InterruptedException e) {
302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        }
302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } while (!outResult.timeout && outResult.who == null);
3030a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ActivityRecord r = this.topRunningActivityLocked(null);
303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (r.nowVisible) {
303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.timeout = false;
303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.totalTime = 0;
303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = 0;
303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    } else {
303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        outResult.thisTime = SystemClock.uptimeMillis();
303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mWaitingActivityVisible.add(outResult);
304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        do {
304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            try {
3042ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn                                mService.wait();
304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            } catch (InterruptedException e) {
304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            }
304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        } while (!outResult.timeout && outResult.who == null);
304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return res;
305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3054621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final int startActivities(IApplicationThread caller, int callingUid,
3055a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
3056a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Bundle options, int userId) {
3057621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents == null) {
3058621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("intents is null");
3059621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3060621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (resolvedTypes == null) {
3061621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new NullPointerException("resolvedTypes is null");
3062621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3063621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (intents.length != resolvedTypes.length) {
3064621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            throw new IllegalArgumentException("intents are length different than resolvedTypes");
3065621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3067621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        ActivityRecord[] outActivity = new ActivityRecord[1];
3068621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3069621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        int callingPid;
3070621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (callingUid >= 0) {
3071621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = -1;
3072621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else if (caller == null) {
3073621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = Binder.getCallingPid();
3074621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingUid = Binder.getCallingUid();
3075621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } else {
3076621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            callingPid = callingUid = -1;
3077621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3078621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        final long origId = Binder.clearCallingIdentity();
3079621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
3080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mService) {
3081621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3082621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<intents.length; i++) {
3083621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    Intent intent = intents[i];
3084621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent == null) {
3085621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        continue;
3086621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3087621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3088621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Refuse possible leaked file descriptors
3089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (intent != null && intent.hasFileDescriptors()) {
3090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException("File descriptors passed in Intent");
3091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3093621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    boolean componentSpecified = intent.getComponent() != null;
3094621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3095621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Don't modify the client's object!
3096621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    intent = new Intent(intent);
3097621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3098621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    // Collect information about the target of the Intent.
3099a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
3100483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            0, null, null, userId);
3101742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    // TODO: New, check if this is correct
3102742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
3103621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3104621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags
3105621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
3106621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        throw new IllegalArgumentException(
3107621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                                "FLAG_CANT_SAVE_STATE not supported here");
3108621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3109621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
31107a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    Bundle theseOptions;
31117a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    if (options != null && i == intents.length-1) {
31127a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = options;
31137a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    } else {
31147a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                        theseOptions = null;
31157a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                    }
3116621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
3117a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                            aInfo, resultTo, null, -1, callingPid, callingUid,
31187a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn                            0, theseOptions, componentSpecified, outActivity);
3119621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (res < 0) {
3120621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        return res;
3121621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
3122621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3123be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
3124621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
3125621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3126621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } finally {
3127621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Binder.restoreCallingIdentity(origId);
3128621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3129621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3130a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        return ActivityManager.START_SUCCESS;
3131621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3132621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            long thisTime, long totalTime) {
313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityLaunched.get(i);
313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = timeout;
313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = thisTime;
314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = totalTime;
314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
3146621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn
314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void reportActivityVisibleLocked(ActivityRecord r) {
314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            WaitResult w = mWaitingActivityVisible.get(i);
315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.timeout = false;
315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                w.who = new ComponentName(r.info.packageName, r.info.name);
315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            w.thisTime = w.totalTime;
315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.notifyAll();
315890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
315990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mDismissKeyguardOnNextActivity) {
316090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mDismissKeyguardOnNextActivity = false;
316190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mService.mWindowManager.dismissKeyguard();
316290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void sendActivityResultLocked(int callingUid, ActivityRecord r,
316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            String resultWho, int requestCode, int resultCode, Intent data) {
316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (callingUid > 0) {
316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
31707e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn                    data, r.getUriPermissionsLocked());
317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " : who=" + resultWho + " req=" + requestCode
317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " res=" + resultCode + " data=" + data);
317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r && r.app != null && r.app.thread != null) {
317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.add(new ResultInfo(resultWho, requestCode,
318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        resultCode, data));
3181be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleSendResult(r.appToken, list);
318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                return;
318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown sending result to " + r, e);
318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void stopActivityLocked(ActivityRecord r) {
319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!r.finishing) {
3196be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        "no-history");
319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.app != null && r.app.thread != null) {
320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mFocusedActivity == r) {
320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.setFocusedActivityLocked(topRunningActivityLocked(null));
320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3205621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            r.resumeKeyDispatchingLocked();
320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = false;
3208ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3209ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (stop requested)");
321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPING;
321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(
321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        TAG, "Stopping visible=" + r.visible + " for " + r);
321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!r.visible) {
3214be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(r.appToken, false);
321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
3216be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
32174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                if (mService.isSleeping()) {
32184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    r.setSleeping(true);
32194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                }
322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Maybe just ignore exceptions here...  if the process
322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown during pause", e);
322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // Just in case, assume it to be stopped.
322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.stopped = true;
3227ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);
322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.STOPPED;
322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.configDestroy) {
323028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                    destroyActivityLocked(r, true, false, "stop-except");
323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(
323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean remove) {
323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int N = mStoppingActivities.size();
323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (N <= 0) return null;
324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean nowVisible = mResumedActivity != null
324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && mResumedActivity.nowVisible
324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                && !mResumedActivity.waitingVisible;
324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (int i=0; i<N; i++) {
324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord s = mStoppingActivities.get(i);
324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + nowVisible + " waitingVisible=" + s.waitingVisible
325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    + " finishing=" + s.finishing);
325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (s.waitingVisible && nowVisible) {
325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mWaitingVisibleActivities.remove(s);
325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                s.waitingVisible = false;
325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (s.finishing) {
325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If this activity is finishing, it is sitting on top of
325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // everyone else but we now know it is no longer needed...
325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // so get rid of it.  Otherwise, we need to go through the
325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // normal flow and hide it once we determine that it is
325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // hidden by the activities in front of it.
326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3261be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                    mService.mWindowManager.setAppVisibility(s.appToken, false);
326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
32644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn            if ((!s.waitingVisible || mService.isSleeping()) && remove) {
326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (stops == null) {
326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stops = new ArrayList<ActivityRecord>();
326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                stops.add(s);
327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.remove(i);
327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                N--;
327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                i--;
327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return stops;
327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
327980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    final void scheduleIdleLocked() {
328080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        Message msg = Message.obtain();
328180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        msg.what = IDLE_NOW_MSG;
328280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn        mHandler.sendMessage(msg);
328380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn    }
328480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn
328562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout,
328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Configuration config) {
328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
328962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ActivityRecord res = null;
329062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> stops = null;
329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> finishes = null;
329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        ArrayList<ActivityRecord> thumbnails = null;
329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NS = 0;
329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NF = 0;
329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int NT = 0;
329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        IApplicationThread sendThumbnail = null;
329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean booting = false;
329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean enableScreen = false;
330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3302be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3303be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3304be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
33052a29b3ad1350785aedea3442b38042885533576cDianne Hackborn                r.finishLaunchTickingLocked();
330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Get the activity record.
3309be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
331162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                res = r;
331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (fromTimeout) {
331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // This is a hack to semi-deal with a race condition
331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // in the client where it can be constructed with a
331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // newer configuration from when we asked it to launch.
332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We'll update with whatever configuration it now says
332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // it used to launch.
332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (config != null) {
332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.configuration = config;
332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // No longer need to keep the device awake.
332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mResumedActivity == r && mLaunchingActivity.isHeld()) {
332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mLaunchingActivity.release();
333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We are now idle.  If someone is waiting for a thumbnail from
333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // us, we can now deliver.
333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.idle = true;
333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.scheduleAppGcsLocked();
333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    sendThumbnail = r.app.thread;
333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.thumbnailNeeded = false;
333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If this activity is fullscreen, set up to hide those under it.
334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ensureActivitiesVisibleLocked(null, 0);
334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mMainStack) {
334829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (!mService.mBooted) {
334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        mService.mBooted = true;
335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        enableScreen = true;
335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    }
335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else if (fromTimeout) {
335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Atomically retrieve all of the other things to do.
335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            stops = processStoppingActivitiesLocked(true);
336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            NS = stops != null ? stops.size() : 0;
336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NF=mFinishingActivities.size()) > 0) {
336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mFinishingActivities.clear();
336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if ((NT=mService.mCancelledThumbnails.size()) > 0) {
336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails);
336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mCancelledThumbnails.clear();
336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                booting = mService.mBooting;
337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.mBooting = false;
337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i;
337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Send thumbnail if requested.
337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (sendThumbnail != null) {
338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                sendThumbnail.requestThumbnail(token);
338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.sendPendingThumbnail(null, token, null, null, true);
338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Stop any activities that are scheduled to do so but have been
338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NS; i++) {
339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)stops.get(i);
339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } else {
339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    stopActivityLocked(r);
339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Finish any activities that are scheduled to do so but have been
340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // waiting for the next one to start.
340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NF; i++) {
340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)finishes.get(i);
340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            synchronized (mService) {
340628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "finish-idle");
340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Report back to any thumbnail receivers.
341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        for (i=0; i<NT; i++) {
341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)thumbnails.get(i);
341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.sendPendingThumbnail(r, null, null, null, true);
341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (booting) {
341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.finishBooting();
341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.trimApplications();
342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //dump();
342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        //mWindowManager.dump();
342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (enableScreen) {
342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.enableScreenAfterBoot();
342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
342762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
342862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        return res;
342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the activity is being finished, false if for
343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * some reason it is being left as-is.
343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Intent resultData, String reason) {
343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int index = indexOfTokenLocked(token);
343898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn        if (DEBUG_RESULTS) Slog.v(
343998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                TAG, "Finishing activity @" + index + ": token=" + token
344098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                + ", result=" + resultCode + ", data=" + resultData);
344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
34440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord r = mHistory.get(index);
344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishActivityLocked(r, index, resultCode, resultData, reason);
344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
34505c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
34515c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // send the result
34525c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        ActivityRecord resultTo = r.resultTo;
34535c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        if (resultTo != null) {
34545c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
34555c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " who=" + r.resultWho + " req=" + r.requestCode
34565c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                    + " res=" + resultCode + " data=" + resultData);
34575c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            if (r.info.applicationInfo.uid > 0) {
34585c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
34595c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.packageName, resultData,
34605c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                        resultTo.getUriPermissionsLocked());
34615c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            }
34625c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
34635c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn                                     resultData);
34645c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            r.resultTo = null;
34655c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        }
34665c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
34675c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
34685c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // Make sure this HistoryRecord is not holding on to other resources,
34695c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // because clients have remote IPC references to this object so we
34705c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        // can't assume that will go away and want to avoid circular IPC refs.
34715c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.results = null;
34725c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.pendingResults = null;
34735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.newIntents = null;
34745c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        r.icicle = null;
34755c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    }
34765c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn
347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if this activity has been removed from the history
347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * list, or false if it is still in the list and will be removed later.
348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean finishActivityLocked(ActivityRecord r, int index,
348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int resultCode, Intent resultData, String reason) {
348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Duplicate finish request for " + r);
348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
348894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        r.makeFinishing();
348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName, reason);
349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < (mHistory.size()-1)) {
34930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord next = mHistory.get(index+1);
349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next.task == r.task) {
349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.frontOfTask) {
349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // The next activity is now the front of the task.
349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.frontOfTask = true;
349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) {
350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If the caller asked that this activity (and all above it)
350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // be cleared when the task is reset, don't lose that information,
350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // but propagate it up to the next activity.
350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.pauseKeyDispatchingLocked();
350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack) {
351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mService.mFocusedActivity == r) {
351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.setFocusedActivityLocked(topRunningActivityLocked(null));
351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
35155c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn        finishActivityResultsLocked(r, resultCode, resultData);
351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean endTask = index <= 0
35260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    || (mHistory.get(index-1)).task != r.task;
352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_TRANSITION) Slog.v(TAG,
352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Prepare close transition: finishing " + r);
352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mWindowManager.prepareAppTransition(endTask
353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
35317da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Tell window manager to prepare for this one to be removed.
3534be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.setAppVisibility(r.appToken, false);
353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3536621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn            if (mPausingActivity == null) {
353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                startPausingLocked(false, false);
354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else if (r.state != ActivityState.PAUSING) {
354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If the activity is PAUSING, we will complete the finish once
354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it is done pausing; else we can just directly finish it here.
354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return finishCurrentActivityLocked(r, index,
354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    FINISH_AFTER_PAUSE) == null;
354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return false;
355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_IMMEDIATELY = 0;
355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_PAUSE = 1;
355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static final int FINISH_AFTER_VISIBLE = 2;
355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int mode) {
3561be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        final int index = indexOfActivityLocked(r);
356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (index < 0) {
356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return null;
356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return finishCurrentActivityLocked(r, index, mode);
356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int index, int mode) {
357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // First things first: if this activity is currently visible,
357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // and the resumed activity is not yet visible, then hold off on
357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // finishing until the resumed one becomes visible.
357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {
357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (!mStoppingActivities.contains(r)) {
357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mStoppingActivities.add(r);
357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mStoppingActivities.size() > 3) {
357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // If we already have a few activities waiting to stop,
357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // then give up on things going idle and start clearing
358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // them out.
358180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn                    scheduleIdleLocked();
35824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                } else {
35834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn                    checkReadyForSleepLocked();
358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
358550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
3586ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
3587ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (finish requested)");
358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.STOPPING;
358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.updateOomAdjLocked();
359050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return r;
359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
359250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
359350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // make sure the record is cleaned out of other places.
359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mStoppingActivities.remove(r);
35954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        mGoingToSleepActivities.remove(r);
359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
359950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final ActivityState prevState = r.state;
3601ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r);
360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.state = ActivityState.FINISHING;
360350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
360450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mode == FINISH_IMMEDIATELY
360550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.STOPPED
360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                || prevState == ActivityState.INITIALIZING) {
360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // If this activity is already stopped, we can just finish
360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // it right now.
360928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            return destroyActivityLocked(r, true, true, "finish-imm") ? null : r;
361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Need to go through the full pause cycle to get this
361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // activity into the stopped state and then finish it.
361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mFinishingActivities.add(r);
361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            resumeTopActivityLocked(null);
361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return r;
361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform the common clean-up of an activity record.  This is called both
362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * as part of destroyActivityLocked() (when destroying the client-side
362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * representation) and cleaning things up as a result of its hosting
362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * processing going away, in which case there is no remaining client-side
362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * state to destroy so only the cleanup here is needed.
362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
3627ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices,
3628ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            boolean setState) {
362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mResumedActivity == r) {
363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mResumedActivity = null;
363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mFocusedActivity == r) {
363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mFocusedActivity = null;
363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configDestroy = false;
363750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.frozenBeforeDestroy = false;
363850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3639ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        if (setState) {
3640ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
3641ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            r.state = ActivityState.DESTROYED;
3642ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3643ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
364450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Make sure this record is no longer in the pending finishes list.
364550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // This could happen, for example, if we are trimming activities
364650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // down to the max limit while they are still waiting to finish.
364750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mFinishingActivities.remove(r);
364850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mWaitingVisibleActivities.remove(r);
364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Remove any pending results.
365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing && r.pendingResults != null) {
365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                PendingIntentRecord rec = apr.get();
365450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (rec != null) {
365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.cancelIntentSenderLocked(rec, false);
365650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.pendingResults = null;
365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
366050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
366150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (cleanServices) {
366250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
366450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mService.mPendingThumbnails.size() > 0) {
366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // There are clients waiting to receive thumbnails so, in case
366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // this is an activity that someone is waiting for, add it
366850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // to the pending list so we can correctly update the clients.
366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mService.mCancelledThumbnails.add(r);
367050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
367150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
367250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Get rid of any pending idle timeouts.
367350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
36750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
36762a29b3ad1350785aedea3442b38042885533576cDianne Hackborn        r.finishLaunchTickingLocked();
367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
36795c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn    final void removeActivityFromHistoryLocked(ActivityRecord r) {
368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.state != ActivityState.DESTROYED) {
36815c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn            finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
368294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            r.makeFinishing();
368398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            if (DEBUG_ADD_REMOVE) {
368498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                RuntimeException here = new RuntimeException("here");
368598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                here.fillInStackTrace();
368698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                Slog.i(TAG, "Removing activity " + r + " from stack");
368798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn            }
368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            mHistory.remove(r);
3689f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn            r.takeFromHistory();
3690ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3691ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    + " (removed from history)");
369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.state = ActivityState.DESTROYED;
3693be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            mService.mWindowManager.removeAppToken(r.appToken);
369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (VALIDATE_TOKENS) {
3695be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                validateAppTokensLocked();
369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            cleanUpActivityServicesLocked(r);
369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.removeUriPermissionsLocked();
369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Perform clean-up of service connections in an activity record.
370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void cleanUpActivityServicesLocked(ActivityRecord r) {
370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Throw away any services that have been bound by this activity.
370750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.connections != null) {
370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Iterator<ConnectionRecord> it = r.connections.iterator();
370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            while (it.hasNext()) {
371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                ConnectionRecord c = it.next();
371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.removeConnectionLocked(c, null, r);
371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.connections = null;
371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
371728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) {
3718ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
3719ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            ActivityRecord r = mHistory.get(i);
3720ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (owner != null && r.app != owner) {
3721ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                continue;
3722ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3723ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // We can destroy this one if we have its icicle saved and
3724ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it is not in the process of pausing/stopping/finishing.
3725ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (r.app != null && r.haveState && !r.visible && r.stopped && !r.finishing
3726ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYING
3727ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    && r.state != ActivityState.DESTROYED) {
372828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, oomAdj, "trim");
3729ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
3730ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        }
3731ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    }
3732ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Destroy the current CLIENT SIDE instance of an activity.  This may be
373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * called both when actually finishing an activity, or when performing
373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * a configuration switch where we destroy the current client-side object
373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * but then create a new client-side object for this same HistoryRecord.
373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean destroyActivityLocked(ActivityRecord r,
374028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            boolean removeFromApp, boolean oomAdj, String reason) {
374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(
374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing activity: token=" + r
374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn              + ", app=" + (r.app != null ? r.app.processName : "(null)"));
374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r),
374628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                r.task.taskId, r.shortComponentName, reason);
374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        boolean removedFromHistory = false;
374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3750ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        cleanUpActivityLocked(r, false, false);
375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final boolean hadApp = r.app != null;
375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (hadApp) {
375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (removeFromApp) {
375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                int idx = r.app.activities.indexOf(r);
375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (idx >= 0) {
375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    r.app.activities.remove(idx);
375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHeavyWeightProcess = null;
376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mHandler.sendEmptyMessage(
376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                            ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.app.activities.size() == 0) {
376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // No longer have activities, so update location in
376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    // LRU list.
3768ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    mService.updateLruProcessLocked(r.app, oomAdj, false);
376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            boolean skipDestroy = false;
377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
3776be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                        r.configChangeFlags);
377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (Exception e) {
377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // We can just ignore exceptions here...  if the process
378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // has crashed, our death notification will clean things
378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // up.
378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                //Slog.w(TAG, "Exception thrown during finish", e);
378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.finishing) {
378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removedFromHistory = true;
378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    skipDestroy = true;
378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.app = null;
379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.nowVisible = false;
379250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3793ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // If the activity is finishing, we need to wait on removing it
3794ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // from the list to give it a chance to do its cleanup.  During
3795ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // that time it may make calls back with its token so we need to
3796ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // be able to find it on the list and so we don't want to remove
3797ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it from the list yet.  Otherwise, we can just immediately put
3798ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // it in the destroyed state since we are not removing it from the
3799ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // list.
380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing && !skipDestroy) {
3801ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r
3802ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy requested)");
380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYING;
380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                msg.obj = r;
380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
3808ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3809ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (destroy skipped)");
381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // remove this record from the history.
381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.finishing) {
381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removeActivityFromHistoryLocked(r);
381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                removedFromHistory = true;
381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } else {
3818ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
3819ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                        + " (no app)");
382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.state = ActivityState.DESTROYED;
382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configChangeFlags = 0;
382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (!mLRUActivities.remove(r) && hadApp) {
382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
383050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return removedFromHistory;
383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void activityDestroyed(IBinder token) {
383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        synchronized (mService) {
3835be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            ActivityRecord r = ActivityRecord.forToken(token);
3836be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            if (r != null) {
3837be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
3838be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            }
383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3840be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            int index = indexOfActivityLocked(r);
384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (index >= 0) {
384250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (r.state == ActivityState.DESTROYING) {
384350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    final long origId = Binder.clearCallingIdentity();
384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    removeActivityFromHistoryLocked(r);
384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    Binder.restoreCallingIdentity(origId);
384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
385250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int i = list.size();
385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (localLOGV) Slog.v(
385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TAG, "Removing app " + app + " from list " + list
385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            + " with " + i + " entries");
385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (i > 0) {
385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            i--;
385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = (ActivityRecord)list.get(i);
385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "Record #" + i + " " + r + ": app=" + r.app);
386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.app == app) {
386250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing this entry!");
386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                list.remove(i);
386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
386550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
386750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    void removeHistoryRecordsForAppLocked(ProcessRecord app) {
386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mLRUActivities, app);
387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mStoppingActivities, app);
38714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn        removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app);
387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app);
387350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        removeHistoryRecordsForAppLocked(mFinishingActivities, app);
387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
387550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3876621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
3877621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * Move the current home activity's task (if one exists) to the front
3878621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * of the stack.
3879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
3880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    final void moveHomeToFrontLocked() {
3881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        TaskRecord homeTask = null;
3882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        for (int i=mHistory.size()-1; i>=0; i--) {
38830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord hr = mHistory.get(i);
3884621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            if (hr.isHomeActivity) {
3885621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                homeTask = hr.task;
388694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                break;
3887621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
3888621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (homeTask != null) {
3890621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            moveTaskToFrontLocked(homeTask, null);
3891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
3892621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
3893621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
3894621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
389550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) {
389650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int task = tr.taskId;
389950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int top = mHistory.size()-1;
390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
39010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (top < 0 || (mHistory.get(top)).task.taskId == task) {
390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // nothing to do!
390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return;
390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
390550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3906be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
390750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
390850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Applying the affinities may have removed entries from the history,
390950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // so get the size again.
391050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        top = mHistory.size()-1;
391150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = top;
391250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
391350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task up to the top
391450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
391550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos >= 0) {
39160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
391750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
391850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
391950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
392050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
392198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
392298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
392398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
392498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here);
392598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
392650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
392750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(top, r);
3928be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(0, r.appToken);
392950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                top--;
393050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
393150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos--;
393250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
393350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
393450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to front transition: task=" + tr);
393650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
393750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
39387da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
39397da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
394050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
394150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
394250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
394350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
394450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
39457da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
39467da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false);
394750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
394850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
394950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToTop(moved);
395050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
3951be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
395250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
395350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task);
395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
395750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
395850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void finishTaskMoveLocked(int task) {
395950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        resumeTopActivityLocked(null);
396050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
396250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Worker method for rearranging history stack.  Implements the function of moving all
396450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * activities for a specific task (gathering them if disjoint) into a single group at the
396550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * bottom of the stack.
396650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
396750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * If a watcher is installed, the action is preflighted and the watcher has an opportunity
396850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * to premeptively cancel the move.
396950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     *
397050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @param task The taskId to collect and move to the bottom.
397150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * @return Returns true if the move completed, false if not.
397250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
397350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean moveTaskToBackLocked(int task, ActivityRecord reason) {
397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Slog.i(TAG, "moveTaskToBack: " + task);
397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
397650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If we have a watcher, preflight the move before committing to it.  First check
397750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // for *other* available tasks, but if none are available, then try again allowing the
397850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // current task to be selected.
397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mMainStack && mService.mController != null) {
398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord next = topRunningActivityLocked(null, task);
398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next == null) {
398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                next = topRunningActivityLocked(null, 0);
398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (next != null) {
398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // ask watcher if this is allowed
398650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                boolean moveOK = true;
398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                try {
398850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    moveOK = mService.mController.activityResuming(next.packageName);
398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                } catch (RemoteException e) {
399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    mService.mController = null;
399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
399250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (!moveOK) {
399350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    return false;
399450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                }
399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
399650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
3998be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn        ArrayList<IBinder> moved = new ArrayList<IBinder>();
399950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
400050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_TRANSITION) Slog.v(TAG,
400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Prepare to back transition: task=" + task);
400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        final int N = mHistory.size();
400450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int bottom = 0;
400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        int pos = 0;
400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Shift all activities with this task down to the bottom
400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // of the stack, keeping them in the same internal order.
400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        while (pos < N) {
40100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord r = mHistory.get(pos);
401150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (localLOGV) Slog.v(
401250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                TAG, "At " + pos + " ckp " + r.task + ": " + r);
401350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r.task.taskId == task) {
401450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
401598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                if (DEBUG_ADD_REMOVE) {
401698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    RuntimeException here = new RuntimeException("here");
401798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    here.fillInStackTrace();
401898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                    Slog.i(TAG, "Removing and adding activity " + r + " to stack at "
401998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                            + bottom, here);
402098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn                }
402150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.remove(pos);
402250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mHistory.add(bottom, r);
4023be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                moved.add(r.appToken);
402450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                bottom++;
402550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
402650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            pos++;
402750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
402850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
402950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (reason != null &&
403050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
40317da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
40327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_NONE, false);
403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            ActivityRecord r = topRunningActivityLocked(null);
403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (r != null) {
403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mNoAnimActivities.add(r);
403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } else {
40387da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn            mService.mWindowManager.prepareAppTransition(
40397da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
404050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
404150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        mService.mWindowManager.moveAppTokensToBottom(moved);
404250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (VALIDATE_TOKENS) {
4043be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            validateAppTokensLocked();
404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
404550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        finishTaskMoveLocked(task);
404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
404950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
40500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) {
40510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
40520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
40530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (resumed != null && resumed.thumbHolder == tr) {
40540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
40550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        } else {
40560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            info.mainThumbnail = tr.lastThumbnail;
40570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return info;
40590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
40600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40619da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn    public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex,
40629da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            boolean taskRequired) {
40630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false);
40640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (info.root == null) {
40659da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
40669da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId);
40679da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
40680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
40690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex < 0) {
40720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            // Just remove the entire task.
40730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            performClearTaskAtIndexLocked(taskId, info.rootIndex);
40740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return info.root;
40750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (subTaskIndex >= info.subtasks.size()) {
40789da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            if (taskRequired) {
40799da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn                Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex);
40809da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn            }
40810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return null;
40820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
40830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // Remove all of this task's activies starting at the sub task.
40850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex);
40860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        performClearTaskAtIndexLocked(taskId, subtask.index);
40870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return subtask.activity;
40880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
40890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
40900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) {
40910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord resumed = mResumedActivity;
40920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final TaskAccessInfo thumbs = new TaskAccessInfo();
40930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        // How many different sub-thumbnails?
40940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        final int NA = mHistory.size();
40950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        int j = 0;
40960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ThumbnailHolder holder = null;
40970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
40980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
40990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (!ar.finishing && ar.task.taskId == taskId) {
41000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
41010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
41020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
41030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
41040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
41060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (j >= NA) {
41070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            return thumbs;
41080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
41100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.root = mHistory.get(j);
41110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.rootIndex = j;
41120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
41130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
41140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        thumbs.subtasks = subtasks;
41150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        ActivityRecord lastActivity = null;
41160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        while (j < NA) {
41170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            ActivityRecord ar = mHistory.get(j);
41180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            j++;
41190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.finishing) {
41200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                continue;
41210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
41220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.task.taskId != taskId) {
41230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                break;
41240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
41250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            lastActivity = ar;
41260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (ar.thumbHolder != holder && holder != null) {
41270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                thumbs.numSubThumbbails++;
41280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                holder = ar.thumbHolder;
41290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask();
41300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = holder.lastThumbnail;
41310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.activity = ar;
41320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.index = j-1;
41330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                subtasks.add(sub);
41340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
41350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (lastActivity != null && subtasks.size() > 0) {
41370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            if (resumed == lastActivity) {
41380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1);
41390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity);
41400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            }
41410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (thumbs.numSubThumbbails > 0) {
41430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            thumbs.retriever = new IThumbnailRetriever.Stub() {
41440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                public Bitmap getThumbnail(int index) {
41450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    if (index < 0 || index >= thumbs.subtasks.size()) {
41460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                        return null;
41470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    }
41480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                    return thumbs.subtasks.get(index).thumbnail;
41490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                }
41500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            };
41510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
41520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        return thumbs;
41530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn    }
41540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
415550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final void logStartActivity(int tag, ActivityRecord r,
415650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            TaskRecord task) {
415750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(tag,
415850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                System.identityHashCode(r), task.taskId,
415950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.shortComponentName, r.intent.getAction(),
416050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getType(), r.intent.getDataString(),
416150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.intent.getFlags());
416250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
416350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
416450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    /**
416550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * Make sure the given activity matches the current configuration.  Returns
416650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * false if the activity had to be destroyed.  Returns true if the
416750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * configuration is the same, or the activity will remain running as-is
416850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * for whatever reason.  Ensures the HistoryRecord is updated with the
416950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     * correct configuration and all other bookkeeping is handled.
417050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn     */
417150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    final boolean ensureActivityConfigurationLocked(ActivityRecord r,
417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int globalChanges) {
417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (mConfigWillChange) {
417450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
417550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Skipping config check (will change): " + r);
417650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
417750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
417950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
418050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                "Ensuring correct configuration: " + r);
418150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
418250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Short circuit: if the two configurations are the exact same
418350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // object (the common case), then there is nothing to do.
418450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration newConfig = mService.mConfiguration;
4185e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if (r.configuration == newConfig && !r.forceNewConfig) {
418650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
418750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration unchanged in " + r);
418850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
418950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
419050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
419150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // We don't worry about activities that are finishing.
419250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.finishing) {
419350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
419450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter in finishing " + r);
419550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
419650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
419750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
419850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
419950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Okay we now are going to make this activity have the new config.
420050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // But then we need to figure out how it needs to deal with that.
420150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        Configuration oldConfig = r.configuration;
420250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.configuration = newConfig;
420358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
420458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Determine what has changed.  May be nothing, if this is a config
420558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // that has come back from the app after going idle.  In that case
420658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // we just want to leave the official config object now in the
420758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // activity and do nothing else.
420858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        final int changes = oldConfig.diff(newConfig);
420958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        if (changes == 0 && !r.forceNewConfig) {
421058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
421158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    "Configuration no differences in " + r);
421258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            return true;
421358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        }
421458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
421550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // If the activity isn't currently running, just leave the new
421650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration and it will pick that up next time it starts.
421750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app == null || r.app.thread == null) {
421850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                    "Configuration doesn't matter not running " + r);
422050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.stopFreezingScreenLocked(false);
4221e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
422250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return true;
422350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
422558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        // Figure out how to handle the changes between the configurations.
42263c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
42273c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
42283c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + Integer.toHexString(changes) + ", handles=0x"
4229e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn                    + Integer.toHexString(r.info.getRealConfigChanged())
42303c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                    + ", newConfig=" + newConfig);
42313c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn        }
4232e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn        if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) {
42333c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // Aha, the activity isn't handling the change, so DIE DIE DIE.
42343c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.configChangeFlags |= changes;
42353c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            r.startFreezingScreenLocked(r.app, globalChanges);
4236e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
42373c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            if (r.app == null || r.app.thread == null) {
42383c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42393c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is destroying non-running " + r);
424028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                destroyActivityLocked(r, true, false, "config");
42413c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.PAUSING) {
42423c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // A little annoying: we are waiting for this activity to
42433c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // finish pausing.  Let's not do anything now, but just
42443c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // flag that it needs to be restarted when done pausing.
42453c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42463c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is skipping already pausing " + r);
42473c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configDestroy = true;
42483c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                return true;
42493c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else if (r.state == ActivityState.RESUMED) {
42503c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Try to optimize this case: the configuration is changing
42513c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // and we need to restart the top, resumed activity.
42523c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // Instead of doing the normal handshaking, just say
42533c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                // "restart!".
42543c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42553c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is restarting resumed " + r);
42563c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, true);
42573c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
42583c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            } else {
42593c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
42603c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                        "Switch is restarting non-resumed " + r);
42613c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                relaunchActivityLocked(r, r.configChangeFlags, false);
42623c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn                r.configChangeFlags = 0;
426350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
42643c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn
42653c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // All done...  tell the caller we weren't able to keep this
42663c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            // activity around.
42673c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn            return false;
426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // Default case: the activity can handle this new configuration, so
427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // hand it over.  Note that we don't need to give it the new
427250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // configuration, since we always send configuration changes to all
427350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // process when they happen so it can just use whatever configuration
427450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        // it last got.
427550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (r.app != null && r.app.thread != null) {
427650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            try {
427750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
4278be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn                r.app.thread.scheduleActivityConfigurationChanged(r.appToken);
427950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            } catch (RemoteException e) {
428050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                // If process died, whatever.
428150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
428250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
428350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.stopFreezingScreenLocked(false);
428450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
428550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
428650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
428750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
428850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    private final boolean relaunchActivityLocked(ActivityRecord r,
428950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            int changes, boolean andResume) {
429050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<ResultInfo> results = null;
429150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        List<Intent> newIntents = null;
429250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
429350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            results = r.results;
429450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            newIntents = r.newIntents;
429550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
429650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
429750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " with results=" + results + " newIntents=" + newIntents
429850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                + " andResume=" + andResume);
429950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
430050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
430150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                r.task.taskId, r.shortComponentName);
430250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
430350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        r.startFreezingScreenLocked(r.app, 0);
430450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
430550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        try {
430650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r);
4307e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            r.forceNewConfig = false;
4308be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents,
4309813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn                    changes, !andResume, new Configuration(mService.mConfiguration));
431050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // Note: don't need to call pauseIfSleepingLocked() here, because
431150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // the caller will only pass in 'andResume' if this activity is
431250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            // currently resumed, which implies we aren't sleeping.
431350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        } catch (RemoteException e) {
431450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            return false;
431550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
431650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
431750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        if (andResume) {
431850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.results = null;
431950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            r.newIntents = null;
432050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            if (mMainStack) {
432150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn                mService.reportResumedActivityLocked(r);
432250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn            }
432350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        }
432450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn
432550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn        return true;
432650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn    }
432790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
432890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguardOnNextActivityLocked() {
432990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        mDismissKeyguardOnNextActivity = true;
433090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
433150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn}
4332