ActivityStack.java revision 5c607433e3d609e1a023adb496018fd1389a8ec8
150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/* 250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License. 650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at 750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and 1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License. 1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am; 1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity; 2050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl; 2150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity; 240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.ActivityManager; 2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals; 2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager; 270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever; 2850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_CLASS_NOT_FOUND; 2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_DELIVERED_TO_TOP; 3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_INTENT_NOT_RESOLVED; 3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_PERMISSION_DENIED; 3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_RETURN_INTENT_TO_CALLER; 3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SUCCESS; 3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SWITCHES_CANCELED; 3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_TASK_TO_FRONT; 3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread; 3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent; 3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo; 4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult; 4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName; 4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context; 4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender; 4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent; 4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender; 4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo; 4750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo; 4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager; 4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo; 5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration; 510aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources; 520aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 55ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException; 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack { 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 79b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn static final boolean DEBUG_STATES = false; 9098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn static final boolean DEBUG_ADD_REMOVE = false; 9198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn static final boolean DEBUG_SAVED_STATE = false; 92ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // How long we can hold the sleep wake lock before giving up. 1054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT = 5*1000; 1064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 10750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 115621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // disabled. 116621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1180dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1190dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1200dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1210dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); 148be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 149be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn /** 150be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn * Used for validating app tokens with window manager. 151be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn */ 152be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>(); 153be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>(); 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 1784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * List of activities that are in the process of going to sleep. 1794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 1804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn final ArrayList<ActivityRecord> mGoingToSleepActivities 1814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn = new ArrayList<ActivityRecord>(); 1824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 1834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2440dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2450dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2460dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2470dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2480dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 2654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * Set when we have taken too long waiting to go to sleep. 2664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 2674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn boolean mSleepTimeout = false; 2684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 26990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn /** 27090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn * Dismiss the keyguard after the next activity is displayed? 27190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn */ 27290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn boolean mDismissKeyguardOnNextActivity = false; 27390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 2740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailWidth = -1; 2750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailHeight = -1; 2760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 2774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT_MSG = 8; 27850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 27950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 28050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 28150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 28250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 28550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 28650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 2924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn case SLEEP_TIMEOUT_MSG: { 2938e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn synchronized (mService) { 2948e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (mService.isSleeping()) { 2958e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Slog.w(TAG, "Sleep timeout! Sleeping now."); 2968e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn mSleepTimeout = true; 2978e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn checkReadyForSleepLocked(); 2988e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 2994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 3004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } break; 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 302be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 305be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + r); 306be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityPaused(r != null ? r.appToken : null, true); 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 318be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 319be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + r); 320be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityIdleInternal(r != null ? r.appToken : null, true, null); 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 323be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 326be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + r); 327be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityDestroyed(r != null ? r.appToken : null); 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 330be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 331be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityIdleInternal(r != null ? r.appToken : null, false, null); 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 4030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 405be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) { 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 414be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mHistory.indexOf(ActivityRecord.forToken(token)); 415be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 416be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 417be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final int indexOfActivityLocked(ActivityRecord r) { 418be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mHistory.indexOf(r); 419ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 421ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final ActivityRecord isInStackLocked(IBinder token) { 422be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 423be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (mHistory.contains(r)) { 424be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return r; 425ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 426ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return null; 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn final void showAskCompatModeDialogLocked(ActivityRecord r) { 50836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn Message msg = Message.obtain(); 50936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG; 51036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.obj = r.task.askedCompatMode ? null : r; 51136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn mService.mHandler.sendMessage(msg); 51236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn } 51336cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 519be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 530be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.mayFreezeScreenLocked(app) ? r.appToken : null); 531813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn mService.updateConfigurationLocked(config, r, false, false); 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 5350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn app.waitingToKill = null; 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 5684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 569e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 57036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(r); 5718ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 57262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn String profileFile = null; 57362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor profileFd = null; 57462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean profileAutoStop = false; 57562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 57662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileProc == null || mService.mProfileProc == app) { 57762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.mProfileProc = app; 57862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile = mService.mProfileFile; 57962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = mService.mProfileFd; 58062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop = mService.mAutoStopProfiler; 58162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 58262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 583f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn app.hasShownUi = true; 584c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn app.pendingUiClean = true; 58562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFd != null) { 58662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn try { 58762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = profileFd.dup(); 58862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } catch (IOException e) { 58962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = null; 59062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 59162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 592be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 593813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn System.identityHashCode(r), r.info, 594813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn new Configuration(mService.mConfiguration), 59558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn r.compat, r.icicle, results, newIntents, !andResume, 59662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.isNextTransitionForward(), profileFile, profileFd, 59762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop); 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59954e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 627be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 648ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r 649ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting new instance)"); 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 65388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 65488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(r.task); 65588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 6574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 65898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle); 65998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn r.icicle = null; 66098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn r.haveState = false; 66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 666ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 667ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting in stopped state)"); 66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6890dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 6900dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 6920dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 7006c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn app.addPackage(r.info.packageName); 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void stopIfSleepingLocked() { 7174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 7254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG); 7274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT); 7284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void awakeFromSleepingLocked() { 7334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mSleepTimeout = false; 7354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 7364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 7374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Ensure activities are no longer sleeping. 7394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(false); 7424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.clear(); 7444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void activitySleptLocked(ActivityRecord r) { 7474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 7484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void checkReadyForSleepLocked() { 7524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 7534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Do not care. 7544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mSleepTimeout) { 7584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mResumedActivity != null) { 7594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still have something resumed; can't sleep until it is paused. 7604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity); 76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 7634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mPausingActivity != null) { 7664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still waiting for something to pause; can't sleep yet. 7674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity); 7684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mStoppingActivities.size() > 0) { 7724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to stop; can't sleep yet. 7734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 7744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mStoppingActivities.size() + " activities"); 77580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 7764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn ensureActivitiesVisibleLocked(null, 0); 7804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Make sure any stopped but visible activities are now sleeping. 7824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // This ensures that the activity's onStop() is called. 7834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) { 7864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 7874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleepActivities.size() > 0) { 7914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to sleep; can't sleep yet. 7924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 7934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mGoingToSleepActivities.size() + " activities"); 7944eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 7974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 8014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 8024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.mShuttingDown) { 8044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mService.notifyAll(); 8054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 808d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn public final Bitmap screenshotActivities(ActivityRecord who) { 809ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn if (who.noDisplay) { 810ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn return null; 811ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn } 812ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn 8130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Resources res = mService.mContext.getResources(); 8140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int w = mThumbnailWidth; 8150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int h = mThumbnailHeight; 8160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w < 0) { 8170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailWidth = w = 8180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width); 8190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailHeight = h = 8200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height); 8210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 8230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w > 0) { 824be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mService.mWindowManager.screenshotApplications(who.appToken, w, h); 8250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 8270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 842ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev); 843ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 84750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 849f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn prev.updateThumbnail(screenshotActivities(prev), null); 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 859be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing, 860be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn userLeaving, prev.configChangeFlags); 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final void activityPaused(IBinder token, boolean timeout) { 91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 9150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn TAG, "Activity paused: token=" + token + ", timeout=" + timeout); 91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 92050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 9220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(index); 92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 925ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r 926ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + (timeout ? " (due to timeout)" : " (pause complete)")); 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 939ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail, 940ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn CharSequence description) { 94198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle); 942ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.icicle = icicle; 943ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.haveState = true; 944ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.updateThumbnail(thumbnail, description); 945ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.stopped = true; 946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)"); 947ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.STOPPED; 948ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (!r.finishing) { 949ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.configDestroy) { 95028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "stop-config"); 951ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn resumeTopActivityLocked(null); 95250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn } else { 95350685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn // Now that this process has stopped, we may want to consider 95450685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn // it to be the previous app to try to keep around in case 95550685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn // the user wants to return to it. 95650685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn ProcessRecord fgApp = null; 95750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn if (mResumedActivity != null) { 95850685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn fgApp = mResumedActivity.app; 95950685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn } else if (mPausingActivity != null) { 96050685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn fgApp = mPausingActivity.app; 96150685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn } 96250685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 96350685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 96450685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn && r.app != mService.mHomeProcess) { 96550685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn mService.mPreviousProcess = r.app; 96650685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 96750685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn } 968ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 969ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 970ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 971ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 99528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(prev, true, false, "pause-config"); 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 100380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 10044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 10054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 10184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1076f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn next.clearThumbnail(); 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 11170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 1148be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 1172be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 11734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 1174905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn r.app.pendingUiClean = true; 1175be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleWindowVisibility(r.appToken, true); 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 12020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 1214be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 1220be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleWindowVisibility(r.appToken, false); 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 13044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(next); 13054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13170dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 13180dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 13190dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1320034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1321034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1322034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1323034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1324034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1325034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1326034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1327034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1328034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1329034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1330034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1331034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1332034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1333034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1334034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1335034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1336034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1337034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1338034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1339034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 13400dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1341034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 13420dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 13430dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13440dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13450dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 1370be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1384e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // Launching this app's activity, make sure the app is no longer 1385e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // considered stopped. 1386e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn try { 1387e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 1388e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn next.packageName, false); 1389e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } catch (RemoteException e1) { 1390a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn } catch (IllegalArgumentException e) { 1391a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 1392a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn + next.packageName + ": " + e); 1393e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 1394e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 14037da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14047da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 14087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1410be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev.appToken); 1411be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 14167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 14217da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 1425be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev.appToken); 1426be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 14327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14337da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 14357da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14367da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); 143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 1444be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(next.appToken, true); 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1451ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)"); 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 145450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 145588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 145688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(next.task); 145788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 1468be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next.appToken : null); 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1472813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn updated = mService.updateConfigurationLocked(config, next, false, false); 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 1507be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleSendResult(next.appToken, a); 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 1512be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next.appToken); 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 152036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(next); 1521905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn next.app.pendingUiClean = true; 1522be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleResumeActivity(next.appToken, 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 1529ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to " 1530ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + lastState + ": " + next); 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1539be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.appToken, next.packageName, next.theme, 15402f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 15412f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15437eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15447eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 1560be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 156698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next); 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1578be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.appToken, next.packageName, next.theme, 15792f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 15802f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15827eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15837eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 15947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean doResume, boolean keepCurTransition) { 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 16030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 161398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 161498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 161598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 161698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, 161798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here); 161898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1620f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 1621be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId, 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 1624be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 16390dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 165198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 165298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 165398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 165498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here); 165598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1657f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 16747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 16757da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 16797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition); 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 16847da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); 168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 1688be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen); 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1716be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.appToken, r.packageName, r.theme, 17172f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 17182f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r.info.applicationInfo), r.nonLocalizedLabel, 1719be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.labelRes, r.icon, r.windowFlags, 1720be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn prev != null ? prev.appToken : null, showStartingIcon); 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 1725be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId, 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 1729be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1737be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final void validateAppTokensLocked() { 1738be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.clear(); 1739be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.ensureCapacity(mHistory.size()); 1740be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn for (int i=0; i<mHistory.size(); i++) { 1741be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.add(mHistory.get(i).appToken); 1742be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 1743be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.validateAppTokens(mValidateAppTokens); 1744be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 1745be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 1754621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (ACTIVITY_INACTIVE_RESET_TIME > 0 1755621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 17730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord below = i >= 0 ? mHistory.get(i) : null; 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 18270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(0); 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 1833f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(p.task, p.thumbHolder, false); 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1841f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(new TaskRecord(mService.mCurTask, target.info, null), 1842f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn null, false); 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1847be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(target.appToken, task.taskId); 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 1852f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ThumbnailHolder curThumbHolder = target.thumbHolder; 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 18540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 1860f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(target.task, curThumbHolder, false); 1861f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn curThumbHolder = p.thumbHolder; 186298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 186398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 186498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 186598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + p + " to stack at " 186698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + dstPos, here); 186798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 1870be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p.appToken); 1871be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId); 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 1874be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 18970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn (mHistory.get( 189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 19070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1935ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn 1936ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn } else if (target.resultTo != null && (below == null 1937ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn || below.task == target.task)) { 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 1967ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index " 1968ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + targetI + " to " + replyChainEnd); 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 19700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1987ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index " 1988ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + targetI + " to " + replyChainEnd); 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 19900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(srcPos); 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 200098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 200198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 200298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 200398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + p + " to stack at " 200498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + lastReparentPos, here); 200598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 2007f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(task, null, false); 200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 2010ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + " from " + srcPos + " to " + lastReparentPos 201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 2012be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken); 2013be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId); 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 2015be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 20260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(j); 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2040ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn 2041ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn } else if (below != null && below.task != target.task) { 2042ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn // We hit the botton of a task; the reply chain can't 2043ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn // pass through it. 2044ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn replyChainEnd = -1; 204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 2062621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * @return Returns the old activity that should be continued to be used, 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 2066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord newR, int launchFlags) { 206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 20720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 20820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 2092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 2093621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 20940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 2095621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2096621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2097621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2098621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2099621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2100621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2101621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 2102621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 2103621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 2113be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn int index = indexOfTokenLocked(ret.appToken); 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * Completely remove all activities associated with an existing 21310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * task starting at a specified index. 21320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn */ 21330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private final void performClearTaskAtIndexLocked(int taskId, int i) { 2134eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn while (i < mHistory.size()) { 21350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 21360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.task.taskId != taskId) { 21370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Whoops hit the end. 21380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return; 21390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 21400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.finishing) { 21410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 21420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 21430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 21440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED, 21450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn null, "clear")) { 21460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 21470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 21480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 21490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 21500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 21510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn /** 2152621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Completely remove all activities associated with an existing task. 2153621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 2154621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn private final void performClearTaskLocked(int taskId) { 2155621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int i = mHistory.size(); 2156621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2157621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // First find the requested task. 2158621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2159621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 21600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2161621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId == taskId) { 2162621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 2163621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2164621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2165621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2166621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 21670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Now find the start and clear it. 2168621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2169621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 21700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2171621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2172621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2173621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2174621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2175621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // We hit the bottom. Now finish it all... 21760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, i+1); 2177621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 2178621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2179621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2180621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2181621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2182621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 21900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord candidate = mHistory.get(i); 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 22070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord newTop = mHistory.remove(where); 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 22090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord oldTop = mHistory.get(top-1); 221098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 221198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 221298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 221398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at " 221498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + top, here); 221598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 2228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity) { 2229efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2230efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn int err = START_SUCCESS; 2231efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2232efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn ProcessRecord callerApp = null; 2233efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (caller != null) { 2234efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 2235efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (callerApp != null) { 2236efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingPid = callerApp.pid; 2237efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingUid = callerApp.info.uid; 2238efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } else { 2239efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 2240efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 2241efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + intent.toString()); 2242efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn err = START_PERMISSION_DENIED; 2243efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2244efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2245efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2246efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS) { 224790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn Slog.i(TAG, "START {" + intent.toShortString(true, true, true) + "} from pid " 2248efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + (callerApp != null ? callerApp.pid : callingPid)); 2249efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 225698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn TAG, "Will send result to " + resultTo + " (index " + index + ")"); 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 22580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sourceRecord = mHistory.get(index); 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2284efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS && intent.getComponent() == null) { 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 23076c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn callingUid, aInfo.applicationInfo.uid, aInfo.exported); 230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 231490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 23156c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn String msg; 23166c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn if (!aInfo.exported) { 23176c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 23186c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 23196c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 23206c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " not exported from uid " + aInfo.applicationInfo.uid; 23216c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } else { 23226c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 23236c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 23246c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 23256c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " requires " + aInfo.permission; 23266c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } 232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 233050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 233150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 233350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 235290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 2361621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (outActivity != null) { 2362621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn outActivity[0] = r; 2363621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 237690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 239790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mDismissKeyguardOnNextActivity && mPausingActivity == null) { 239890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // Someone asked to have the keyguard dismissed on the next 239990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // activity start, but we are not actually doing an activity 240090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // switch... just dismiss the keyguard now, because we 240190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // probably want to see whatever is behind it. 240290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 240390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 240490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 240590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn return err; 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2408621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontFromLaunchLocked(int launchFlags) { 2409621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2410621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2411621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2412621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Caller wants to appear on home activity, so before starting 2413621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // their own activity we will bring home to the front. 2414621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontLocked(); 2415621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2416621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2417621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 2491621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord reuseTask = null; 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 252266a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru if (curTop != null && curTop.task != taskTop.task) { 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 2529621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2548621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2549621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 2550621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 2551621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // The caller has requested to completely replace any 25527da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // existing task with its new activity. Well that should 2553621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // not be too hard... 2554621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask = taskTop.task; 2555621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn performClearTaskLocked(taskTop.task.taskId); 2556621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask.setIntent(r.intent, r.info); 2557621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2565621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn taskTop.task.taskId, r, launchFlags); 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 257539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2626621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (!addingToTask && reuseTask == null) { 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 26857da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean keepCurTransition = false; 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2690621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (reuseTask == null) { 2691621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // todo: should do better management of integers. 2692621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask++; 2693621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mService.mCurTask <= 0) { 2694621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask = 1; 2695621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2696f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true); 2697621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 2698621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " in new task " + r.task); 2699621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2700f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(reuseTask, reuseTask, true); 270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 2703621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2712621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn sourceRecord.task.taskId, r, launchFlags); 27137da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn keepCurTransition = true; 271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 271639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 273339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 2743f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false); 274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 27530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn N > 0 ? mHistory.get(N-1) : null; 2754f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(prev != null 2755621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ? prev.task 2756f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent), null, true); 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 276139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 276239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 276339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 27647e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 276539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 276639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 276739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 276839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 27697e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 277039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 27757da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn startActivityLocked(r, newTask, doResume, keepCurTransition); 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 277962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo resolveActivity(Intent intent, String resolvedType, boolean debug, 278062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn String profileFile, ParcelFileDescriptor profileFd, boolean autoStopProfiler) { 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 280962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFile != null) { 281062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (!aInfo.processName.equals("system")) { 281162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 281262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile, profileFd, autoStopProfiler); 281362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 281462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2816621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return aInfo; 2817621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2818621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2819621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, int callingUid, 2820621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 2821621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int grantedMode, IBinder resultTo, 2822621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 282362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean debug, String profileFile, ParcelFileDescriptor profileFd, 282462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean autoStopProfiler, WaitResult outResult, Configuration config) { 2825621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2826621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2827621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2828621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2829621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2830621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2831621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2832621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2833621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2834621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2835621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 283662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedType, debug, 283762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile, profileFd, autoStopProfiler); 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 2841621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2842621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2843621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 285854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 2882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn realCallingUid, null, null, 0, new Intent[] { intent }, 2883621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 2928621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn onlyIfNeeded, componentSpecified, null); 292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 2940813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn mService.updateConfigurationLocked(config, null, false, false); 294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2951ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2967ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2979621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivities(IApplicationThread caller, int callingUid, 2980621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent[] intents, String[] resolvedTypes, IBinder resultTo) { 2981621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents == null) { 2982621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("intents is null"); 2983621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2984621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (resolvedTypes == null) { 2985621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("resolvedTypes is null"); 2986621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2987621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents.length != resolvedTypes.length) { 2988621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("intents are length different than resolvedTypes"); 2989621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2990621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2991621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord[] outActivity = new ActivityRecord[1]; 2992621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2993621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int callingPid; 2994621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2995621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2996621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 2997621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = Binder.getCallingPid(); 2998621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingUid = Binder.getCallingUid(); 2999621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 3000621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = callingUid = -1; 3001621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3002621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 3003621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn try { 3004621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn synchronized (mService) { 3005621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3006621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=0; i<intents.length; i++) { 3007621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent = intents[i]; 3008621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent == null) { 3009621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 3010621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3011621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3012621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 3013621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 3014621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 3015621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3016621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3017621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 3018621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3019621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 3020621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 3021621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3022621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 302362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], false, 302462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn null, null, false); 3025621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3026621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags 3027621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 3028621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException( 3029621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "FLAG_CANT_SAVE_STATE not supported here"); 3030621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3031621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3032621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedTypes[i], 3033621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, 0, aInfo, resultTo, null, -1, callingPid, callingUid, 3034621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn false, componentSpecified, outActivity); 3035621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (res < 0) { 3036621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return res; 3037621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3038621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3039be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 3040621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3041621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3042621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } finally { 3043621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Binder.restoreCallingIdentity(origId); 3044621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3045621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3046621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return IActivityManager.START_SUCCESS; 3047621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3048621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 307490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 307590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mDismissKeyguardOnNextActivity) { 307690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 307790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 307890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 30867e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 3097be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleSendResult(r.appToken, list); 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 3112be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 3124ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3125ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (stop requested)"); 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 3130be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3132be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags); 31334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 31344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 31354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 3143ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r); 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 314628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "stop-except"); 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 3177be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(s.appToken, false); 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if ((!s.waitingVisible || mService.isSleeping()) && remove) { 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn final void scheduleIdleLocked() { 319680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn Message msg = Message.obtain(); 319780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn msg.what = IDLE_NOW_MSG; 319880a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn mHandler.sendMessage(msg); 319980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn } 320080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn 320162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout, 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityRecord res = null; 320662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 3218be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 3219be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (r != null) { 3220be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 3224be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn int index = indexOfActivityLocked(r); 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 322662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn res = r; 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 326329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mService.mBooted) { 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 332128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "finish-idle"); 332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 334362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn return res; 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 335398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 335498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn TAG, "Finishing activity @" + index + ": token=" + token 335598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 33655c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) { 33665c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // send the result 33675c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn ActivityRecord resultTo = r.resultTo; 33685c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (resultTo != null) { 33695c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 33705c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 33715c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 33725c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 33735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 33745c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.packageName, resultData, 33755c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.getUriPermissionsLocked()); 33765c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 33775c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 33785c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultData); 33795c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.resultTo = null; 33805c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 33815c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 33825c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn 33835c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 33845c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // because clients have remote IPC references to this object so we 33855c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 33865c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.results = null; 33875c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.pendingResults = null; 33885c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.newIntents = null; 33895c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.icicle = null; 33905c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 33915c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 34080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord next = mHistory.get(index+1); 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 34305c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn finishActivityResultsLocked(r, resultCode, resultData); 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 34410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn || (mHistory.get(index-1)).task != r.task; 344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 34467da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); 344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 3449be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 3476be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final int index = indexOfActivityLocked(r); 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 349680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 34974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 34984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3501ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3502ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (finish requested)"); 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 35104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 3516ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r); 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 352428695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn return destroyActivityLocked(r, true, true, "finish-imm") ? null : r; 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 3542ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices, 3543ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean setState) { 354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3554ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (setState) { 3555ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)"); 3556ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.DESTROYED; 3557ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3558ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 358150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 358250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 358350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 358550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 358650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 358750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 35900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 359250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 35935c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn final void removeActivityFromHistoryLocked(ActivityRecord r) { 359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 35955c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); 359694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 359798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 359898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 359998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 360098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing activity " + r + " from stack"); 360198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 3603f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.takeFromHistory(); 3604ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3605ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (removed from history)"); 360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 3607be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.removeAppToken(r.appToken); 360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 3609be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 362850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 363128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) { 3632ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 3633ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = mHistory.get(i); 3634ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (owner != null && r.app != owner) { 3635ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn continue; 3636ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3637ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // We can destroy this one if we have its icicle saved and 3638ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it is not in the process of pausing/stopping/finishing. 3639ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.app != null && r.haveState && !r.visible && r.stopped && !r.finishing 3640ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYING 3641ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYED) { 364228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, oomAdj, "trim"); 3643ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3644ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3645ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3646ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 364750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 364850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 365428695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn boolean removeFromApp, boolean oomAdj, String reason) { 365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 365650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 366028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn r.task.taskId, r.shortComponentName, reason); 366150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 366250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3664ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn cleanUpActivityLocked(r, false, false); 366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 366850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 367050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 367150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 367250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 367350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 367550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 367950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 368150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 3682ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn mService.updateLruProcessLocked(r.app, oomAdj, false); 368350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 368750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 368950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 3690be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing, 369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3707ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // If the activity is finishing, we need to wait on removing it 3708ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // from the list to give it a chance to do its cleanup. During 3709ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // that time it may make calls back with its token so we need to 3710ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // be able to find it on the list and so we don't want to remove 3711ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it from the list yet. Otherwise, we can just immediately put 3712ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it in the destroyed state since we are not removing it from the 3713ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // list. 371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 3715ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r 3716ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy requested)"); 371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3722ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3723ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy skipped)"); 372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3732ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3733ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (no app)"); 373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 3749be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 3750be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (r != null) { 3751be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 3752be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3754be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn int index = indexOfActivityLocked(r); 375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 37854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app); 378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3790621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 3791621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Move the current home activity's task (if one exists) to the front 3792621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * of the stack. 3793621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 3794621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontLocked() { 3795621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord homeTask = null; 3796621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 37970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord hr = mHistory.get(i); 3798621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (hr.isHomeActivity) { 3799621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn homeTask = hr.task; 380094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn break; 3801621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3802621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3803621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (homeTask != null) { 3804621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveTaskToFrontLocked(homeTask, null); 3805621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3806621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3807621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3808621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (top < 0 || (mHistory.get(top)).task.taskId == task) { 381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3820be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ArrayList<IBinder> moved = new ArrayList<IBinder>(); 382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 38300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 383598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 383698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 383798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 383898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here); 383998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 3842be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn moved.add(0, r.appToken); 384350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 38527da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38537da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 38597da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38607da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false); 386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 386250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 3865be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 386750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 387150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 387350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 387550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 387650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 387750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 387850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 387950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 388150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 388250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 388350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 388450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 388550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 388750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 388950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 389050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 389150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 389350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 389550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 389650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 389950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 390150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 390550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 390650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 390750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 390850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 390950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 391050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 391150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3912be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ArrayList<IBinder> moved = new ArrayList<IBinder>(); 391350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 391450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 391550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 391650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 391750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 391850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 391950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 392050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 392150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 392250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 392350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 39240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 392550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 392650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 392750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 392850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 392998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 393098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 393198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 393298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + r + " to stack at " 393398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + bottom, here); 393498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 393650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 3937be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn moved.add(r.appToken); 393850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 393950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 394050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 394150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 394250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 394350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 394450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 39457da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 39467da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 394750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 394850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 394950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 395050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 395150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 39527da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 39537da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); 395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 3957be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 395850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 395950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 396050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 396250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) { 39650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true); 39660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 39670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed != null && resumed.thumbHolder == tr) { 39680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = resumed.stack.screenshotActivities(resumed); 39690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 39700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = tr.lastThumbnail; 39710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info; 39730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex) { 39760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false); 39770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (info.root == null) { 39780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId); 39790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex < 0) { 39830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Just remove the entire task. 39840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, info.rootIndex); 39850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info.root; 39860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex >= info.subtasks.size()) { 39890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex); 39900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Remove all of this task's activies starting at the sub task. 39940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex); 39950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, subtask.index); 39960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return subtask.activity; 39970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) { 40000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 40010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final TaskAccessInfo thumbs = new TaskAccessInfo(); 40020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // How many different sub-thumbnails? 40030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final int NA = mHistory.size(); 40040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn int j = 0; 40050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ThumbnailHolder holder = null; 40060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 40070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 40080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!ar.finishing && ar.task.taskId == taskId) { 40090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 40100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 40110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 40130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 40150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (j >= NA) { 40160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 40170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 40190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.root = mHistory.get(j); 40200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.rootIndex = j; 40210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 40220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>(); 40230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.subtasks = subtasks; 40240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord lastActivity = null; 40250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 40260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 40270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 40280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.finishing) { 40290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 40300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.task.taskId != taskId) { 40320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 40330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastActivity = ar; 40350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.thumbHolder != holder && holder != null) { 40360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.numSubThumbbails++; 40370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 40380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask(); 40390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = holder.lastThumbnail; 40400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.activity = ar; 40410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.index = j-1; 40420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn subtasks.add(sub); 40430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastActivity != null && subtasks.size() > 0) { 40460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed == lastActivity) { 40470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1); 40480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity); 40490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (thumbs.numSubThumbbails > 0) { 40520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.retriever = new IThumbnailRetriever.Stub() { 40530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public Bitmap getThumbnail(int index) { 40540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (index < 0 || index >= thumbs.subtasks.size()) { 40550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 40560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs.subtasks.get(index).thumbnail; 40580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }; 40600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 40620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 40630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 406450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 406550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 406650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 406750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 406850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 406950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 407050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 407150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 407450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 407550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 407650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 408150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 408250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 408350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 408450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 408550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 408650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 408750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 408950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 409050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 409150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 409250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 409350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 4094e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (r.configuration == newConfig && !r.forceNewConfig) { 409550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 409650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 409750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 410050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 410150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 410250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 410350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 410450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 410550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 410650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 410750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 410850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 410950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 411050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 411150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 411258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn 411358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // Determine what has changed. May be nothing, if this is a config 411458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // that has come back from the app after going idle. In that case 411558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // we just want to leave the official config object now in the 411658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // activity and do nothing else. 411758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn final int changes = oldConfig.diff(newConfig); 411858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn if (changes == 0 && !r.forceNewConfig) { 411958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 412058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn "Configuration no differences in " + r); 412158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn return true; 412258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn } 412358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn 412450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 412550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 412650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 412750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 412850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 412950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 4130e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 413150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 413250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 413458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // Figure out how to handle the changes between the configurations. 41353c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 41363c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 41373c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 4138e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn + Integer.toHexString(r.info.getRealConfigChanged()) 41393c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + ", newConfig=" + newConfig); 41403c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } 4141e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) { 41423c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 41433c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags |= changes; 41443c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 4145e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 41463c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (r.app == null || r.app.thread == null) { 41473c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 41483c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is destroying non-running " + r); 414928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "config"); 41503c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 41513c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // A little annoying: we are waiting for this activity to 41523c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // finish pausing. Let's not do anything now, but just 41533c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // flag that it needs to be restarted when done pausing. 41543c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 41553c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is skipping already pausing " + r); 41563c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configDestroy = true; 41573c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return true; 41583c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 41593c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Try to optimize this case: the configuration is changing 41603c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // and we need to restart the top, resumed activity. 41613c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Instead of doing the normal handshaking, just say 41623c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // "restart!". 41633c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 41643c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting resumed " + r); 41653c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 41663c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 41673c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else { 41683c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 41693c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting non-resumed " + r); 41703c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 41713c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41733c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn 41743c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // All done... tell the caller we weren't able to keep this 41753c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // activity around. 41763c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return false; 417750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 417950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 418050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 418150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 418250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 418350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 418450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 418550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 418650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 4187be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r.appToken); 418850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 418950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 419050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 419150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 419250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 419350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 419450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 419550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 419650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 419750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 419850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 419950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 420050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 420150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 420250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 420350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 420450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 420550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 420650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 420750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 420850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 420950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 421050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 421150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 421250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 421350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 421450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 421550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 4216e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 4217be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents, 4218813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn changes, !andResume, new Configuration(mService.mConfiguration)); 421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 422050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 422150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 422250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 422350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 422550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 422650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 422750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 422850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 422950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 423050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 423150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 423450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 423790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn public void dismissKeyguardOnNextActivityLocked() { 423890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = true; 423990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 424050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 4241